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}
This commit is contained in:
Danil Chapovalov
2017-11-08 16:19:08 +01:00
committed by Commit Bot
parent 29cb0e7f70
commit eb0ed28b90
3 changed files with 13 additions and 7 deletions

View File

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

View File

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

View File

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