OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h" |
12 | 12 |
| 13 #include "testing/gmock/include/gmock/gmock.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
14 | 15 |
15 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 16 using testing::ElementsAreArray; |
16 #include "webrtc/test/rtcp_packet_parser.h" | 17 using testing::IsEmpty; |
17 | 18 using testing::make_tuple; |
18 using webrtc::rtcp::RawPacket; | 19 using webrtc::rtcp::RawPacket; |
| 20 using webrtc::rtcp::TmmbItem; |
19 using webrtc::rtcp::Tmmbn; | 21 using webrtc::rtcp::Tmmbn; |
20 using webrtc::test::RtcpPacketParser; | 22 using webrtc::RTCPUtility::RtcpCommonHeader; |
| 23 using webrtc::RTCPUtility::RtcpParseCommonHeader; |
21 | 24 |
22 namespace webrtc { | 25 namespace webrtc { |
| 26 namespace { |
23 const uint32_t kSenderSsrc = 0x12345678; | 27 const uint32_t kSenderSsrc = 0x12345678; |
24 const uint32_t kRemoteSsrc = 0x23456789; | 28 const uint32_t kRemoteSsrc = 0x23456789; |
| 29 const uint32_t kBitrateBps = 312000; |
| 30 const uint16_t kOverhead = 0x1fe; |
| 31 const uint8_t kPacket[] = {0x84, 205, 0x00, 0x04, |
| 32 0x12, 0x34, 0x56, 0x78, |
| 33 0x00, 0x00, 0x00, 0x00, |
| 34 0x23, 0x45, 0x67, 0x89, |
| 35 0x0a, 0x61, 0x61, 0xfe}; |
25 | 36 |
26 TEST(RtcpPacketTest, TmmbnWithNoItem) { | 37 bool ParseTmmbn(const uint8_t* buffer, size_t length, Tmmbn* tmmbn) { |
| 38 RtcpCommonHeader header; |
| 39 EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header)); |
| 40 EXPECT_EQ(length, header.BlockSize()); |
| 41 return tmmbn->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes); |
| 42 } |
| 43 } // namespace |
| 44 |
| 45 TEST(RtcpPacketTmmbnTest, Create) { |
| 46 Tmmbn tmmbn; |
| 47 tmmbn.From(kSenderSsrc); |
| 48 tmmbn.WithTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead)); |
| 49 |
| 50 rtc::scoped_ptr<RawPacket> packet = tmmbn.Build(); |
| 51 |
| 52 EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()), |
| 53 ElementsAreArray(kPacket)); |
| 54 } |
| 55 |
| 56 TEST(RtcpPacketTmmbnTest, Parse) { |
| 57 Tmmbn tmmbn; |
| 58 EXPECT_TRUE(ParseTmmbn(kPacket, sizeof(kPacket), &tmmbn)); |
| 59 |
| 60 const Tmmbn& parsed = tmmbn; |
| 61 |
| 62 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
| 63 ASSERT_EQ(1u, parsed.items().size()); |
| 64 EXPECT_EQ(kRemoteSsrc, parsed.items().front().ssrc()); |
| 65 EXPECT_EQ(kBitrateBps, parsed.items().front().bitrate_bps()); |
| 66 EXPECT_EQ(kOverhead, parsed.items().front().packet_overhead()); |
| 67 } |
| 68 |
| 69 TEST(RtcpPacketTmmbnTest, CreateAndParseWithoutItems) { |
27 Tmmbn tmmbn; | 70 Tmmbn tmmbn; |
28 tmmbn.From(kSenderSsrc); | 71 tmmbn.From(kSenderSsrc); |
29 | 72 |
30 rtc::scoped_ptr<RawPacket> packet(tmmbn.Build()); | 73 rtc::scoped_ptr<RawPacket> packet = tmmbn.Build(); |
31 RtcpPacketParser parser; | 74 Tmmbn parsed; |
32 parser.Parse(packet->Buffer(), packet->Length()); | 75 EXPECT_TRUE(ParseTmmbn(packet->Buffer(), packet->Length(), &parsed)); |
33 EXPECT_EQ(1, parser.tmmbn()->num_packets()); | 76 |
34 EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc()); | 77 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
35 EXPECT_EQ(0, parser.tmmbn_items()->num_packets()); | 78 EXPECT_THAT(parsed.items(), IsEmpty()); |
36 } | 79 } |
37 | 80 |
38 TEST(RtcpPacketTest, TmmbnWithOneItem) { | 81 TEST(RtcpPacketTmmbnTest, CreateAndParseWithTwoItems) { |
39 Tmmbn tmmbn; | 82 Tmmbn tmmbn; |
40 tmmbn.From(kSenderSsrc); | 83 tmmbn.From(kSenderSsrc); |
41 EXPECT_TRUE(tmmbn.WithTmmbr(kRemoteSsrc, 312, 60)); | 84 tmmbn.WithTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead)); |
| 85 tmmbn.WithTmmbr(TmmbItem(kRemoteSsrc + 1, 4 * kBitrateBps, 40)); |
42 | 86 |
43 rtc::scoped_ptr<RawPacket> packet(tmmbn.Build()); | 87 rtc::scoped_ptr<RawPacket> packet = tmmbn.Build(); |
44 RtcpPacketParser parser; | 88 Tmmbn parsed; |
45 parser.Parse(packet->Buffer(), packet->Length()); | 89 EXPECT_TRUE(ParseTmmbn(packet->Buffer(), packet->Length(), &parsed)); |
46 EXPECT_EQ(1, parser.tmmbn()->num_packets()); | 90 |
47 EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc()); | 91 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
48 EXPECT_EQ(1, parser.tmmbn_items()->num_packets()); | 92 EXPECT_EQ(2u, parsed.items().size()); |
49 EXPECT_EQ(kRemoteSsrc, parser.tmmbn_items()->Ssrc(0)); | 93 EXPECT_EQ(kRemoteSsrc, parsed.items()[0].ssrc()); |
50 EXPECT_EQ(312U, parser.tmmbn_items()->BitrateKbps(0)); | 94 EXPECT_EQ(kBitrateBps, parsed.items()[0].bitrate_bps()); |
51 EXPECT_EQ(60U, parser.tmmbn_items()->Overhead(0)); | 95 EXPECT_EQ(kOverhead, parsed.items()[0].packet_overhead()); |
| 96 EXPECT_EQ(kRemoteSsrc + 1, parsed.items()[1].ssrc()); |
| 97 EXPECT_EQ(4 * kBitrateBps, parsed.items()[1].bitrate_bps()); |
| 98 EXPECT_EQ(40U, parsed.items()[1].packet_overhead()); |
52 } | 99 } |
53 | 100 |
54 TEST(RtcpPacketTest, TmmbnWithTwoItems) { | 101 TEST(RtcpPacketTmmbnTest, ParseFailsOnTooSmallPacket) { |
| 102 const uint8_t kSmallPacket[] = {0x84, 205, 0x00, 0x01, |
| 103 0x12, 0x34, 0x56, 0x78}; |
55 Tmmbn tmmbn; | 104 Tmmbn tmmbn; |
56 tmmbn.From(kSenderSsrc); | 105 EXPECT_FALSE(ParseTmmbn(kSmallPacket, sizeof(kSmallPacket), &tmmbn)); |
57 EXPECT_TRUE(tmmbn.WithTmmbr(kRemoteSsrc, 312, 60)); | |
58 EXPECT_TRUE(tmmbn.WithTmmbr(kRemoteSsrc + 1, 1288, 40)); | |
59 | |
60 rtc::scoped_ptr<RawPacket> packet(tmmbn.Build()); | |
61 RtcpPacketParser parser; | |
62 parser.Parse(packet->Buffer(), packet->Length()); | |
63 EXPECT_EQ(1, parser.tmmbn()->num_packets()); | |
64 EXPECT_EQ(kSenderSsrc, parser.tmmbn()->Ssrc()); | |
65 EXPECT_EQ(2, parser.tmmbn_items()->num_packets()); | |
66 EXPECT_EQ(kRemoteSsrc, parser.tmmbn_items()->Ssrc(0)); | |
67 EXPECT_EQ(312U, parser.tmmbn_items()->BitrateKbps(0)); | |
68 EXPECT_EQ(60U, parser.tmmbn_items()->Overhead(0)); | |
69 EXPECT_EQ(kRemoteSsrc + 1, parser.tmmbn_items()->Ssrc(1)); | |
70 EXPECT_EQ(1288U, parser.tmmbn_items()->BitrateKbps(1)); | |
71 EXPECT_EQ(40U, parser.tmmbn_items()->Overhead(1)); | |
72 } | 106 } |
73 | 107 |
74 TEST(RtcpPacketTest, TmmbnWithTooManyItems) { | 108 TEST(RtcpPacketTmmbnTest, ParseFailsOnUnAlignedPacket) { |
| 109 const uint8_t kUnalignedPacket[] = {0x84, 205, 0x00, 0x03, |
| 110 0x12, 0x34, 0x56, 0x78, |
| 111 0x00, 0x00, 0x00, 0x00, |
| 112 0x23, 0x45, 0x67, 0x89}; |
| 113 |
75 Tmmbn tmmbn; | 114 Tmmbn tmmbn; |
76 tmmbn.From(kSenderSsrc); | 115 EXPECT_FALSE(ParseTmmbn(kUnalignedPacket, sizeof(kUnalignedPacket), &tmmbn)); |
77 const int kMaxTmmbrItems = 50; | |
78 for (int i = 0; i < kMaxTmmbrItems; ++i) | |
79 EXPECT_TRUE(tmmbn.WithTmmbr(kRemoteSsrc + i, 312, 60)); | |
80 | |
81 EXPECT_FALSE(tmmbn.WithTmmbr(kRemoteSsrc + kMaxTmmbrItems, 312, 60)); | |
82 } | 116 } |
83 | |
84 } // namespace webrtc | 117 } // namespace webrtc |
OLD | NEW |