diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.cc index 6d6c48fada..45c4b6357f 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.cc @@ -45,7 +45,7 @@ bool Dlrr::Parse(const uint8_t* buffer, uint16_t block_length_32bits) { size_t blocks_count = block_length_32bits / 3; const uint8_t* read_at = buffer + kBlockHeaderLength; sub_blocks_.resize(blocks_count); - for (SubBlock& sub_block : sub_blocks_) { + for (ReceiveTimeInfo& sub_block : sub_blocks_) { sub_block.ssrc = ByteReader::ReadBigEndian(&read_at[0]); sub_block.last_rr = ByteReader::ReadBigEndian(&read_at[4]); sub_block.delay_since_last_rr = @@ -71,7 +71,7 @@ void Dlrr::Create(uint8_t* buffer) const { ByteWriter::WriteBigEndian(&buffer[2], 3 * sub_blocks_.size()); // Create sub blocks. uint8_t* write_at = buffer + kBlockHeaderLength; - for (const SubBlock& sub_block : sub_blocks_) { + for (const ReceiveTimeInfo& sub_block : sub_blocks_) { ByteWriter::WriteBigEndian(&write_at[0], sub_block.ssrc); ByteWriter::WriteBigEndian(&write_at[4], sub_block.last_rr); ByteWriter::WriteBigEndian(&write_at[8], @@ -81,20 +81,23 @@ void Dlrr::Create(uint8_t* buffer) const { RTC_DCHECK_EQ(buffer + BlockLength(), write_at); } -bool Dlrr::WithDlrrItem(uint32_t ssrc, - uint32_t last_rr, - uint32_t delay_last_rr) { +bool Dlrr::WithDlrrItem(const ReceiveTimeInfo& block) { if (sub_blocks_.size() >= kMaxNumberOfDlrrItems) { LOG(LS_WARNING) << "Max DLRR items reached."; return false; } - SubBlock block; - block.ssrc = ssrc; - block.last_rr = last_rr; - block.delay_since_last_rr = delay_last_rr; sub_blocks_.push_back(block); return true; } +bool Dlrr::WithDlrrItem(uint32_t ssrc, + uint32_t last_rr, + uint32_t delay_last_rr) { + ReceiveTimeInfo block; + block.ssrc = ssrc; + block.last_rr = last_rr; + block.delay_since_last_rr = delay_last_rr; + return WithDlrrItem(block); +} } // namespace rtcp } // namespace webrtc diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.h b/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.h index 9af2dedf3f..a48c3394ae 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.h +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.h @@ -18,17 +18,19 @@ namespace webrtc { namespace rtcp { +struct ReceiveTimeInfo { + // RFC 3611 4.5 + ReceiveTimeInfo() : ssrc(0), last_rr(0), delay_since_last_rr(0) {} + ReceiveTimeInfo(uint32_t ssrc, uint32_t last_rr, uint32_t delay) + : ssrc(ssrc), last_rr(last_rr), delay_since_last_rr(delay) {} + uint32_t ssrc; + uint32_t last_rr; + uint32_t delay_since_last_rr; +}; // DLRR Report Block: Delay since the Last Receiver Report (RFC 3611). class Dlrr { public: - struct SubBlock { - // RFC 3611 4.5 - uint32_t ssrc; - uint32_t last_rr; - uint32_t delay_since_last_rr; - }; - static const uint8_t kBlockType = 5; static const size_t kMaxNumberOfDlrrItems = 100; @@ -48,15 +50,16 @@ class Dlrr { void Create(uint8_t* buffer) const; // Max 100 DLRR Items can be added per DLRR report block. + bool WithDlrrItem(const ReceiveTimeInfo& time_info); bool WithDlrrItem(uint32_t ssrc, uint32_t last_rr, uint32_t delay_last_rr); - const std::vector& sub_blocks() const { return sub_blocks_; } + const std::vector& sub_blocks() const { return sub_blocks_; } private: static const size_t kBlockHeaderLength = 4; static const size_t kSubBlockLength = 12; - std::vector sub_blocks_; + std::vector sub_blocks_; }; } // namespace rtcp } // namespace webrtc diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc index c7c139c560..1bf0cc4bb6 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc @@ -15,16 +15,17 @@ #include "webrtc/modules/rtp_rtcp/source/byte_io.h" using webrtc::rtcp::Dlrr; +using webrtc::rtcp::ReceiveTimeInfo; namespace webrtc { namespace { - const uint32_t kSsrc = 0x12345678; const uint32_t kLastRR = 0x23344556; const uint32_t kDelay = 0x33343536; const uint8_t kBlock[] = {0x05, 0x00, 0x00, 0x03, 0x12, 0x34, 0x56, 0x78, 0x23, 0x34, 0x45, 0x56, 0x33, 0x34, 0x35, 0x36}; const size_t kBlockSizeBytes = sizeof(kBlock); +} // namespace TEST(RtcpPacketDlrrTest, Empty) { Dlrr dlrr; @@ -49,7 +50,7 @@ TEST(RtcpPacketDlrrTest, Parse) { EXPECT_TRUE(dlrr.Parse(kBlock, block_length)); EXPECT_EQ(1u, dlrr.sub_blocks().size()); - const Dlrr::SubBlock& block = dlrr.sub_blocks().front(); + const ReceiveTimeInfo& block = dlrr.sub_blocks().front(); EXPECT_EQ(kSsrc, block.ssrc); EXPECT_EQ(kLastRR, block.last_rr); EXPECT_EQ(kDelay, block.delay_since_last_rr); @@ -97,6 +98,4 @@ TEST(RtcpPacketDlrrTest, CreateAndParseMaxSubBlocks) { EXPECT_TRUE(parsed.Parse(buffer, block_length)); EXPECT_TRUE(parsed.sub_blocks().size() == Dlrr::kMaxNumberOfDlrrItems); } - -} // namespace } // namespace webrtc