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