Fix rtcp_sender to support sdes with 31 chunk

Previosly it supported up to only 15 chunks which is a limit for csrcs in an rtp packet.

BUG=None

Review-Url: https://codereview.webrtc.org/2758533002
Cr-Commit-Position: refs/heads/master@{#17274}
This commit is contained in:
danilchap
2017-03-16 08:04:08 -07:00
committed by Commit bot
parent 0937468cee
commit 74e8df8feb
4 changed files with 21 additions and 5 deletions

View File

@ -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

View File

@ -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<Chunk> chunks_;
size_t block_length_;
};

View File

@ -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<rtcp::RtcpPacket> 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<rtcp::RtcpPacket>(sdes);
}

View File

@ -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"));