blob: 150dba7f5fd9cef9ee101874365ab2a5bfcb26d6 [file] [log] [blame]
danilchap1edb7ab2016-04-20 05:25:10 -07001/*
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 */
Johannes Kronf1ab9b92018-12-14 10:14:07 +010010#include "common_video/test/utilities.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
12#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
Jonas Olssona4d87372019-07-05 19:08:33 +020013#include "modules/rtp_rtcp/source/rtp_packet_received.h"
14#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/random.h"
16#include "test/gmock.h"
17#include "test/gtest.h"
danilchap1edb7ab2016-04-20 05:25:10 -070018
danilchap1edb7ab2016-04-20 05:25:10 -070019namespace webrtc {
20namespace {
Danil Chapovalove19953b2018-10-01 16:12:28 +020021
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +020022using ::testing::Each;
Danil Chapovalove19953b2018-10-01 16:12:28 +020023using ::testing::ElementsAre;
danilchapc547e842017-04-10 01:31:49 -070024using ::testing::ElementsAreArray;
25using ::testing::IsEmpty;
danilchapc547e842017-04-10 01:31:49 -070026
danilchap1edb7ab2016-04-20 05:25:10 -070027constexpr int8_t kPayloadType = 100;
28constexpr uint32_t kSsrc = 0x12345678;
eladalonae550e32017-05-24 08:28:13 -070029constexpr uint16_t kSeqNum = 0x1234;
30constexpr uint8_t kSeqNumFirstByte = kSeqNum >> 8;
31constexpr uint8_t kSeqNumSecondByte = kSeqNum & 0xff;
danilchap1edb7ab2016-04-20 05:25:10 -070032constexpr uint32_t kTimestamp = 0x65431278;
33constexpr uint8_t kTransmissionOffsetExtensionId = 1;
34constexpr uint8_t kAudioLevelExtensionId = 9;
erikvargae6b16192017-05-11 02:36:32 -070035constexpr uint8_t kRtpStreamIdExtensionId = 0xa;
Steve Antona3251dd2017-07-21 09:58:31 -070036constexpr uint8_t kRtpMidExtensionId = 0xb;
sprangba050a62017-08-18 02:51:12 -070037constexpr uint8_t kVideoTimingExtensionId = 0xc;
Johannes Kron07ba2b92018-09-26 13:33:35 +020038constexpr uint8_t kTwoByteExtensionId = 0xf0;
danilchap1edb7ab2016-04-20 05:25:10 -070039constexpr int32_t kTimeOffset = 0x56ce;
40constexpr bool kVoiceActive = true;
41constexpr uint8_t kAudioLevel = 0x5a;
erikvargae6b16192017-05-11 02:36:32 -070042constexpr char kStreamId[] = "streamid";
Steve Antona3251dd2017-07-21 09:58:31 -070043constexpr char kMid[] = "mid";
Johannes Kron07ba2b92018-09-26 13:33:35 +020044constexpr char kLongMid[] = "extra-long string to test two-byte header";
danilchap1edb7ab2016-04-20 05:25:10 -070045constexpr size_t kMaxPaddingSize = 224u;
danilchap07ec26d2016-06-17 04:18:54 -070046// clang-format off
danilchap1edb7ab2016-04-20 05:25:10 -070047constexpr uint8_t kMinimumPacket[] = {
eladalonae550e32017-05-24 08:28:13 -070048 0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap1edb7ab2016-04-20 05:25:10 -070049 0x65, 0x43, 0x12, 0x78,
50 0x12, 0x34, 0x56, 0x78};
erikvargae6b16192017-05-11 02:36:32 -070051
danilchap1edb7ab2016-04-20 05:25:10 -070052constexpr uint8_t kPacketWithTO[] = {
eladalonae550e32017-05-24 08:28:13 -070053 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap1edb7ab2016-04-20 05:25:10 -070054 0x65, 0x43, 0x12, 0x78,
55 0x12, 0x34, 0x56, 0x78,
56 0xbe, 0xde, 0x00, 0x01,
57 0x12, 0x00, 0x56, 0xce};
58
59constexpr uint8_t kPacketWithTOAndAL[] = {
eladalonae550e32017-05-24 08:28:13 -070060 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap1edb7ab2016-04-20 05:25:10 -070061 0x65, 0x43, 0x12, 0x78,
62 0x12, 0x34, 0x56, 0x78,
63 0xbe, 0xde, 0x00, 0x02,
64 0x12, 0x00, 0x56, 0xce,
65 0x90, 0x80|kAudioLevel, 0x00, 0x00};
66
Johannes Kron78cdde32018-10-05 10:00:46 +020067constexpr uint8_t kPacketWithTwoByteExtensionIdLast[] = {
68 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
69 0x65, 0x43, 0x12, 0x78,
70 0x12, 0x34, 0x56, 0x78,
71 0x10, 0x00, 0x00, 0x04,
72 0x01, 0x03, 0x00, 0x56,
73 0xce, 0x09, 0x01, 0x80|kAudioLevel,
74 kTwoByteExtensionId, 0x03, 0x00, 0x30, // => 0x00 0x30 0x22
75 0x22, 0x00, 0x00, 0x00}; // => Playout delay.min_ms = 3*10
76 // => Playout delay.max_ms = 34*10
77
78constexpr uint8_t kPacketWithTwoByteExtensionIdFirst[] = {
79 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
80 0x65, 0x43, 0x12, 0x78,
81 0x12, 0x34, 0x56, 0x78,
82 0x10, 0x00, 0x00, 0x04,
83 kTwoByteExtensionId, 0x03, 0x00, 0x30, // => 0x00 0x30 0x22
84 0x22, 0x01, 0x03, 0x00, // => Playout delay.min_ms = 3*10
85 0x56, 0xce, 0x09, 0x01, // => Playout delay.max_ms = 34*10
86 0x80|kAudioLevel, 0x00, 0x00, 0x00};
87
Johannes Kron07ba2b92018-09-26 13:33:35 +020088constexpr uint8_t kPacketWithTOAndALInvalidPadding[] = {
89 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
90 0x65, 0x43, 0x12, 0x78,
91 0x12, 0x34, 0x56, 0x78,
92 0xbe, 0xde, 0x00, 0x03,
93 0x12, 0x00, 0x56, 0xce,
94 0x00, 0x02, 0x00, 0x00, // 0x02 is invalid padding, parsing should stop.
95 0x90, 0x80|kAudioLevel, 0x00, 0x00};
96
97constexpr uint8_t kPacketWithTOAndALReservedExtensionId[] = {
98 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
99 0x65, 0x43, 0x12, 0x78,
100 0x12, 0x34, 0x56, 0x78,
101 0xbe, 0xde, 0x00, 0x03,
102 0x12, 0x00, 0x56, 0xce,
103 0x00, 0xF0, 0x00, 0x00, // F is a reserved id, parsing should stop.
104 0x90, 0x80|kAudioLevel, 0x00, 0x00};
105
erikvargae6b16192017-05-11 02:36:32 -0700106constexpr uint8_t kPacketWithRsid[] = {
eladalonae550e32017-05-24 08:28:13 -0700107 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
erikvargae6b16192017-05-11 02:36:32 -0700108 0x65, 0x43, 0x12, 0x78,
109 0x12, 0x34, 0x56, 0x78,
110 0xbe, 0xde, 0x00, 0x03,
111 0xa7, 's', 't', 'r',
112 'e', 'a', 'm', 'i',
113 'd' , 0x00, 0x00, 0x00};
114
Steve Antona3251dd2017-07-21 09:58:31 -0700115constexpr uint8_t kPacketWithMid[] = {
116 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
117 0x65, 0x43, 0x12, 0x78,
118 0x12, 0x34, 0x56, 0x78,
119 0xbe, 0xde, 0x00, 0x01,
120 0xb2, 'm', 'i', 'd'};
121
danilchap1edb7ab2016-04-20 05:25:10 -0700122constexpr uint32_t kCsrcs[] = {0x34567890, 0x32435465};
123constexpr uint8_t kPayload[] = {'p', 'a', 'y', 'l', 'o', 'a', 'd'};
124constexpr uint8_t kPacketPaddingSize = 8;
125constexpr uint8_t kPacket[] = {
eladalonae550e32017-05-24 08:28:13 -0700126 0xb2, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap1edb7ab2016-04-20 05:25:10 -0700127 0x65, 0x43, 0x12, 0x78,
128 0x12, 0x34, 0x56, 0x78,
129 0x34, 0x56, 0x78, 0x90,
130 0x32, 0x43, 0x54, 0x65,
131 0xbe, 0xde, 0x00, 0x01,
132 0x12, 0x00, 0x56, 0xce,
133 'p', 'a', 'y', 'l', 'o', 'a', 'd',
134 'p', 'a', 'd', 'd', 'i', 'n', 'g', kPacketPaddingSize};
danilchape565a042016-06-16 10:04:50 -0700135
Johannes Kron07ba2b92018-09-26 13:33:35 +0200136constexpr uint8_t kPacketWithTwoByteHeaderExtension[] = {
137 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
138 0x65, 0x43, 0x12, 0x78,
139 0x12, 0x34, 0x56, 0x78,
140 0x10, 0x00, 0x00, 0x02, // Two-byte header extension profile id + length.
141 kTwoByteExtensionId, 0x03, 0x00, 0x56,
142 0xce, 0x00, 0x00, 0x00};
143
144constexpr uint8_t kPacketWithLongTwoByteHeaderExtension[] = {
145 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
146 0x65, 0x43, 0x12, 0x78,
147 0x12, 0x34, 0x56, 0x78,
148 0x10, 0x00, 0x00, 0x0B, // Two-byte header extension profile id + length.
149 kTwoByteExtensionId, 0x29, 'e', 'x',
150 't', 'r', 'a', '-', 'l', 'o', 'n', 'g',
151 ' ', 's', 't', 'r', 'i', 'n', 'g', ' ',
152 't', 'o', ' ', 't', 'e', 's', 't', ' ',
153 't', 'w', 'o', '-', 'b', 'y', 't', 'e',
154 ' ', 'h', 'e', 'a', 'd', 'e', 'r', 0x00};
155
156constexpr uint8_t kPacketWithTwoByteHeaderExtensionWithPadding[] = {
157 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
158 0x65, 0x43, 0x12, 0x78,
159 0x12, 0x34, 0x56, 0x78,
160 0x10, 0x00, 0x00, 0x03, // Two-byte header extension profile id + length.
161 kTwoByteExtensionId, 0x03, 0x00, 0x56,
162 0xce, 0x00, 0x00, 0x00, // Three padding bytes.
163 kAudioLevelExtensionId, 0x01, 0x80|kAudioLevel, 0x00};
164
danilchap07ec26d2016-06-17 04:18:54 -0700165constexpr uint8_t kPacketWithInvalidExtension[] = {
eladalonae550e32017-05-24 08:28:13 -0700166 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap07ec26d2016-06-17 04:18:54 -0700167 0x65, 0x43, 0x12, 0x78, // kTimestamp.
168 0x12, 0x34, 0x56, 0x78, // kSSrc.
169 0xbe, 0xde, 0x00, 0x02, // Extension block of size 2 x 32bit words.
170 (kTransmissionOffsetExtensionId << 4) | 6, // (6+1)-byte extension, but
171 'e', 'x', 't', // Transmission Offset
172 'd', 'a', 't', 'a', // expected to be 3-bytes.
sprangba050a62017-08-18 02:51:12 -0700173 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
174
175constexpr uint8_t kPacketWithLegacyTimingExtension[] = {
176 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
177 0x65, 0x43, 0x12, 0x78, // kTimestamp.
178 0x12, 0x34, 0x56, 0x78, // kSSrc.
179 0xbe, 0xde, 0x00, 0x04, // Extension block of size 4 x 32bit words.
180 (kVideoTimingExtensionId << 4)
181 | VideoTimingExtension::kValueSizeBytes - 2, // Old format without flags.
182 0x00, 0x01, 0x00,
183 0x02, 0x00, 0x03, 0x00,
184 0x04, 0x00, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00};
danilchap07ec26d2016-06-17 04:18:54 -0700186// clang-format on
Johannes Kronad1d9f02018-11-09 11:12:36 +0100187
Johannes Kron09d65882018-11-27 14:36:41 +0100188void TestCreateAndParseColorSpaceExtension(bool with_hdr_metadata) {
189 // Create packet with extension.
190 RtpPacket::ExtensionManager extensions(/*extmap-allow-mixed=*/true);
191 extensions.Register<ColorSpaceExtension>(1);
192 RtpPacket packet(&extensions);
193 const ColorSpace kColorSpace = CreateTestColorSpace(with_hdr_metadata);
194 EXPECT_TRUE(packet.SetExtension<ColorSpaceExtension>(kColorSpace));
195 packet.SetPayloadSize(42);
196
197 // Read packet with the extension.
198 RtpPacketReceived parsed(&extensions);
199 EXPECT_TRUE(parsed.Parse(packet.Buffer()));
200 ColorSpace parsed_color_space;
201 EXPECT_TRUE(parsed.GetExtension<ColorSpaceExtension>(&parsed_color_space));
202 EXPECT_EQ(kColorSpace, parsed_color_space);
203}
danilchap1edb7ab2016-04-20 05:25:10 -0700204} // namespace
205
206TEST(RtpPacketTest, CreateMinimum) {
207 RtpPacketToSend packet(nullptr);
208 packet.SetPayloadType(kPayloadType);
209 packet.SetSequenceNumber(kSeqNum);
210 packet.SetTimestamp(kTimestamp);
211 packet.SetSsrc(kSsrc);
212 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size()));
213}
214
215TEST(RtpPacketTest, CreateWithExtension) {
216 RtpPacketToSend::ExtensionManager extensions;
217 extensions.Register(kRtpExtensionTransmissionTimeOffset,
218 kTransmissionOffsetExtensionId);
219 RtpPacketToSend packet(&extensions);
220 packet.SetPayloadType(kPayloadType);
221 packet.SetSequenceNumber(kSeqNum);
222 packet.SetTimestamp(kTimestamp);
223 packet.SetSsrc(kSsrc);
224 packet.SetExtension<TransmissionOffset>(kTimeOffset);
225 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
226}
227
228TEST(RtpPacketTest, CreateWith2Extensions) {
229 RtpPacketToSend::ExtensionManager extensions;
230 extensions.Register(kRtpExtensionTransmissionTimeOffset,
231 kTransmissionOffsetExtensionId);
232 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
233 RtpPacketToSend packet(&extensions);
234 packet.SetPayloadType(kPayloadType);
235 packet.SetSequenceNumber(kSeqNum);
236 packet.SetTimestamp(kTimestamp);
237 packet.SetSsrc(kSsrc);
238 packet.SetExtension<TransmissionOffset>(kTimeOffset);
239 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
240 EXPECT_THAT(kPacketWithTOAndAL,
241 ElementsAreArray(packet.data(), packet.size()));
242}
243
Johannes Kron78cdde32018-10-05 10:00:46 +0200244TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionFirst) {
Johannes Kron9581bc42018-10-23 10:17:39 +0200245 RtpPacketToSend::ExtensionManager extensions(true);
Johannes Kron78cdde32018-10-05 10:00:46 +0200246 extensions.Register(kRtpExtensionTransmissionTimeOffset,
247 kTransmissionOffsetExtensionId);
248 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
249 extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
250 RtpPacketToSend packet(&extensions);
251 packet.SetPayloadType(kPayloadType);
252 packet.SetSequenceNumber(kSeqNum);
253 packet.SetTimestamp(kTimestamp);
254 packet.SetSsrc(kSsrc);
255 // Set extension that requires two-byte header.
256 PlayoutDelay playoutDelay = {30, 340};
257 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
258 packet.SetExtension<TransmissionOffset>(kTimeOffset);
259 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
260 EXPECT_THAT(kPacketWithTwoByteExtensionIdFirst,
261 ElementsAreArray(packet.data(), packet.size()));
262}
263
264TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionLast) {
265 // This test will trigger RtpPacket::PromoteToTwoByteHeaderExtension().
Johannes Kron9581bc42018-10-23 10:17:39 +0200266 RtpPacketToSend::ExtensionManager extensions(true);
Johannes Kron78cdde32018-10-05 10:00:46 +0200267 extensions.Register(kRtpExtensionTransmissionTimeOffset,
268 kTransmissionOffsetExtensionId);
269 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
270 extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
271 RtpPacketToSend packet(&extensions);
272 packet.SetPayloadType(kPayloadType);
273 packet.SetSequenceNumber(kSeqNum);
274 packet.SetTimestamp(kTimestamp);
275 packet.SetSsrc(kSsrc);
276 packet.SetExtension<TransmissionOffset>(kTimeOffset);
277 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
278 EXPECT_THAT(kPacketWithTOAndAL,
279 ElementsAreArray(packet.data(), packet.size()));
280 // Set extension that requires two-byte header.
281 PlayoutDelay playoutDelay = {30, 340};
282 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
283 EXPECT_THAT(kPacketWithTwoByteExtensionIdLast,
284 ElementsAreArray(packet.data(), packet.size()));
285}
286
erikvargae6b16192017-05-11 02:36:32 -0700287TEST(RtpPacketTest, CreateWithDynamicSizedExtensions) {
288 RtpPacketToSend::ExtensionManager extensions;
289 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
290 RtpPacketToSend packet(&extensions);
291 packet.SetPayloadType(kPayloadType);
292 packet.SetSequenceNumber(kSeqNum);
293 packet.SetTimestamp(kTimestamp);
294 packet.SetSsrc(kSsrc);
295 packet.SetExtension<RtpStreamId>(kStreamId);
296 EXPECT_THAT(kPacketWithRsid, ElementsAreArray(packet.data(), packet.size()));
297}
298
299TEST(RtpPacketTest, TryToCreateWithEmptyRsid) {
300 RtpPacketToSend::ExtensionManager extensions;
301 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
302 RtpPacketToSend packet(&extensions);
303 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(""));
304}
305
306TEST(RtpPacketTest, TryToCreateWithLongRsid) {
307 RtpPacketToSend::ExtensionManager extensions;
308 constexpr char kLongStreamId[] = "LoooooooooongRsid";
309 ASSERT_EQ(strlen(kLongStreamId), 17u);
310 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
311 RtpPacketToSend packet(&extensions);
312 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kLongStreamId));
313}
314
Steve Antona3251dd2017-07-21 09:58:31 -0700315TEST(RtpPacketTest, TryToCreateWithEmptyMid) {
316 RtpPacketToSend::ExtensionManager extensions;
317 extensions.Register<RtpMid>(kRtpMidExtensionId);
318 RtpPacketToSend packet(&extensions);
319 EXPECT_FALSE(packet.SetExtension<RtpMid>(""));
320}
321
322TEST(RtpPacketTest, TryToCreateWithLongMid) {
323 RtpPacketToSend::ExtensionManager extensions;
324 constexpr char kLongMid[] = "LoooooooooonogMid";
325 ASSERT_EQ(strlen(kLongMid), 17u);
326 extensions.Register<RtpMid>(kRtpMidExtensionId);
327 RtpPacketToSend packet(&extensions);
328 EXPECT_FALSE(packet.SetExtension<RtpMid>(kLongMid));
329}
330
Johannes Kron78cdde32018-10-05 10:00:46 +0200331TEST(RtpPacketTest, TryToCreateTwoByteHeaderNotSupported) {
332 RtpPacketToSend::ExtensionManager extensions;
333 extensions.Register(kRtpExtensionAudioLevel, kTwoByteExtensionId);
334 RtpPacketToSend packet(&extensions);
335 // Set extension that requires two-byte header.
336 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
337}
338
danilchap653063f2017-04-03 06:16:30 -0700339TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) {
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200340 const std::string kValue = "123456789abcdef";
341 RtpPacket::ExtensionManager extensions;
342 extensions.Register<RtpMid>(1);
343 extensions.Register<RtpStreamId>(2);
danilchap653063f2017-04-03 06:16:30 -0700344
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200345 RtpPacket packet(&extensions);
346 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700347
348 packet.SetPayloadSize(42);
349 // Rewriting allocated extension is allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200350 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700351 // Adding another extension after payload is set is not allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200352 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700353
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200354 // Read packet with the extension.
355 RtpPacketReceived parsed(&extensions);
danilchap653063f2017-04-03 06:16:30 -0700356 EXPECT_TRUE(parsed.Parse(packet.Buffer()));
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200357 std::string read;
358 EXPECT_TRUE(parsed.GetExtension<RtpMid>(&read));
359 EXPECT_EQ(read, kValue);
danilchap653063f2017-04-03 06:16:30 -0700360}
361
danilchap1edb7ab2016-04-20 05:25:10 -0700362TEST(RtpPacketTest, SetReservedExtensionsAfterPayload) {
363 const size_t kPayloadSize = 4;
364 RtpPacketToSend::ExtensionManager extensions;
365 extensions.Register(kRtpExtensionTransmissionTimeOffset,
366 kTransmissionOffsetExtensionId);
367 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
368 RtpPacketToSend packet(&extensions);
369
370 EXPECT_TRUE(packet.ReserveExtension<TransmissionOffset>());
danilchap07a01b32017-03-29 07:33:13 -0700371 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700372 // Can't set extension after payload.
373 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
374 // Unless reserved.
375 EXPECT_TRUE(packet.SetExtension<TransmissionOffset>(kTimeOffset));
376}
377
378TEST(RtpPacketTest, CreatePurePadding) {
379 const size_t kPaddingSize = kMaxPaddingSize - 1;
380 RtpPacketToSend packet(nullptr, 12 + kPaddingSize);
381 packet.SetPayloadType(kPayloadType);
382 packet.SetSequenceNumber(kSeqNum);
383 packet.SetTimestamp(kTimestamp);
384 packet.SetSsrc(kSsrc);
danilchap1edb7ab2016-04-20 05:25:10 -0700385
386 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200387 EXPECT_FALSE(packet.SetPadding(kPaddingSize + 1));
388 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700389 EXPECT_EQ(packet.size(), packet.capacity());
390}
391
392TEST(RtpPacketTest, CreateUnalignedPadding) {
393 const size_t kPayloadSize = 3; // Make padding start at unaligned address.
394 RtpPacketToSend packet(nullptr, 12 + kPayloadSize + kMaxPaddingSize);
395 packet.SetPayloadType(kPayloadType);
396 packet.SetSequenceNumber(kSeqNum);
397 packet.SetTimestamp(kTimestamp);
398 packet.SetSsrc(kSsrc);
danilchap07a01b32017-03-29 07:33:13 -0700399 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700400
401 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200402 EXPECT_TRUE(packet.SetPadding(kMaxPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700403 EXPECT_EQ(packet.size(), packet.capacity());
404}
405
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200406TEST(RtpPacketTest, WritesPaddingSizeToLastByte) {
407 const size_t kPaddingSize = 5;
408 RtpPacket packet;
409
410 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
411 EXPECT_EQ(packet.data()[packet.size() - 1], kPaddingSize);
412}
413
414TEST(RtpPacketTest, UsesZerosForPadding) {
415 const size_t kPaddingSize = 5;
416 RtpPacket packet;
417
418 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
419 EXPECT_THAT(rtc::MakeArrayView(packet.data() + 12, kPaddingSize - 1),
420 Each(0));
421}
422
423TEST(RtpPacketTest, CreateOneBytePadding) {
424 size_t kPayloadSize = 123;
425 RtpPacket packet(nullptr, 12 + kPayloadSize + 1);
426 packet.SetPayloadSize(kPayloadSize);
427
428 EXPECT_TRUE(packet.SetPadding(1));
429
430 EXPECT_EQ(packet.size(), 12 + kPayloadSize + 1);
431 EXPECT_EQ(packet.padding_size(), 1u);
432}
433
434TEST(RtpPacketTest, FailsToAddPaddingWithoutCapacity) {
435 size_t kPayloadSize = 123;
436 RtpPacket packet(nullptr, 12 + kPayloadSize);
437 packet.SetPayloadSize(kPayloadSize);
438
439 EXPECT_FALSE(packet.SetPadding(1));
440}
441
danilchap1edb7ab2016-04-20 05:25:10 -0700442TEST(RtpPacketTest, ParseMinimum) {
443 RtpPacketReceived packet;
444 EXPECT_TRUE(packet.Parse(kMinimumPacket, sizeof(kMinimumPacket)));
445 EXPECT_EQ(kPayloadType, packet.PayloadType());
446 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
447 EXPECT_EQ(kTimestamp, packet.Timestamp());
448 EXPECT_EQ(kSsrc, packet.Ssrc());
449 EXPECT_EQ(0u, packet.padding_size());
450 EXPECT_EQ(0u, packet.payload_size());
451}
452
453TEST(RtpPacketTest, ParseBuffer) {
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200454 rtc::CopyOnWriteBuffer unparsed(kMinimumPacket);
danilchap1edb7ab2016-04-20 05:25:10 -0700455 const uint8_t* raw = unparsed.data();
456
457 RtpPacketReceived packet;
458 EXPECT_TRUE(packet.Parse(std::move(unparsed)));
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200459 EXPECT_EQ(raw, packet.data()); // Expect packet take the buffer without copy.
danilchap1edb7ab2016-04-20 05:25:10 -0700460 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
461 EXPECT_EQ(kTimestamp, packet.Timestamp());
462 EXPECT_EQ(kSsrc, packet.Ssrc());
463 EXPECT_EQ(0u, packet.padding_size());
464 EXPECT_EQ(0u, packet.payload_size());
465}
466
467TEST(RtpPacketTest, ParseWithExtension) {
468 RtpPacketToSend::ExtensionManager extensions;
469 extensions.Register(kRtpExtensionTransmissionTimeOffset,
470 kTransmissionOffsetExtensionId);
471
472 RtpPacketReceived packet(&extensions);
473 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
474 EXPECT_EQ(kPayloadType, packet.PayloadType());
475 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
476 EXPECT_EQ(kTimestamp, packet.Timestamp());
477 EXPECT_EQ(kSsrc, packet.Ssrc());
478 int32_t time_offset;
479 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
480 EXPECT_EQ(kTimeOffset, time_offset);
481 EXPECT_EQ(0u, packet.payload_size());
482 EXPECT_EQ(0u, packet.padding_size());
483}
484
Danil Chapovalovc5dd3002018-11-08 15:12:45 +0100485TEST(RtpPacketTest, GetExtensionWithoutParametersReturnsOptionalValue) {
486 RtpPacket::ExtensionManager extensions;
487 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
488 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
489
490 RtpPacketReceived packet(&extensions);
491 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
492
493 auto time_offset = packet.GetExtension<TransmissionOffset>();
494 static_assert(
495 std::is_same<decltype(time_offset),
496 absl::optional<TransmissionOffset::value_type>>::value,
497 "");
498 EXPECT_EQ(time_offset, kTimeOffset);
499 EXPECT_FALSE(packet.GetExtension<RtpStreamId>().has_value());
500}
501
Danil Chapovalove19953b2018-10-01 16:12:28 +0200502TEST(RtpPacketTest, GetRawExtensionWhenPresent) {
503 constexpr uint8_t kRawPacket[] = {
504 // comment for clang-format to align kRawPacket nicer.
505 0x90, 100, 0x5e, 0x04, //
506 0x65, 0x43, 0x12, 0x78, // Timestamp.
507 0x12, 0x34, 0x56, 0x78, // Ssrc
508 0xbe, 0xde, 0x00, 0x01, // Extension header
509 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
510 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
511 RtpPacketToSend::ExtensionManager extensions;
512 extensions.Register<RtpMid>(1);
513 RtpPacket packet(&extensions);
514 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
515 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), ElementsAre('m', 'i', 'd'));
516}
517
518TEST(RtpPacketTest, GetRawExtensionWhenAbsent) {
519 constexpr uint8_t kRawPacket[] = {
520 // comment for clang-format to align kRawPacket nicer.
521 0x90, 100, 0x5e, 0x04, //
522 0x65, 0x43, 0x12, 0x78, // Timestamp.
523 0x12, 0x34, 0x56, 0x78, // Ssrc
524 0xbe, 0xde, 0x00, 0x01, // Extension header
525 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
526 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
527 RtpPacketToSend::ExtensionManager extensions;
528 extensions.Register<RtpMid>(2);
529 RtpPacket packet(&extensions);
530 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
531 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), IsEmpty());
532}
533
danilchap07ec26d2016-06-17 04:18:54 -0700534TEST(RtpPacketTest, ParseWithInvalidSizedExtension) {
535 RtpPacketToSend::ExtensionManager extensions;
536 extensions.Register(kRtpExtensionTransmissionTimeOffset,
537 kTransmissionOffsetExtensionId);
538
539 RtpPacketReceived packet(&extensions);
540 EXPECT_TRUE(packet.Parse(kPacketWithInvalidExtension,
541 sizeof(kPacketWithInvalidExtension)));
542
543 // Extension should be ignored.
544 int32_t time_offset;
545 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
546
547 // But shouldn't prevent reading payload.
danilchap96c15872016-11-21 01:35:29 -0800548 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap07ec26d2016-06-17 04:18:54 -0700549}
550
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200551TEST(RtpPacketTest, ParseWithOverSizedExtension) {
552 // clang-format off
553 const uint8_t bad_packet[] = {
eladalonae550e32017-05-24 08:28:13 -0700554 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200555 0x65, 0x43, 0x12, 0x78, // kTimestamp.
556 0x12, 0x34, 0x56, 0x78, // kSsrc.
557 0xbe, 0xde, 0x00, 0x01, // Extension of size 1x32bit word.
558 0x00, // Add a byte of padding.
559 0x12, // Extension id 1 size (2+1).
560 0xda, 0x1a // Only 2 bytes of extension payload.
561 };
562 // clang-format on
563 RtpPacketToSend::ExtensionManager extensions;
564 extensions.Register(TransmissionOffset::kId, 1);
565 RtpPacketReceived packet(&extensions);
566
567 // Parse should ignore bad extension and proceed.
568 EXPECT_TRUE(packet.Parse(bad_packet, sizeof(bad_packet)));
569 int32_t time_offset;
570 // But extracting extension should fail.
571 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
572}
573
danilchap1edb7ab2016-04-20 05:25:10 -0700574TEST(RtpPacketTest, ParseWith2Extensions) {
575 RtpPacketToSend::ExtensionManager extensions;
576 extensions.Register(kRtpExtensionTransmissionTimeOffset,
577 kTransmissionOffsetExtensionId);
578 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
579 RtpPacketReceived packet(&extensions);
580 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
581 int32_t time_offset;
582 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
583 EXPECT_EQ(kTimeOffset, time_offset);
584 bool voice_active;
585 uint8_t audio_level;
586 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
587 EXPECT_EQ(kVoiceActive, voice_active);
588 EXPECT_EQ(kAudioLevel, audio_level);
589}
590
Johannes Kron6ea77192018-09-24 17:19:52 +0200591TEST(RtpPacketTest, ParseSecondPacketWithFewerExtensions) {
592 RtpPacketToSend::ExtensionManager extensions;
593 extensions.Register(kRtpExtensionTransmissionTimeOffset,
594 kTransmissionOffsetExtensionId);
595 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
596 RtpPacketReceived packet(&extensions);
597 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
598 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
599 EXPECT_TRUE(packet.HasExtension<AudioLevel>());
600
601 // Second packet without audio level.
602 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
603 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
604 EXPECT_FALSE(packet.HasExtension<AudioLevel>());
605}
606
Johannes Kron07ba2b92018-09-26 13:33:35 +0200607TEST(RtpPacketTest, ParseWith2ExtensionsInvalidPadding) {
608 RtpPacketToSend::ExtensionManager extensions;
609 extensions.Register(kRtpExtensionTransmissionTimeOffset,
610 kTransmissionOffsetExtensionId);
611 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
612 RtpPacketReceived packet(&extensions);
613 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALInvalidPadding,
614 sizeof(kPacketWithTOAndALInvalidPadding)));
615 int32_t time_offset;
616 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
617 EXPECT_EQ(kTimeOffset, time_offset);
618 bool voice_active;
619 uint8_t audio_level;
620 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
621}
622
623TEST(RtpPacketTest, ParseWith2ExtensionsReservedExtensionId) {
624 RtpPacketToSend::ExtensionManager extensions;
625 extensions.Register(kRtpExtensionTransmissionTimeOffset,
626 kTransmissionOffsetExtensionId);
627 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
628 RtpPacketReceived packet(&extensions);
629 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALReservedExtensionId,
630 sizeof(kPacketWithTOAndALReservedExtensionId)));
631 int32_t time_offset;
632 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
633 EXPECT_EQ(kTimeOffset, time_offset);
634 bool voice_active;
635 uint8_t audio_level;
636 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
637}
638
danilchap1edb7ab2016-04-20 05:25:10 -0700639TEST(RtpPacketTest, ParseWithAllFeatures) {
640 RtpPacketToSend::ExtensionManager extensions;
641 extensions.Register(kRtpExtensionTransmissionTimeOffset,
642 kTransmissionOffsetExtensionId);
643 RtpPacketReceived packet(&extensions);
644 EXPECT_TRUE(packet.Parse(kPacket, sizeof(kPacket)));
645 EXPECT_EQ(kPayloadType, packet.PayloadType());
646 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
647 EXPECT_EQ(kTimestamp, packet.Timestamp());
648 EXPECT_EQ(kSsrc, packet.Ssrc());
649 EXPECT_THAT(packet.Csrcs(), ElementsAreArray(kCsrcs));
danilchap96c15872016-11-21 01:35:29 -0800650 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap1edb7ab2016-04-20 05:25:10 -0700651 EXPECT_EQ(kPacketPaddingSize, packet.padding_size());
652 int32_t time_offset;
653 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
654}
655
Johannes Kron07ba2b92018-09-26 13:33:35 +0200656TEST(RtpPacketTest, ParseTwoByteHeaderExtension) {
657 RtpPacketToSend::ExtensionManager extensions;
658 extensions.Register(kRtpExtensionTransmissionTimeOffset, kTwoByteExtensionId);
659 RtpPacketReceived packet(&extensions);
660 EXPECT_TRUE(packet.Parse(kPacketWithTwoByteHeaderExtension,
661 sizeof(kPacketWithTwoByteHeaderExtension)));
662 int32_t time_offset;
663 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
664 EXPECT_EQ(kTimeOffset, time_offset);
665}
666
667TEST(RtpPacketTest, ParseLongTwoByteHeaderExtension) {
668 RtpPacketToSend::ExtensionManager extensions;
669 extensions.Register(kRtpExtensionMid, kTwoByteExtensionId);
670 RtpPacketReceived packet(&extensions);
671 EXPECT_TRUE(packet.Parse(kPacketWithLongTwoByteHeaderExtension,
672 sizeof(kPacketWithLongTwoByteHeaderExtension)));
673 std::string long_rtp_mid;
674 EXPECT_TRUE(packet.GetExtension<RtpMid>(&long_rtp_mid));
675 EXPECT_EQ(kLongMid, long_rtp_mid);
676}
677
678TEST(RtpPacketTest, ParseTwoByteHeaderExtensionWithPadding) {
679 RtpPacketToSend::ExtensionManager extensions;
680 extensions.Register(kRtpExtensionTransmissionTimeOffset, kTwoByteExtensionId);
681 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
682 RtpPacketReceived packet(&extensions);
683 EXPECT_TRUE(
684 packet.Parse(kPacketWithTwoByteHeaderExtensionWithPadding,
685 sizeof(kPacketWithTwoByteHeaderExtensionWithPadding)));
686 int32_t time_offset;
687 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
688 EXPECT_EQ(kTimeOffset, time_offset);
689 bool voice_active;
690 uint8_t audio_level;
691 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
692 EXPECT_EQ(kVoiceActive, voice_active);
693 EXPECT_EQ(kAudioLevel, audio_level);
694}
695
danilchap1edb7ab2016-04-20 05:25:10 -0700696TEST(RtpPacketTest, ParseWithExtensionDelayed) {
697 RtpPacketReceived packet;
698 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
699 EXPECT_EQ(kPayloadType, packet.PayloadType());
700 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
701 EXPECT_EQ(kTimestamp, packet.Timestamp());
702 EXPECT_EQ(kSsrc, packet.Ssrc());
703
704 RtpPacketToSend::ExtensionManager extensions;
705 extensions.Register(kRtpExtensionTransmissionTimeOffset,
706 kTransmissionOffsetExtensionId);
707
708 int32_t time_offset;
709 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
danilchap70f39a32016-12-16 05:48:18 -0800710 packet.IdentifyExtensions(extensions);
danilchap1edb7ab2016-04-20 05:25:10 -0700711 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
712 EXPECT_EQ(kTimeOffset, time_offset);
713 EXPECT_EQ(0u, packet.payload_size());
714 EXPECT_EQ(0u, packet.padding_size());
715}
716
danilchapef8d7732017-04-19 02:59:48 -0700717TEST(RtpPacketTest, ParseDynamicSizeExtension) {
718 // clang-format off
719 const uint8_t kPacket1[] = {
eladalonae550e32017-05-24 08:28:13 -0700720 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700721 0x65, 0x43, 0x12, 0x78, // Timestamp.
722 0x12, 0x34, 0x56, 0x78, // Ssrc.
723 0xbe, 0xde, 0x00, 0x02, // Extensions block of size 2x32bit words.
724 0x21, 'H', 'D', // Extension with id = 2, size = (1+1).
725 0x12, 'r', 't', 'x', // Extension with id = 1, size = (2+1).
726 0x00}; // Extension padding.
727 const uint8_t kPacket2[] = {
eladalonae550e32017-05-24 08:28:13 -0700728 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700729 0x65, 0x43, 0x12, 0x78, // Timestamp.
730 0x12, 0x34, 0x56, 0x79, // Ssrc.
731 0xbe, 0xde, 0x00, 0x01, // Extensions block of size 1x32bit words.
732 0x11, 'H', 'D', // Extension with id = 1, size = (1+1).
733 0x00}; // Extension padding.
734 // clang-format on
735 RtpPacketReceived::ExtensionManager extensions;
736 extensions.Register<RtpStreamId>(1);
737 extensions.Register<RepairedRtpStreamId>(2);
738 RtpPacketReceived packet(&extensions);
739 ASSERT_TRUE(packet.Parse(kPacket1, sizeof(kPacket1)));
740
741 std::string rsid;
742 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
743 EXPECT_EQ(rsid, "rtx");
744
745 std::string repaired_rsid;
746 EXPECT_TRUE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
747 EXPECT_EQ(repaired_rsid, "HD");
748
749 // Parse another packet with RtpStreamId extension of different size.
750 ASSERT_TRUE(packet.Parse(kPacket2, sizeof(kPacket2)));
751 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
752 EXPECT_EQ(rsid, "HD");
753 EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
754}
755
Steve Antona3251dd2017-07-21 09:58:31 -0700756TEST(RtpPacketTest, ParseWithMid) {
757 RtpPacketReceived::ExtensionManager extensions;
758 extensions.Register<RtpMid>(kRtpMidExtensionId);
759 RtpPacketReceived packet(&extensions);
760 ASSERT_TRUE(packet.Parse(kPacketWithMid, sizeof(kPacketWithMid)));
761
762 std::string mid;
763 EXPECT_TRUE(packet.GetExtension<RtpMid>(&mid));
764 EXPECT_EQ(mid, kMid);
765}
766
sprangba050a62017-08-18 02:51:12 -0700767TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) {
768 // Create a packet with video frame timing extension populated.
769 RtpPacketToSend::ExtensionManager send_extensions;
770 send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId);
771 RtpPacketToSend send_packet(&send_extensions);
772 send_packet.SetPayloadType(kPayloadType);
773 send_packet.SetSequenceNumber(kSeqNum);
774 send_packet.SetTimestamp(kTimestamp);
775 send_packet.SetSsrc(kSsrc);
776
777 VideoSendTiming timing;
778 timing.encode_start_delta_ms = 1;
779 timing.encode_finish_delta_ms = 2;
780 timing.packetization_finish_delta_ms = 3;
781 timing.pacer_exit_delta_ms = 4;
782 timing.flags =
Ilya Nikolaevskiyb6c462d2018-06-05 15:21:32 +0200783 VideoSendTiming::kTriggeredByTimer | VideoSendTiming::kTriggeredBySize;
sprangba050a62017-08-18 02:51:12 -0700784
785 send_packet.SetExtension<VideoTimingExtension>(timing);
786
787 // Serialize the packet and then parse it again.
788 RtpPacketReceived::ExtensionManager extensions;
789 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
790 RtpPacketReceived receive_packet(&extensions);
791 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
792
793 VideoSendTiming receivied_timing;
794 EXPECT_TRUE(
795 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing));
796
797 // Only check first and last timestamp (covered by other tests) plus flags.
798 EXPECT_EQ(receivied_timing.encode_start_delta_ms,
799 timing.encode_start_delta_ms);
800 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, timing.pacer_exit_delta_ms);
801 EXPECT_EQ(receivied_timing.flags, timing.flags);
802}
803
804TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) {
805 // Parse the modified packet.
806 RtpPacketReceived::ExtensionManager extensions;
807 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
808 RtpPacketReceived packet(&extensions);
809 EXPECT_TRUE(packet.Parse(kPacketWithLegacyTimingExtension,
810 sizeof(kPacketWithLegacyTimingExtension)));
811 VideoSendTiming receivied_timing;
812 EXPECT_TRUE(packet.GetExtension<VideoTimingExtension>(&receivied_timing));
813
814 // Check first and last timestamp are still OK. Flags should now be 0.
815 EXPECT_EQ(receivied_timing.encode_start_delta_ms, 1);
816 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, 4);
817 EXPECT_EQ(receivied_timing.flags, 0);
818}
819
Johannes Kron09d65882018-11-27 14:36:41 +0100820TEST(RtpPacketTest, CreateAndParseColorSpaceExtension) {
821 TestCreateAndParseColorSpaceExtension(/*with_hdr_metadata=*/true);
822}
Johannes Kronad1d9f02018-11-09 11:12:36 +0100823
Johannes Kron09d65882018-11-27 14:36:41 +0100824TEST(RtpPacketTest, CreateAndParseColorSpaceExtensionWithoutHdrMetadata) {
825 TestCreateAndParseColorSpaceExtension(/*with_hdr_metadata=*/false);
Johannes Kronad1d9f02018-11-09 11:12:36 +0100826}
827
Chen Xingcd8a6e22019-07-01 10:56:51 +0200828TEST(RtpPacketTest, CreateAndParseAbsoluteCaptureTime) {
829 // Create a packet with absolute capture time extension populated.
830 RtpPacketToSend::ExtensionManager extensions;
831 constexpr int kExtensionId = 1;
832 extensions.Register<AbsoluteCaptureTimeExtension>(kExtensionId);
833 RtpPacketToSend send_packet(&extensions);
834 send_packet.SetPayloadType(kPayloadType);
835 send_packet.SetSequenceNumber(kSeqNum);
836 send_packet.SetTimestamp(kTimestamp);
837 send_packet.SetSsrc(kSsrc);
838
839 constexpr AbsoluteCaptureTime kAbsoluteCaptureTime{
840 /*absolute_capture_timestamp=*/9876543210123456789ULL,
841 /*estimated_capture_clock_offset=*/-1234567890987654321LL};
842 send_packet.SetExtension<AbsoluteCaptureTimeExtension>(kAbsoluteCaptureTime);
843
844 // Serialize the packet and then parse it again.
845 RtpPacketReceived receive_packet(&extensions);
846 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
847
848 AbsoluteCaptureTime received_absolute_capture_time;
849 EXPECT_TRUE(receive_packet.GetExtension<AbsoluteCaptureTimeExtension>(
850 &received_absolute_capture_time));
851 EXPECT_EQ(kAbsoluteCaptureTime.absolute_capture_timestamp,
852 received_absolute_capture_time.absolute_capture_timestamp);
853 EXPECT_EQ(kAbsoluteCaptureTime.estimated_capture_clock_offset,
854 received_absolute_capture_time.estimated_capture_clock_offset);
855}
856
857TEST(RtpPacketTest,
858 CreateAndParseAbsoluteCaptureTimeWithoutEstimatedCaptureClockOffset) {
859 // Create a packet with absolute capture time extension populated.
860 RtpPacketToSend::ExtensionManager extensions;
861 constexpr int kExtensionId = 1;
862 extensions.Register<AbsoluteCaptureTimeExtension>(kExtensionId);
863 RtpPacketToSend send_packet(&extensions);
864 send_packet.SetPayloadType(kPayloadType);
865 send_packet.SetSequenceNumber(kSeqNum);
866 send_packet.SetTimestamp(kTimestamp);
867 send_packet.SetSsrc(kSsrc);
868
869 constexpr AbsoluteCaptureTime kAbsoluteCaptureTime{
870 /*absolute_capture_timestamp=*/9876543210123456789ULL,
871 /*estimated_capture_clock_offset=*/absl::nullopt};
872 send_packet.SetExtension<AbsoluteCaptureTimeExtension>(kAbsoluteCaptureTime);
873
874 // Serialize the packet and then parse it again.
875 RtpPacketReceived receive_packet(&extensions);
876 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
877
878 AbsoluteCaptureTime received_absolute_capture_time;
879 EXPECT_TRUE(receive_packet.GetExtension<AbsoluteCaptureTimeExtension>(
880 &received_absolute_capture_time));
881 EXPECT_EQ(kAbsoluteCaptureTime.absolute_capture_timestamp,
882 received_absolute_capture_time.absolute_capture_timestamp);
883 EXPECT_EQ(kAbsoluteCaptureTime.estimated_capture_clock_offset,
884 received_absolute_capture_time.estimated_capture_clock_offset);
885}
886
Johannes Kron54047be2019-02-21 14:09:20 +0000887TEST(RtpPacketTest, CreateAndParseTransportSequenceNumber) {
888 // Create a packet with transport sequence number extension populated.
889 RtpPacketToSend::ExtensionManager extensions;
890 constexpr int kExtensionId = 1;
891 extensions.Register<TransportSequenceNumber>(kExtensionId);
892 RtpPacketToSend send_packet(&extensions);
893 send_packet.SetPayloadType(kPayloadType);
894 send_packet.SetSequenceNumber(kSeqNum);
895 send_packet.SetTimestamp(kTimestamp);
896 send_packet.SetSsrc(kSsrc);
897
898 constexpr int kTransportSequenceNumber = 12345;
899 send_packet.SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
900
901 // Serialize the packet and then parse it again.
902 RtpPacketReceived receive_packet(&extensions);
903 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
904
905 uint16_t received_transport_sequeunce_number;
906 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumber>(
907 &received_transport_sequeunce_number));
908 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
909}
910
Johannes Kron0da25a12019-03-06 09:34:13 +0100911TEST(RtpPacketTest, CreateAndParseTransportSequenceNumberV2) {
912 // Create a packet with transport sequence number V2 extension populated.
913 // No feedback request means that the extension will be two bytes unless it's
914 // pre-allocated.
915 RtpPacketToSend::ExtensionManager extensions;
916 constexpr int kExtensionId = 1;
917 extensions.Register<TransportSequenceNumberV2>(kExtensionId);
918 RtpPacketToSend send_packet(&extensions);
919 send_packet.SetPayloadType(kPayloadType);
920 send_packet.SetSequenceNumber(kSeqNum);
921 send_packet.SetTimestamp(kTimestamp);
922 send_packet.SetSsrc(kSsrc);
923
924 constexpr int kTransportSequenceNumber = 12345;
925 send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
926 absl::nullopt);
927 EXPECT_EQ(send_packet.GetRawExtension<TransportSequenceNumberV2>().size(),
928 2u);
929
930 // Serialize the packet and then parse it again.
931 RtpPacketReceived receive_packet(&extensions);
932 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
933
934 uint16_t received_transport_sequeunce_number;
935 absl::optional<FeedbackRequest> received_feedback_request;
936 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
937 &received_transport_sequeunce_number, &received_feedback_request));
938 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
939 EXPECT_FALSE(received_feedback_request);
940}
941
942TEST(RtpPacketTest, CreateAndParseTransportSequenceNumberV2Preallocated) {
943 // Create a packet with transport sequence number V2 extension populated.
944 // No feedback request means that the extension could be two bytes, but since
945 // it's pre-allocated we don't know if it is with or without feedback request
946 // therefore the size is four bytes.
947 RtpPacketToSend::ExtensionManager extensions;
948 constexpr int kExtensionId = 1;
949 extensions.Register<TransportSequenceNumberV2>(kExtensionId);
950 RtpPacketToSend send_packet(&extensions);
951 send_packet.SetPayloadType(kPayloadType);
952 send_packet.SetSequenceNumber(kSeqNum);
953 send_packet.SetTimestamp(kTimestamp);
954 send_packet.SetSsrc(kSsrc);
955
956 constexpr int kTransportSequenceNumber = 12345;
957 constexpr absl::optional<FeedbackRequest> kNoFeedbackRequest =
958 FeedbackRequest{/*include_timestamps=*/false, /*sequence_count=*/0};
959 send_packet.ReserveExtension<TransportSequenceNumberV2>();
960 send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
961 kNoFeedbackRequest);
962 EXPECT_EQ(send_packet.GetRawExtension<TransportSequenceNumberV2>().size(),
963 4u);
964
965 // Serialize the packet and then parse it again.
966 RtpPacketReceived receive_packet(&extensions);
967 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
968
969 uint16_t received_transport_sequeunce_number;
970 absl::optional<FeedbackRequest> received_feedback_request;
971 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
972 &received_transport_sequeunce_number, &received_feedback_request));
973 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
974 EXPECT_FALSE(received_feedback_request);
975}
976
977TEST(RtpPacketTest,
978 CreateAndParseTransportSequenceNumberV2WithFeedbackRequest) {
Johannes Kron54047be2019-02-21 14:09:20 +0000979 // Create a packet with TransportSequenceNumberV2 extension populated.
980 RtpPacketToSend::ExtensionManager extensions;
981 constexpr int kExtensionId = 1;
982 extensions.Register<TransportSequenceNumberV2>(kExtensionId);
983 RtpPacketToSend send_packet(&extensions);
984 send_packet.SetPayloadType(kPayloadType);
985 send_packet.SetSequenceNumber(kSeqNum);
986 send_packet.SetTimestamp(kTimestamp);
987 send_packet.SetSsrc(kSsrc);
988
989 constexpr int kTransportSequenceNumber = 12345;
990 constexpr absl::optional<FeedbackRequest> kFeedbackRequest =
991 FeedbackRequest{/*include_timestamps=*/true, /*sequence_count=*/3};
992 send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
993 kFeedbackRequest);
994
995 // Serialize the packet and then parse it again.
996 RtpPacketReceived receive_packet(&extensions);
997 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
998
999 // Parse transport sequence number and feedback request.
1000 uint16_t received_transport_sequeunce_number;
1001 absl::optional<FeedbackRequest> received_feedback_request;
1002 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
1003 &received_transport_sequeunce_number, &received_feedback_request));
1004 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
1005 ASSERT_TRUE(received_feedback_request);
1006 EXPECT_EQ(received_feedback_request->include_timestamps,
1007 kFeedbackRequest->include_timestamps);
1008 EXPECT_EQ(received_feedback_request->sequence_count,
1009 kFeedbackRequest->sequence_count);
1010}
1011
Erik Språng1d46f9c2019-07-02 21:24:47 +02001012TEST(RtpPacketTest, IsExtensionReserved) {
1013 // Register two extensions.
1014 RtpPacketToSend::ExtensionManager extensions;
1015 extensions.Register(kRtpExtensionTransmissionTimeOffset,
1016 kTransmissionOffsetExtensionId);
1017 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
1018
1019 RtpPacketReceived packet(&extensions);
1020
1021 // Reserve slot for only one of them.
1022 EXPECT_TRUE(packet.ReserveExtension<TransmissionOffset>());
1023 // Non-registered extension cannot be reserved.
1024 EXPECT_FALSE(packet.ReserveExtension<VideoContentTypeExtension>());
1025
1026 // Only the extension that is both registered and reserved matches
1027 // IsExtensionReserved().
1028 EXPECT_FALSE(packet.IsExtensionReserved<VideoContentTypeExtension>());
1029 EXPECT_FALSE(packet.IsExtensionReserved<AudioLevel>());
1030 EXPECT_TRUE(packet.IsExtensionReserved<TransmissionOffset>());
1031}
1032
Anton Sukhanovff25b872019-07-09 13:04:07 -07001033// Tests that RtpPacket::RemoveExtension can successfully remove extensions.
1034TEST(RtpPacketTest, RemoveMultipleExtensions) {
1035 RtpPacketToSend::ExtensionManager extensions;
1036 extensions.Register(kRtpExtensionTransmissionTimeOffset,
1037 kTransmissionOffsetExtensionId);
1038 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
1039 RtpPacketToSend packet(&extensions);
1040 packet.SetPayloadType(kPayloadType);
1041 packet.SetSequenceNumber(kSeqNum);
1042 packet.SetTimestamp(kTimestamp);
1043 packet.SetSsrc(kSsrc);
1044 packet.SetExtension<TransmissionOffset>(kTimeOffset);
1045 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
1046
1047 EXPECT_THAT(kPacketWithTOAndAL,
1048 ElementsAreArray(packet.data(), packet.size()));
1049
1050 // Remove one of two extensions.
1051 EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionAudioLevel));
1052
1053 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1054
1055 // Remove remaining extension.
1056 EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionTransmissionTimeOffset));
1057
1058 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size()));
1059}
1060
1061// Tests that RtpPacket::RemoveExtension can successfully remove extension when
1062// other extensions are present but not registered.
1063TEST(RtpPacketTest, RemoveExtensionPreservesOtherUnregisteredExtensions) {
1064 RtpPacketToSend::ExtensionManager extensions;
1065 extensions.Register(kRtpExtensionTransmissionTimeOffset,
1066 kTransmissionOffsetExtensionId);
1067 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
1068 RtpPacketToSend packet(&extensions);
1069 packet.SetPayloadType(kPayloadType);
1070 packet.SetSequenceNumber(kSeqNum);
1071 packet.SetTimestamp(kTimestamp);
1072 packet.SetSsrc(kSsrc);
1073 packet.SetExtension<TransmissionOffset>(kTimeOffset);
1074 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
1075
1076 EXPECT_THAT(kPacketWithTOAndAL,
1077 ElementsAreArray(packet.data(), packet.size()));
1078
1079 // "Unregister" kRtpExtensionTransmissionTimeOffset.
1080 RtpPacketToSend::ExtensionManager extensions1;
1081 extensions1.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
1082 packet.IdentifyExtensions(extensions1);
1083
1084 // Make sure we can not delete extension which is set but not registered.
1085 EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionTransmissionTimeOffset));
1086
1087 // Remove registered extension.
1088 EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionAudioLevel));
1089
1090 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1091}
1092
1093// Tests that RtpPacket::RemoveExtension fails if extension is not present or
1094// not registered and does not modify packet.
1095TEST(RtpPacketTest, RemoveExtensionFailure) {
1096 RtpPacketToSend::ExtensionManager extensions;
1097 extensions.Register(kRtpExtensionTransmissionTimeOffset,
1098 kTransmissionOffsetExtensionId);
1099 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
1100 RtpPacketToSend packet(&extensions);
1101 packet.SetPayloadType(kPayloadType);
1102 packet.SetSequenceNumber(kSeqNum);
1103 packet.SetTimestamp(kTimestamp);
1104 packet.SetSsrc(kSsrc);
1105 packet.SetExtension<TransmissionOffset>(kTimeOffset);
1106
1107 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1108
1109 // Try to remove extension, which was registered, but not set.
1110 EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionAudioLevel));
1111
1112 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1113
1114 // Try to remove extension, which was not registered.
1115 EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionPlayoutDelay));
1116
1117 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1118}
1119
danilchap1edb7ab2016-04-20 05:25:10 -07001120} // namespace webrtc