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 <nisse@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20615}
diff --git a/modules/rtp_rtcp/source/rtcp_packet/common_header.cc b/modules/rtp_rtcp/source/rtcp_packet/common_header.cc
index e5c6fd5..a1f38dd 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 @@
 //
 // 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 54dd12a..b760d16 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 rtcp {
 class CommonHeader {
  public:
+  static constexpr size_t kHeaderSizeBytes = 4;
+
   CommonHeader() {}
   CommonHeader(const CommonHeader&) = default;
   CommonHeader& operator =(const CommonHeader&) = default;
@@ -29,6 +31,9 @@
   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 5ced421..a284642 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 @@
   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 @@
 
   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 @@
   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 @@
   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