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/rpsi.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi.h" |
12 | 12 |
13 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 #include "webrtc/base/checks.h" | 15 #include "webrtc/base/checks.h" |
16 | 16 |
17 using testing::ElementsAreArray; | 17 using testing::ElementsAreArray; |
18 using testing::make_tuple; | 18 using testing::make_tuple; |
19 using webrtc::rtcp::RawPacket; | |
20 using webrtc::rtcp::Rpsi; | 19 using webrtc::rtcp::Rpsi; |
21 using webrtc::RTCPUtility::RtcpCommonHeader; | 20 using webrtc::RTCPUtility::RtcpCommonHeader; |
22 using webrtc::RTCPUtility::RtcpParseCommonHeader; | 21 using webrtc::RTCPUtility::RtcpParseCommonHeader; |
23 | 22 |
24 namespace webrtc { | 23 namespace webrtc { |
25 namespace { | 24 namespace { |
26 const uint32_t kSenderSsrc = 0x12345678; | 25 const uint32_t kSenderSsrc = 0x12345678; |
27 const uint32_t kRemoteSsrc = 0x23456789; | 26 const uint32_t kRemoteSsrc = 0x23456789; |
28 // 10000|01 100001|0 1000011 (7 bits = 1 byte in native string). | 27 // 10000|01 100001|0 1000011 (7 bits = 1 byte in native string). |
29 const uint64_t kPictureId = 0x106143; | 28 const uint64_t kPictureId = 0x106143; |
(...skipping 29 matching lines...) Loading... |
59 EXPECT_EQ(kPictureId, parsed.picture_id()); | 58 EXPECT_EQ(kPictureId, parsed.picture_id()); |
60 } | 59 } |
61 | 60 |
62 TEST(RtcpPacketRpsiTest, Create) { | 61 TEST(RtcpPacketRpsiTest, Create) { |
63 Rpsi rpsi; | 62 Rpsi rpsi; |
64 rpsi.From(kSenderSsrc); | 63 rpsi.From(kSenderSsrc); |
65 rpsi.To(kRemoteSsrc); | 64 rpsi.To(kRemoteSsrc); |
66 rpsi.WithPayloadType(kPayloadType); | 65 rpsi.WithPayloadType(kPayloadType); |
67 rpsi.WithPictureId(kPictureId); | 66 rpsi.WithPictureId(kPictureId); |
68 | 67 |
69 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 68 rtc::Buffer packet = rpsi.Build(); |
70 | 69 |
71 EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()), | 70 EXPECT_THAT(make_tuple(packet.data(), packet.size()), |
72 ElementsAreArray(kPacket)); | 71 ElementsAreArray(kPacket)); |
73 } | 72 } |
74 | 73 |
75 TEST(RtcpPacketRpsiTest, ParseFailsOnTooSmallPacket) { | 74 TEST(RtcpPacketRpsiTest, ParseFailsOnTooSmallPacket) { |
76 Rpsi rpsi; | 75 Rpsi rpsi; |
77 rpsi.From(kSenderSsrc); | 76 rpsi.From(kSenderSsrc); |
78 rpsi.To(kRemoteSsrc); | 77 rpsi.To(kRemoteSsrc); |
79 | 78 |
80 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 79 rtc::Buffer packet = rpsi.Build(); |
81 packet->MutableBuffer()[3]--; // Reduce size field by one word (4 bytes). | 80 packet.data()[3]--; // Reduce size field by one word (4 bytes). |
82 | 81 |
83 EXPECT_FALSE(ParseRpsi(packet->Buffer(), packet->Length() - 4)); | 82 EXPECT_FALSE(ParseRpsi(packet.data(), packet.size() - 4)); |
84 } | 83 } |
85 | 84 |
86 TEST(RtcpPacketRpsiTest, ParseFailsOnFractionalPaddingBytes) { | 85 TEST(RtcpPacketRpsiTest, ParseFailsOnFractionalPaddingBytes) { |
87 Rpsi rpsi; | 86 Rpsi rpsi; |
88 rpsi.From(kSenderSsrc); | 87 rpsi.From(kSenderSsrc); |
89 rpsi.To(kRemoteSsrc); | 88 rpsi.To(kRemoteSsrc); |
90 rpsi.WithPictureId(kPictureId); | 89 rpsi.WithPictureId(kPictureId); |
91 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 90 rtc::Buffer packet = rpsi.Build(); |
92 uint8_t* padding_bits = packet->MutableBuffer() + 12; | 91 uint8_t* padding_bits = packet.data() + 12; |
93 uint8_t saved_padding_bits = *padding_bits; | 92 uint8_t saved_padding_bits = *padding_bits; |
94 ASSERT_TRUE(ParseRpsi(packet->Buffer(), packet->Length())); | 93 ASSERT_TRUE(ParseRpsi(packet.data(), packet.size())); |
95 | 94 |
96 for (uint8_t i = 1; i < 8; ++i) { | 95 for (uint8_t i = 1; i < 8; ++i) { |
97 *padding_bits = saved_padding_bits + i; | 96 *padding_bits = saved_padding_bits + i; |
98 EXPECT_FALSE(ParseRpsi(packet->Buffer(), packet->Length())); | 97 EXPECT_FALSE(ParseRpsi(packet.data(), packet.size())); |
99 } | 98 } |
100 } | 99 } |
101 | 100 |
102 TEST(RtcpPacketRpsiTest, ParseFailsOnTooBigPadding) { | 101 TEST(RtcpPacketRpsiTest, ParseFailsOnTooBigPadding) { |
103 Rpsi rpsi; | 102 Rpsi rpsi; |
104 rpsi.From(kSenderSsrc); | 103 rpsi.From(kSenderSsrc); |
105 rpsi.To(kRemoteSsrc); | 104 rpsi.To(kRemoteSsrc); |
106 rpsi.WithPictureId(1); // Small picture id that occupy just 1 byte. | 105 rpsi.WithPictureId(1); // Small picture id that occupy just 1 byte. |
107 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 106 rtc::Buffer packet = rpsi.Build(); |
108 uint8_t* padding_bits = packet->MutableBuffer() + 12; | 107 uint8_t* padding_bits = packet.data() + 12; |
109 ASSERT_TRUE(ParseRpsi(packet->Buffer(), packet->Length())); | 108 ASSERT_TRUE(ParseRpsi(packet.data(), packet.size())); |
110 | 109 |
111 *padding_bits += 8; | 110 *padding_bits += 8; |
112 EXPECT_FALSE(ParseRpsi(packet->Buffer(), packet->Length())); | 111 EXPECT_FALSE(ParseRpsi(packet.data(), packet.size())); |
113 } | 112 } |
114 | 113 |
115 // For raw rpsi packet extract how many bytes are used to store picture_id. | 114 // For raw rpsi packet extract how many bytes are used to store picture_id. |
116 size_t UsedBytes(const RawPacket& packet) { // Works for small packets only. | 115 size_t UsedBytes(const rtc::Buffer& packet) { // Works for small packets only. |
117 RTC_CHECK_EQ(packet.Buffer()[2], 0); // Assume packet is small. | 116 RTC_CHECK_EQ(packet.data()[2], 0); // Assume packet is small. |
118 size_t total_rpsi_payload_bytes = 4 * (packet.Buffer()[3] - 2) - 2; | 117 size_t total_rpsi_payload_bytes = 4 * (packet.data()[3] - 2) - 2; |
119 uint8_t padding_bits = packet.Buffer()[12]; | 118 uint8_t padding_bits = packet.data()[12]; |
120 RTC_CHECK_EQ(padding_bits % 8, 0); | 119 RTC_CHECK_EQ(padding_bits % 8, 0); |
121 return total_rpsi_payload_bytes - (padding_bits / 8); | 120 return total_rpsi_payload_bytes - (padding_bits / 8); |
122 } | 121 } |
123 | 122 |
124 TEST(RtcpPacketRpsiTest, WithOneByteNativeString) { | 123 TEST(RtcpPacketRpsiTest, WithOneByteNativeString) { |
125 Rpsi rpsi; | 124 Rpsi rpsi; |
126 // 1000001 (7 bits = 1 byte in native string). | 125 // 1000001 (7 bits = 1 byte in native string). |
127 const uint64_t kPictureId = 0x41; | 126 const uint64_t kPictureId = 0x41; |
128 const uint16_t kNumberOfValidBytes = 1; | 127 const uint16_t kNumberOfValidBytes = 1; |
129 rpsi.WithPictureId(kPictureId); | 128 rpsi.WithPictureId(kPictureId); |
130 | 129 |
131 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 130 rtc::Buffer packet = rpsi.Build(); |
132 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); | 131 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
133 | 132 |
134 Rpsi parsed; | 133 Rpsi parsed; |
135 EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); | 134 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); |
136 EXPECT_EQ(kPictureId, parsed.picture_id()); | 135 EXPECT_EQ(kPictureId, parsed.picture_id()); |
137 } | 136 } |
138 | 137 |
139 TEST(RtcpPacketRpsiTest, WithTwoByteNativeString) { | 138 TEST(RtcpPacketRpsiTest, WithTwoByteNativeString) { |
140 Rpsi rpsi; | 139 Rpsi rpsi; |
141 // |1 0000001 (7 bits = 1 byte in native string). | 140 // |1 0000001 (7 bits = 1 byte in native string). |
142 const uint64_t kPictureId = 0x81; | 141 const uint64_t kPictureId = 0x81; |
143 const uint16_t kNumberOfValidBytes = 2; | 142 const uint16_t kNumberOfValidBytes = 2; |
144 rpsi.WithPictureId(kPictureId); | 143 rpsi.WithPictureId(kPictureId); |
145 | 144 |
146 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 145 rtc::Buffer packet = rpsi.Build(); |
147 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); | 146 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
148 | 147 |
149 Rpsi parsed; | 148 Rpsi parsed; |
150 EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); | 149 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); |
151 EXPECT_EQ(kPictureId, parsed.picture_id()); | 150 EXPECT_EQ(kPictureId, parsed.picture_id()); |
152 } | 151 } |
153 | 152 |
154 TEST(RtcpPacketRpsiTest, WithThreeByteNativeString) { | 153 TEST(RtcpPacketRpsiTest, WithThreeByteNativeString) { |
155 Rpsi rpsi; | 154 Rpsi rpsi; |
156 // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string). | 155 // 10000|00 100000|0 1000000 (7 bits = 1 byte in native string). |
157 const uint64_t kPictureId = 0x102040; | 156 const uint64_t kPictureId = 0x102040; |
158 const uint16_t kNumberOfValidBytes = 3; | 157 const uint16_t kNumberOfValidBytes = 3; |
159 rpsi.WithPictureId(kPictureId); | 158 rpsi.WithPictureId(kPictureId); |
160 | 159 |
161 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 160 rtc::Buffer packet = rpsi.Build(); |
162 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); | 161 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
163 | 162 |
164 Rpsi parsed; | 163 Rpsi parsed; |
165 EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); | 164 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); |
166 EXPECT_EQ(kPictureId, parsed.picture_id()); | 165 EXPECT_EQ(kPictureId, parsed.picture_id()); |
167 } | 166 } |
168 | 167 |
169 TEST(RtcpPacketRpsiTest, WithFourByteNativeString) { | 168 TEST(RtcpPacketRpsiTest, WithFourByteNativeString) { |
170 Rpsi rpsi; | 169 Rpsi rpsi; |
171 // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string). | 170 // 1000|001 00001|01 100001|1 1000010 (7 bits = 1 byte in native string). |
172 const uint64_t kPictureId = 0x84161C2; | 171 const uint64_t kPictureId = 0x84161C2; |
173 const uint16_t kNumberOfValidBytes = 4; | 172 const uint16_t kNumberOfValidBytes = 4; |
174 rpsi.WithPictureId(kPictureId); | 173 rpsi.WithPictureId(kPictureId); |
175 | 174 |
176 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 175 rtc::Buffer packet = rpsi.Build(); |
177 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); | 176 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
178 | 177 |
179 Rpsi parsed; | 178 Rpsi parsed; |
180 EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); | 179 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); |
181 EXPECT_EQ(kPictureId, parsed.picture_id()); | 180 EXPECT_EQ(kPictureId, parsed.picture_id()); |
182 } | 181 } |
183 | 182 |
184 TEST(RtcpPacketRpsiTest, WithMaxPictureId) { | 183 TEST(RtcpPacketRpsiTest, WithMaxPictureId) { |
185 Rpsi rpsi; | 184 Rpsi rpsi; |
186 // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111| | 185 // 1 1111111| 1111111 1|111111 11|11111 111|1111 1111|111 11111| |
187 // 11 111111|1 1111111 (7 bits = 1 byte in native string). | 186 // 11 111111|1 1111111 (7 bits = 1 byte in native string). |
188 const uint64_t kPictureId = 0xffffffffffffffff; | 187 const uint64_t kPictureId = 0xffffffffffffffff; |
189 const uint16_t kNumberOfValidBytes = 10; | 188 const uint16_t kNumberOfValidBytes = 10; |
190 rpsi.WithPictureId(kPictureId); | 189 rpsi.WithPictureId(kPictureId); |
191 | 190 |
192 rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); | 191 rtc::Buffer packet = rpsi.Build(); |
193 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); | 192 EXPECT_EQ(kNumberOfValidBytes, UsedBytes(packet)); |
194 | 193 |
195 Rpsi parsed; | 194 Rpsi parsed; |
196 EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); | 195 EXPECT_TRUE(ParseRpsi(packet.data(), packet.size(), &parsed)); |
197 EXPECT_EQ(kPictureId, parsed.picture_id()); | 196 EXPECT_EQ(kPictureId, parsed.picture_id()); |
198 } | 197 } |
199 } // namespace webrtc | 198 } // namespace webrtc |
OLD | NEW |