xref: /aosp_15_r20/external/webrtc/modules/rtp_rtcp/source/rtcp_packet/remb_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "modules/rtp_rtcp/source/rtcp_packet/remb.h"
12 
13 #include "test/gmock.h"
14 #include "test/gtest.h"
15 #include "test/rtcp_packet_parser.h"
16 
17 using ::testing::ElementsAreArray;
18 using ::testing::IsEmpty;
19 using ::testing::make_tuple;
20 using webrtc::rtcp::Remb;
21 
22 namespace webrtc {
23 namespace {
24 const uint32_t kSenderSsrc = 0x12345678;
25 const uint32_t kRemoteSsrcs[] = {0x23456789, 0x2345678a, 0x2345678b};
26 const uint32_t kBitrateBps = 0x3fb93 * 2;  // 522022;
27 const int64_t kBitrateBps64bit = int64_t{0x3fb93} << 30;
28 const uint8_t kPacket[] = {0x8f, 206,  0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
29                            0x00, 0x00, 0x00, 0x00, 'R',  'E',  'M',  'B',
30                            0x03, 0x07, 0xfb, 0x93, 0x23, 0x45, 0x67, 0x89,
31                            0x23, 0x45, 0x67, 0x8a, 0x23, 0x45, 0x67, 0x8b};
32 const size_t kPacketLength = sizeof(kPacket);
33 }  // namespace
34 
TEST(RtcpPacketRembTest,Create)35 TEST(RtcpPacketRembTest, Create) {
36   Remb remb;
37   remb.SetSenderSsrc(kSenderSsrc);
38   remb.SetSsrcs(
39       std::vector<uint32_t>(std::begin(kRemoteSsrcs), std::end(kRemoteSsrcs)));
40   remb.SetBitrateBps(kBitrateBps);
41 
42   rtc::Buffer packet = remb.Build();
43 
44   EXPECT_THAT(make_tuple(packet.data(), packet.size()),
45               ElementsAreArray(kPacket));
46 }
47 
TEST(RtcpPacketRembTest,Parse)48 TEST(RtcpPacketRembTest, Parse) {
49   Remb remb;
50   EXPECT_TRUE(test::ParseSinglePacket(kPacket, &remb));
51   const Remb& parsed = remb;
52 
53   EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
54   EXPECT_EQ(kBitrateBps, parsed.bitrate_bps());
55   EXPECT_THAT(parsed.ssrcs(), ElementsAreArray(kRemoteSsrcs));
56 }
57 
TEST(RtcpPacketRembTest,CreateAndParseWithoutSsrcs)58 TEST(RtcpPacketRembTest, CreateAndParseWithoutSsrcs) {
59   Remb remb;
60   remb.SetSenderSsrc(kSenderSsrc);
61   remb.SetBitrateBps(kBitrateBps);
62   rtc::Buffer packet = remb.Build();
63 
64   Remb parsed;
65   EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
66   EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
67   EXPECT_EQ(kBitrateBps, parsed.bitrate_bps());
68   EXPECT_THAT(parsed.ssrcs(), IsEmpty());
69 }
70 
TEST(RtcpPacketRembTest,CreateAndParse64bitBitrate)71 TEST(RtcpPacketRembTest, CreateAndParse64bitBitrate) {
72   Remb remb;
73   remb.SetBitrateBps(kBitrateBps64bit);
74   rtc::Buffer packet = remb.Build();
75 
76   Remb parsed;
77   EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
78   EXPECT_EQ(kBitrateBps64bit, parsed.bitrate_bps());
79 }
80 
TEST(RtcpPacketRembTest,ParseFailsOnTooSmallPacketToBeRemb)81 TEST(RtcpPacketRembTest, ParseFailsOnTooSmallPacketToBeRemb) {
82   // Make it too small.
83   constexpr size_t kTooSmallSize = (1 + 3) * 4;
84   uint8_t packet[kTooSmallSize];
85   memcpy(packet, kPacket, kTooSmallSize);
86   packet[3] = 3;
87 
88   Remb remb;
89   EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
90 }
91 
TEST(RtcpPacketRembTest,ParseFailsWhenUniqueIdentifierIsNotRemb)92 TEST(RtcpPacketRembTest, ParseFailsWhenUniqueIdentifierIsNotRemb) {
93   uint8_t packet[kPacketLength];
94   memcpy(packet, kPacket, kPacketLength);
95   packet[12] = 'N';  // Swap 'R' -> 'N' in the 'REMB' unique identifier.
96 
97   Remb remb;
98   EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
99 }
100 
TEST(RtcpPacketRembTest,ParseFailsWhenBitrateDoNotFitIn64bits)101 TEST(RtcpPacketRembTest, ParseFailsWhenBitrateDoNotFitIn64bits) {
102   uint8_t packet[kPacketLength];
103   memcpy(packet, kPacket, kPacketLength);
104   packet[17] |= 0xfc;  // Set exponenta component to maximum of 63.
105   packet[19] |= 0x02;  // Ensure mantissa is at least 2.
106 
107   Remb remb;
108   EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
109 }
110 
TEST(RtcpPacketRembTest,ParseFailsWhenSsrcCountMismatchLength)111 TEST(RtcpPacketRembTest, ParseFailsWhenSsrcCountMismatchLength) {
112   uint8_t packet[kPacketLength];
113   memcpy(packet, kPacket, kPacketLength);
114   packet[16]++;  // Swap 3 -> 4 in the ssrcs count.
115 
116   Remb remb;
117   EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
118 }
119 
TEST(RtcpPacketRembTest,TooManySsrcs)120 TEST(RtcpPacketRembTest, TooManySsrcs) {
121   Remb remb;
122   EXPECT_FALSE(remb.SetSsrcs(
123       std::vector<uint32_t>(Remb::kMaxNumberOfSsrcs + 1, kRemoteSsrcs[0])));
124   EXPECT_TRUE(remb.SetSsrcs(
125       std::vector<uint32_t>(Remb::kMaxNumberOfSsrcs, kRemoteSsrcs[0])));
126 }
127 
128 }  // namespace webrtc
129