From eb0ed28b903db6a697c4a0549f69c6d84dbe21cc Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Wed, 8 Nov 2017 16:19:08 +0100 Subject: [PATCH] Add rtcp::CommonHeader::packet_size function as an alternative to NextPacket function to allow cleaner iterating over stacked rtcp packets. Bug: webrtc:5565 Change-Id: I261afe2684e5fcb5fa3e7bcce272fbefeebd0b66 Reviewed-on: https://webrtc-review.googlesource.com/21360 Reviewed-by: Niels Moller Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/master@{#20615} --- .../rtp_rtcp/source/rtcp_packet/common_header.cc | 2 +- modules/rtp_rtcp/source/rtcp_packet/common_header.h | 5 +++++ .../source/rtcp_packet/common_header_unittest.cc | 13 +++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/modules/rtp_rtcp/source/rtcp_packet/common_header.cc b/modules/rtp_rtcp/source/rtcp_packet/common_header.cc index e5c6fd566e..a1f38ddc8e 100644 --- a/modules/rtp_rtcp/source/rtcp_packet/common_header.cc +++ b/modules/rtp_rtcp/source/rtcp_packet/common_header.cc @@ -15,6 +15,7 @@ namespace webrtc { namespace rtcp { +constexpr size_t CommonHeader::kHeaderSizeBytes; // 0 1 1 2 3 // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -27,7 +28,6 @@ namespace rtcp { // // Common header for all RTCP packets, 4 octets. bool CommonHeader::Parse(const uint8_t* buffer, size_t size_bytes) { - const size_t kHeaderSizeBytes = 4; const uint8_t kVersion = 2; if (size_bytes < kHeaderSizeBytes) { diff --git a/modules/rtp_rtcp/source/rtcp_packet/common_header.h b/modules/rtp_rtcp/source/rtcp_packet/common_header.h index 54dd12a42b..b760d169f7 100644 --- a/modules/rtp_rtcp/source/rtcp_packet/common_header.h +++ b/modules/rtp_rtcp/source/rtcp_packet/common_header.h @@ -16,6 +16,8 @@ namespace webrtc { namespace rtcp { class CommonHeader { public: + static constexpr size_t kHeaderSizeBytes = 4; + CommonHeader() {} CommonHeader(const CommonHeader&) = default; CommonHeader& operator =(const CommonHeader&) = default; @@ -29,6 +31,9 @@ class CommonHeader { uint8_t count() const { return count_or_format_; } size_t payload_size_bytes() const { return payload_size_; } const uint8_t* payload() const { return payload_; } + size_t packet_size() const { + return kHeaderSizeBytes + payload_size_ + padding_size_; + } // Returns pointer to the next RTCP packet in compound packet. const uint8_t* NextPacket() const { return payload_ + payload_size_ + padding_size_; diff --git a/modules/rtp_rtcp/source/rtcp_packet/common_header_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/common_header_unittest.cc index 5ced421a7c..a284642451 100644 --- a/modules/rtp_rtcp/source/rtcp_packet/common_header_unittest.cc +++ b/modules/rtp_rtcp/source/rtcp_packet/common_header_unittest.cc @@ -15,9 +15,6 @@ using webrtc::rtcp::CommonHeader; namespace webrtc { -namespace { -const size_t kHeaderSizeBytes = 4; -} // namespace TEST(RtcpCommonHeaderTest, TooSmallBuffer) { uint8_t buffer[] = {0x80, 0x00, 0x00, 0x00}; @@ -53,6 +50,7 @@ TEST(RtcpCommonHeaderTest, PacketSize) { EXPECT_TRUE(header.Parse(buffer, sizeof(buffer))); EXPECT_EQ(8u, header.payload_size_bytes()); EXPECT_EQ(buffer + sizeof(buffer), header.NextPacket()); + EXPECT_EQ(sizeof(buffer), header.packet_size()); } TEST(RtcpCommonHeaderTest, PaddingAndPayloadSize) { @@ -66,7 +64,8 @@ TEST(RtcpCommonHeaderTest, PaddingAndPayloadSize) { buffer[3] = 2; // Set payload size to 2x32bit. const size_t kPayloadSizeBytes = buffer[3] * 4; - const size_t kPaddingAddress = kHeaderSizeBytes + kPayloadSizeBytes - 1; + const size_t kPaddingAddress = + CommonHeader::kHeaderSizeBytes + kPayloadSizeBytes - 1; // Padding one byte larger than possible. buffer[kPaddingAddress] = kPayloadSizeBytes + 1; @@ -81,13 +80,15 @@ TEST(RtcpCommonHeaderTest, PaddingAndPayloadSize) { EXPECT_TRUE(header.Parse(buffer, sizeof(buffer))); EXPECT_EQ(0u, header.payload_size_bytes()); EXPECT_EQ(buffer + sizeof(buffer), header.NextPacket()); - EXPECT_EQ(header.payload(), buffer + kHeaderSizeBytes); + EXPECT_EQ(header.payload(), buffer + CommonHeader::kHeaderSizeBytes); + EXPECT_EQ(header.packet_size(), sizeof(buffer)); // Single byte of actual data. buffer[kPaddingAddress] = kPayloadSizeBytes - 1; EXPECT_TRUE(header.Parse(buffer, sizeof(buffer))); EXPECT_EQ(1u, header.payload_size_bytes()); EXPECT_EQ(buffer + sizeof(buffer), header.NextPacket()); + EXPECT_EQ(header.packet_size(), sizeof(buffer)); } TEST(RtcpCommonHeaderTest, FormatAndPayloadType) { @@ -99,6 +100,6 @@ TEST(RtcpCommonHeaderTest, FormatAndPayloadType) { EXPECT_EQ(header.fmt(), 0x1e); EXPECT_EQ(header.type(), 0xab); EXPECT_EQ(header.payload_size_bytes(), 0u); - EXPECT_EQ(header.payload(), buffer + kHeaderSizeBytes); + EXPECT_EQ(header.payload(), buffer + CommonHeader::kHeaderSizeBytes); } } // namespace webrtc