diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.cc index b0a5e781a3..9b06b2501e 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.cc @@ -20,6 +20,7 @@ namespace webrtc { namespace rtcp { constexpr uint8_t Sdes::kPacketType; +constexpr size_t Sdes::kMaxNumberOfChunks; // Source Description (SDES) (RFC 3550). // // 0 1 2 3 diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h index 31366ad359..46382ac1a5 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h @@ -28,6 +28,7 @@ class Sdes : public RtcpPacket { std::string cname; }; static constexpr uint8_t kPacketType = 202; + static constexpr size_t kMaxNumberOfChunks = 0x1f; Sdes(); ~Sdes() override; @@ -48,8 +49,6 @@ class Sdes : public RtcpPacket { RtcpPacket::PacketReadyCallback* callback) const override; private: - static const size_t kMaxNumberOfChunks = 0x1f; - std::vector chunks_; size_t block_length_; }; diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc index 5f2eb759c9..56d991c80f 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc @@ -327,7 +327,10 @@ int32_t RTCPSender::AddMixedCNAME(uint32_t SSRC, const char* c_name) { RTC_DCHECK(c_name); RTC_DCHECK_LT(strlen(c_name), RTCP_CNAME_SIZE); rtc::CritScope lock(&critical_section_rtcp_sender_); - if (csrc_cnames_.size() >= kRtpCsrcSize) + // One spot is reserved for ssrc_/cname_. + // TODO(danilchap): Add support for more than 30 contributes by sending + // several sdes packets. + if (csrc_cnames_.size() >= rtcp::Sdes::kMaxNumberOfChunks - 1) return -1; csrc_cnames_[SSRC] = c_name; @@ -463,8 +466,8 @@ std::unique_ptr RTCPSender::BuildSDES( rtcp::Sdes* sdes = new rtcp::Sdes(); sdes->AddCName(ssrc_, cname_); - for (const auto it : csrc_cnames_) - sdes->AddCName(it.first, it.second); + for (const auto& it : csrc_cnames_) + RTC_CHECK(sdes->AddCName(it.first, it.second)); return std::unique_ptr(sdes); } diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc index 2eccadee84..c79cbb7483 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender_unittest.cc @@ -387,6 +387,19 @@ TEST_F(RtcpSenderTest, SendSdes) { EXPECT_EQ("alice@host", parser()->sdes()->chunks()[0].cname); } +TEST_F(RtcpSenderTest, SendSdesWithMaxChunks) { + rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize); + EXPECT_EQ(0, rtcp_sender_->SetCNAME("alice@host")); + const char cname[] = "smith@host"; + for (size_t i = 0; i < 30; ++i) { + const uint32_t csrc = 0x1234 + i; + EXPECT_EQ(0, rtcp_sender_->AddMixedCNAME(csrc, cname)); + } + EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSdes)); + EXPECT_EQ(1, parser()->sdes()->num_packets()); + EXPECT_EQ(31U, parser()->sdes()->chunks().size()); +} + TEST_F(RtcpSenderTest, SdesIncludedInCompoundPacket) { rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound); EXPECT_EQ(0, rtcp_sender_->SetCNAME("alice@host"));