blob: 3f9fcd1113fc1599f3cf09602f1bc7dc23b82342 [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;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200217 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
danilchap1edb7ab2016-04-20 05:25:10 -0700218 RtpPacketToSend packet(&extensions);
219 packet.SetPayloadType(kPayloadType);
220 packet.SetSequenceNumber(kSeqNum);
221 packet.SetTimestamp(kTimestamp);
222 packet.SetSsrc(kSsrc);
223 packet.SetExtension<TransmissionOffset>(kTimeOffset);
224 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
225}
226
227TEST(RtpPacketTest, CreateWith2Extensions) {
228 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200229 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
230 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
danilchap1edb7ab2016-04-20 05:25:10 -0700231 RtpPacketToSend packet(&extensions);
232 packet.SetPayloadType(kPayloadType);
233 packet.SetSequenceNumber(kSeqNum);
234 packet.SetTimestamp(kTimestamp);
235 packet.SetSsrc(kSsrc);
236 packet.SetExtension<TransmissionOffset>(kTimeOffset);
237 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
238 EXPECT_THAT(kPacketWithTOAndAL,
239 ElementsAreArray(packet.data(), packet.size()));
240}
241
Johannes Kron78cdde32018-10-05 10:00:46 +0200242TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionFirst) {
Johannes Kron9581bc42018-10-23 10:17:39 +0200243 RtpPacketToSend::ExtensionManager extensions(true);
Danil Chapovalova74e4772019-09-12 17:53:04 +0200244 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
245 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
246 extensions.Register<PlayoutDelayLimits>(kTwoByteExtensionId);
Johannes Kron78cdde32018-10-05 10:00:46 +0200247 RtpPacketToSend packet(&extensions);
248 packet.SetPayloadType(kPayloadType);
249 packet.SetSequenceNumber(kSeqNum);
250 packet.SetTimestamp(kTimestamp);
251 packet.SetSsrc(kSsrc);
252 // Set extension that requires two-byte header.
253 PlayoutDelay playoutDelay = {30, 340};
254 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
255 packet.SetExtension<TransmissionOffset>(kTimeOffset);
256 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
257 EXPECT_THAT(kPacketWithTwoByteExtensionIdFirst,
258 ElementsAreArray(packet.data(), packet.size()));
259}
260
261TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionLast) {
262 // This test will trigger RtpPacket::PromoteToTwoByteHeaderExtension().
Johannes Kron9581bc42018-10-23 10:17:39 +0200263 RtpPacketToSend::ExtensionManager extensions(true);
Danil Chapovalova74e4772019-09-12 17:53:04 +0200264 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
265 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
266 extensions.Register<PlayoutDelayLimits>(kTwoByteExtensionId);
Johannes Kron78cdde32018-10-05 10:00:46 +0200267 RtpPacketToSend packet(&extensions);
268 packet.SetPayloadType(kPayloadType);
269 packet.SetSequenceNumber(kSeqNum);
270 packet.SetTimestamp(kTimestamp);
271 packet.SetSsrc(kSsrc);
272 packet.SetExtension<TransmissionOffset>(kTimeOffset);
273 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
274 EXPECT_THAT(kPacketWithTOAndAL,
275 ElementsAreArray(packet.data(), packet.size()));
276 // Set extension that requires two-byte header.
277 PlayoutDelay playoutDelay = {30, 340};
278 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
279 EXPECT_THAT(kPacketWithTwoByteExtensionIdLast,
280 ElementsAreArray(packet.data(), packet.size()));
281}
282
erikvargae6b16192017-05-11 02:36:32 -0700283TEST(RtpPacketTest, CreateWithDynamicSizedExtensions) {
284 RtpPacketToSend::ExtensionManager extensions;
285 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
286 RtpPacketToSend packet(&extensions);
287 packet.SetPayloadType(kPayloadType);
288 packet.SetSequenceNumber(kSeqNum);
289 packet.SetTimestamp(kTimestamp);
290 packet.SetSsrc(kSsrc);
291 packet.SetExtension<RtpStreamId>(kStreamId);
292 EXPECT_THAT(kPacketWithRsid, ElementsAreArray(packet.data(), packet.size()));
293}
294
295TEST(RtpPacketTest, TryToCreateWithEmptyRsid) {
296 RtpPacketToSend::ExtensionManager extensions;
297 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
298 RtpPacketToSend packet(&extensions);
299 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(""));
300}
301
302TEST(RtpPacketTest, TryToCreateWithLongRsid) {
303 RtpPacketToSend::ExtensionManager extensions;
304 constexpr char kLongStreamId[] = "LoooooooooongRsid";
305 ASSERT_EQ(strlen(kLongStreamId), 17u);
306 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
307 RtpPacketToSend packet(&extensions);
308 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kLongStreamId));
309}
310
Steve Antona3251dd2017-07-21 09:58:31 -0700311TEST(RtpPacketTest, TryToCreateWithEmptyMid) {
312 RtpPacketToSend::ExtensionManager extensions;
313 extensions.Register<RtpMid>(kRtpMidExtensionId);
314 RtpPacketToSend packet(&extensions);
315 EXPECT_FALSE(packet.SetExtension<RtpMid>(""));
316}
317
318TEST(RtpPacketTest, TryToCreateWithLongMid) {
319 RtpPacketToSend::ExtensionManager extensions;
320 constexpr char kLongMid[] = "LoooooooooonogMid";
321 ASSERT_EQ(strlen(kLongMid), 17u);
322 extensions.Register<RtpMid>(kRtpMidExtensionId);
323 RtpPacketToSend packet(&extensions);
324 EXPECT_FALSE(packet.SetExtension<RtpMid>(kLongMid));
325}
326
Johannes Kron78cdde32018-10-05 10:00:46 +0200327TEST(RtpPacketTest, TryToCreateTwoByteHeaderNotSupported) {
328 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200329 extensions.Register<AudioLevel>(kTwoByteExtensionId);
Johannes Kron78cdde32018-10-05 10:00:46 +0200330 RtpPacketToSend packet(&extensions);
331 // Set extension that requires two-byte header.
332 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
333}
334
danilchap653063f2017-04-03 06:16:30 -0700335TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) {
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200336 const std::string kValue = "123456789abcdef";
337 RtpPacket::ExtensionManager extensions;
338 extensions.Register<RtpMid>(1);
339 extensions.Register<RtpStreamId>(2);
danilchap653063f2017-04-03 06:16:30 -0700340
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200341 RtpPacket packet(&extensions);
342 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700343
344 packet.SetPayloadSize(42);
345 // Rewriting allocated extension is allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200346 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700347 // Adding another extension after payload is set is not allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200348 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700349
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200350 // Read packet with the extension.
351 RtpPacketReceived parsed(&extensions);
danilchap653063f2017-04-03 06:16:30 -0700352 EXPECT_TRUE(parsed.Parse(packet.Buffer()));
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200353 std::string read;
354 EXPECT_TRUE(parsed.GetExtension<RtpMid>(&read));
355 EXPECT_EQ(read, kValue);
danilchap653063f2017-04-03 06:16:30 -0700356}
357
danilchap1edb7ab2016-04-20 05:25:10 -0700358TEST(RtpPacketTest, SetReservedExtensionsAfterPayload) {
359 const size_t kPayloadSize = 4;
360 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200361 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
362 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
danilchap1edb7ab2016-04-20 05:25:10 -0700363 RtpPacketToSend packet(&extensions);
364
365 EXPECT_TRUE(packet.ReserveExtension<TransmissionOffset>());
danilchap07a01b32017-03-29 07:33:13 -0700366 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700367 // Can't set extension after payload.
368 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
369 // Unless reserved.
370 EXPECT_TRUE(packet.SetExtension<TransmissionOffset>(kTimeOffset));
371}
372
373TEST(RtpPacketTest, CreatePurePadding) {
374 const size_t kPaddingSize = kMaxPaddingSize - 1;
375 RtpPacketToSend packet(nullptr, 12 + kPaddingSize);
376 packet.SetPayloadType(kPayloadType);
377 packet.SetSequenceNumber(kSeqNum);
378 packet.SetTimestamp(kTimestamp);
379 packet.SetSsrc(kSsrc);
danilchap1edb7ab2016-04-20 05:25:10 -0700380
381 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200382 EXPECT_FALSE(packet.SetPadding(kPaddingSize + 1));
383 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700384 EXPECT_EQ(packet.size(), packet.capacity());
385}
386
387TEST(RtpPacketTest, CreateUnalignedPadding) {
388 const size_t kPayloadSize = 3; // Make padding start at unaligned address.
389 RtpPacketToSend packet(nullptr, 12 + kPayloadSize + kMaxPaddingSize);
390 packet.SetPayloadType(kPayloadType);
391 packet.SetSequenceNumber(kSeqNum);
392 packet.SetTimestamp(kTimestamp);
393 packet.SetSsrc(kSsrc);
danilchap07a01b32017-03-29 07:33:13 -0700394 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700395
396 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200397 EXPECT_TRUE(packet.SetPadding(kMaxPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700398 EXPECT_EQ(packet.size(), packet.capacity());
399}
400
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200401TEST(RtpPacketTest, WritesPaddingSizeToLastByte) {
402 const size_t kPaddingSize = 5;
403 RtpPacket packet;
404
405 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
406 EXPECT_EQ(packet.data()[packet.size() - 1], kPaddingSize);
407}
408
409TEST(RtpPacketTest, UsesZerosForPadding) {
410 const size_t kPaddingSize = 5;
411 RtpPacket packet;
412
413 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
414 EXPECT_THAT(rtc::MakeArrayView(packet.data() + 12, kPaddingSize - 1),
415 Each(0));
416}
417
418TEST(RtpPacketTest, CreateOneBytePadding) {
419 size_t kPayloadSize = 123;
420 RtpPacket packet(nullptr, 12 + kPayloadSize + 1);
421 packet.SetPayloadSize(kPayloadSize);
422
423 EXPECT_TRUE(packet.SetPadding(1));
424
425 EXPECT_EQ(packet.size(), 12 + kPayloadSize + 1);
426 EXPECT_EQ(packet.padding_size(), 1u);
427}
428
429TEST(RtpPacketTest, FailsToAddPaddingWithoutCapacity) {
430 size_t kPayloadSize = 123;
431 RtpPacket packet(nullptr, 12 + kPayloadSize);
432 packet.SetPayloadSize(kPayloadSize);
433
434 EXPECT_FALSE(packet.SetPadding(1));
435}
436
danilchap1edb7ab2016-04-20 05:25:10 -0700437TEST(RtpPacketTest, ParseMinimum) {
438 RtpPacketReceived packet;
439 EXPECT_TRUE(packet.Parse(kMinimumPacket, sizeof(kMinimumPacket)));
440 EXPECT_EQ(kPayloadType, packet.PayloadType());
441 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
442 EXPECT_EQ(kTimestamp, packet.Timestamp());
443 EXPECT_EQ(kSsrc, packet.Ssrc());
444 EXPECT_EQ(0u, packet.padding_size());
445 EXPECT_EQ(0u, packet.payload_size());
446}
447
448TEST(RtpPacketTest, ParseBuffer) {
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200449 rtc::CopyOnWriteBuffer unparsed(kMinimumPacket);
danilchap1edb7ab2016-04-20 05:25:10 -0700450 const uint8_t* raw = unparsed.data();
451
452 RtpPacketReceived packet;
453 EXPECT_TRUE(packet.Parse(std::move(unparsed)));
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200454 EXPECT_EQ(raw, packet.data()); // Expect packet take the buffer without copy.
danilchap1edb7ab2016-04-20 05:25:10 -0700455 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
456 EXPECT_EQ(kTimestamp, packet.Timestamp());
457 EXPECT_EQ(kSsrc, packet.Ssrc());
458 EXPECT_EQ(0u, packet.padding_size());
459 EXPECT_EQ(0u, packet.payload_size());
460}
461
462TEST(RtpPacketTest, ParseWithExtension) {
463 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200464 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
danilchap1edb7ab2016-04-20 05:25:10 -0700465
466 RtpPacketReceived packet(&extensions);
467 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
468 EXPECT_EQ(kPayloadType, packet.PayloadType());
469 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
470 EXPECT_EQ(kTimestamp, packet.Timestamp());
471 EXPECT_EQ(kSsrc, packet.Ssrc());
472 int32_t time_offset;
473 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
474 EXPECT_EQ(kTimeOffset, time_offset);
475 EXPECT_EQ(0u, packet.payload_size());
476 EXPECT_EQ(0u, packet.padding_size());
477}
478
Danil Chapovalovc5dd3002018-11-08 15:12:45 +0100479TEST(RtpPacketTest, GetExtensionWithoutParametersReturnsOptionalValue) {
480 RtpPacket::ExtensionManager extensions;
481 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
482 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
483
484 RtpPacketReceived packet(&extensions);
485 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
486
487 auto time_offset = packet.GetExtension<TransmissionOffset>();
488 static_assert(
489 std::is_same<decltype(time_offset),
490 absl::optional<TransmissionOffset::value_type>>::value,
491 "");
492 EXPECT_EQ(time_offset, kTimeOffset);
493 EXPECT_FALSE(packet.GetExtension<RtpStreamId>().has_value());
494}
495
Danil Chapovalove19953b2018-10-01 16:12:28 +0200496TEST(RtpPacketTest, GetRawExtensionWhenPresent) {
497 constexpr uint8_t kRawPacket[] = {
498 // comment for clang-format to align kRawPacket nicer.
499 0x90, 100, 0x5e, 0x04, //
500 0x65, 0x43, 0x12, 0x78, // Timestamp.
501 0x12, 0x34, 0x56, 0x78, // Ssrc
502 0xbe, 0xde, 0x00, 0x01, // Extension header
503 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
504 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
505 RtpPacketToSend::ExtensionManager extensions;
506 extensions.Register<RtpMid>(1);
507 RtpPacket packet(&extensions);
508 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
509 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), ElementsAre('m', 'i', 'd'));
510}
511
512TEST(RtpPacketTest, GetRawExtensionWhenAbsent) {
513 constexpr uint8_t kRawPacket[] = {
514 // comment for clang-format to align kRawPacket nicer.
515 0x90, 100, 0x5e, 0x04, //
516 0x65, 0x43, 0x12, 0x78, // Timestamp.
517 0x12, 0x34, 0x56, 0x78, // Ssrc
518 0xbe, 0xde, 0x00, 0x01, // Extension header
519 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
520 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
521 RtpPacketToSend::ExtensionManager extensions;
522 extensions.Register<RtpMid>(2);
523 RtpPacket packet(&extensions);
524 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
525 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), IsEmpty());
526}
527
danilchap07ec26d2016-06-17 04:18:54 -0700528TEST(RtpPacketTest, ParseWithInvalidSizedExtension) {
529 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200530 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
danilchap07ec26d2016-06-17 04:18:54 -0700531
532 RtpPacketReceived packet(&extensions);
533 EXPECT_TRUE(packet.Parse(kPacketWithInvalidExtension,
534 sizeof(kPacketWithInvalidExtension)));
535
536 // Extension should be ignored.
537 int32_t time_offset;
538 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
539
540 // But shouldn't prevent reading payload.
danilchap96c15872016-11-21 01:35:29 -0800541 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap07ec26d2016-06-17 04:18:54 -0700542}
543
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200544TEST(RtpPacketTest, ParseWithOverSizedExtension) {
545 // clang-format off
546 const uint8_t bad_packet[] = {
eladalonae550e32017-05-24 08:28:13 -0700547 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200548 0x65, 0x43, 0x12, 0x78, // kTimestamp.
549 0x12, 0x34, 0x56, 0x78, // kSsrc.
550 0xbe, 0xde, 0x00, 0x01, // Extension of size 1x32bit word.
551 0x00, // Add a byte of padding.
552 0x12, // Extension id 1 size (2+1).
553 0xda, 0x1a // Only 2 bytes of extension payload.
554 };
555 // clang-format on
556 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200557 extensions.Register<TransmissionOffset>(1);
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200558 RtpPacketReceived packet(&extensions);
559
560 // Parse should ignore bad extension and proceed.
561 EXPECT_TRUE(packet.Parse(bad_packet, sizeof(bad_packet)));
562 int32_t time_offset;
563 // But extracting extension should fail.
564 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
565}
566
danilchap1edb7ab2016-04-20 05:25:10 -0700567TEST(RtpPacketTest, ParseWith2Extensions) {
568 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200569 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
570 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
danilchap1edb7ab2016-04-20 05:25:10 -0700571 RtpPacketReceived packet(&extensions);
572 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
573 int32_t time_offset;
574 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
575 EXPECT_EQ(kTimeOffset, time_offset);
576 bool voice_active;
577 uint8_t audio_level;
578 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
579 EXPECT_EQ(kVoiceActive, voice_active);
580 EXPECT_EQ(kAudioLevel, audio_level);
581}
582
Johannes Kron6ea77192018-09-24 17:19:52 +0200583TEST(RtpPacketTest, ParseSecondPacketWithFewerExtensions) {
584 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200585 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
586 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
Johannes Kron6ea77192018-09-24 17:19:52 +0200587 RtpPacketReceived packet(&extensions);
588 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
589 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
590 EXPECT_TRUE(packet.HasExtension<AudioLevel>());
591
592 // Second packet without audio level.
593 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
594 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
595 EXPECT_FALSE(packet.HasExtension<AudioLevel>());
596}
597
Johannes Kron07ba2b92018-09-26 13:33:35 +0200598TEST(RtpPacketTest, ParseWith2ExtensionsInvalidPadding) {
599 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200600 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
601 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
Johannes Kron07ba2b92018-09-26 13:33:35 +0200602 RtpPacketReceived packet(&extensions);
603 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALInvalidPadding,
604 sizeof(kPacketWithTOAndALInvalidPadding)));
605 int32_t time_offset;
606 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
607 EXPECT_EQ(kTimeOffset, time_offset);
608 bool voice_active;
609 uint8_t audio_level;
610 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
611}
612
613TEST(RtpPacketTest, ParseWith2ExtensionsReservedExtensionId) {
614 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200615 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
616 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
Johannes Kron07ba2b92018-09-26 13:33:35 +0200617 RtpPacketReceived packet(&extensions);
618 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALReservedExtensionId,
619 sizeof(kPacketWithTOAndALReservedExtensionId)));
620 int32_t time_offset;
621 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
622 EXPECT_EQ(kTimeOffset, time_offset);
623 bool voice_active;
624 uint8_t audio_level;
625 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
626}
627
danilchap1edb7ab2016-04-20 05:25:10 -0700628TEST(RtpPacketTest, ParseWithAllFeatures) {
629 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200630 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
danilchap1edb7ab2016-04-20 05:25:10 -0700631 RtpPacketReceived packet(&extensions);
632 EXPECT_TRUE(packet.Parse(kPacket, sizeof(kPacket)));
633 EXPECT_EQ(kPayloadType, packet.PayloadType());
634 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
635 EXPECT_EQ(kTimestamp, packet.Timestamp());
636 EXPECT_EQ(kSsrc, packet.Ssrc());
637 EXPECT_THAT(packet.Csrcs(), ElementsAreArray(kCsrcs));
danilchap96c15872016-11-21 01:35:29 -0800638 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap1edb7ab2016-04-20 05:25:10 -0700639 EXPECT_EQ(kPacketPaddingSize, packet.padding_size());
640 int32_t time_offset;
641 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
642}
643
Johannes Kron07ba2b92018-09-26 13:33:35 +0200644TEST(RtpPacketTest, ParseTwoByteHeaderExtension) {
645 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200646 extensions.Register<TransmissionOffset>(kTwoByteExtensionId);
Johannes Kron07ba2b92018-09-26 13:33:35 +0200647 RtpPacketReceived packet(&extensions);
648 EXPECT_TRUE(packet.Parse(kPacketWithTwoByteHeaderExtension,
649 sizeof(kPacketWithTwoByteHeaderExtension)));
650 int32_t time_offset;
651 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
652 EXPECT_EQ(kTimeOffset, time_offset);
653}
654
655TEST(RtpPacketTest, ParseLongTwoByteHeaderExtension) {
656 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200657 extensions.Register<RtpMid>(kTwoByteExtensionId);
Johannes Kron07ba2b92018-09-26 13:33:35 +0200658 RtpPacketReceived packet(&extensions);
659 EXPECT_TRUE(packet.Parse(kPacketWithLongTwoByteHeaderExtension,
660 sizeof(kPacketWithLongTwoByteHeaderExtension)));
661 std::string long_rtp_mid;
662 EXPECT_TRUE(packet.GetExtension<RtpMid>(&long_rtp_mid));
663 EXPECT_EQ(kLongMid, long_rtp_mid);
664}
665
666TEST(RtpPacketTest, ParseTwoByteHeaderExtensionWithPadding) {
667 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200668 extensions.Register<TransmissionOffset>(kTwoByteExtensionId);
669 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
Johannes Kron07ba2b92018-09-26 13:33:35 +0200670 RtpPacketReceived packet(&extensions);
671 EXPECT_TRUE(
672 packet.Parse(kPacketWithTwoByteHeaderExtensionWithPadding,
673 sizeof(kPacketWithTwoByteHeaderExtensionWithPadding)));
674 int32_t time_offset;
675 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
676 EXPECT_EQ(kTimeOffset, time_offset);
677 bool voice_active;
678 uint8_t audio_level;
679 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
680 EXPECT_EQ(kVoiceActive, voice_active);
681 EXPECT_EQ(kAudioLevel, audio_level);
682}
683
danilchap1edb7ab2016-04-20 05:25:10 -0700684TEST(RtpPacketTest, ParseWithExtensionDelayed) {
685 RtpPacketReceived packet;
686 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
687 EXPECT_EQ(kPayloadType, packet.PayloadType());
688 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
689 EXPECT_EQ(kTimestamp, packet.Timestamp());
690 EXPECT_EQ(kSsrc, packet.Ssrc());
691
692 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200693 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
danilchap1edb7ab2016-04-20 05:25:10 -0700694
695 int32_t time_offset;
696 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
danilchap70f39a32016-12-16 05:48:18 -0800697 packet.IdentifyExtensions(extensions);
danilchap1edb7ab2016-04-20 05:25:10 -0700698 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
699 EXPECT_EQ(kTimeOffset, time_offset);
700 EXPECT_EQ(0u, packet.payload_size());
701 EXPECT_EQ(0u, packet.padding_size());
702}
703
danilchapef8d7732017-04-19 02:59:48 -0700704TEST(RtpPacketTest, ParseDynamicSizeExtension) {
705 // clang-format off
706 const uint8_t kPacket1[] = {
eladalonae550e32017-05-24 08:28:13 -0700707 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700708 0x65, 0x43, 0x12, 0x78, // Timestamp.
709 0x12, 0x34, 0x56, 0x78, // Ssrc.
710 0xbe, 0xde, 0x00, 0x02, // Extensions block of size 2x32bit words.
711 0x21, 'H', 'D', // Extension with id = 2, size = (1+1).
712 0x12, 'r', 't', 'x', // Extension with id = 1, size = (2+1).
713 0x00}; // Extension padding.
714 const uint8_t kPacket2[] = {
eladalonae550e32017-05-24 08:28:13 -0700715 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700716 0x65, 0x43, 0x12, 0x78, // Timestamp.
717 0x12, 0x34, 0x56, 0x79, // Ssrc.
718 0xbe, 0xde, 0x00, 0x01, // Extensions block of size 1x32bit words.
719 0x11, 'H', 'D', // Extension with id = 1, size = (1+1).
720 0x00}; // Extension padding.
721 // clang-format on
722 RtpPacketReceived::ExtensionManager extensions;
723 extensions.Register<RtpStreamId>(1);
724 extensions.Register<RepairedRtpStreamId>(2);
725 RtpPacketReceived packet(&extensions);
726 ASSERT_TRUE(packet.Parse(kPacket1, sizeof(kPacket1)));
727
728 std::string rsid;
729 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
730 EXPECT_EQ(rsid, "rtx");
731
732 std::string repaired_rsid;
733 EXPECT_TRUE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
734 EXPECT_EQ(repaired_rsid, "HD");
735
736 // Parse another packet with RtpStreamId extension of different size.
737 ASSERT_TRUE(packet.Parse(kPacket2, sizeof(kPacket2)));
738 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
739 EXPECT_EQ(rsid, "HD");
740 EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
741}
742
Steve Antona3251dd2017-07-21 09:58:31 -0700743TEST(RtpPacketTest, ParseWithMid) {
744 RtpPacketReceived::ExtensionManager extensions;
745 extensions.Register<RtpMid>(kRtpMidExtensionId);
746 RtpPacketReceived packet(&extensions);
747 ASSERT_TRUE(packet.Parse(kPacketWithMid, sizeof(kPacketWithMid)));
748
749 std::string mid;
750 EXPECT_TRUE(packet.GetExtension<RtpMid>(&mid));
751 EXPECT_EQ(mid, kMid);
752}
753
sprangba050a62017-08-18 02:51:12 -0700754TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) {
755 // Create a packet with video frame timing extension populated.
756 RtpPacketToSend::ExtensionManager send_extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +0200757 send_extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
sprangba050a62017-08-18 02:51:12 -0700758 RtpPacketToSend send_packet(&send_extensions);
759 send_packet.SetPayloadType(kPayloadType);
760 send_packet.SetSequenceNumber(kSeqNum);
761 send_packet.SetTimestamp(kTimestamp);
762 send_packet.SetSsrc(kSsrc);
763
764 VideoSendTiming timing;
765 timing.encode_start_delta_ms = 1;
766 timing.encode_finish_delta_ms = 2;
767 timing.packetization_finish_delta_ms = 3;
768 timing.pacer_exit_delta_ms = 4;
769 timing.flags =
Ilya Nikolaevskiyb6c462d2018-06-05 15:21:32 +0200770 VideoSendTiming::kTriggeredByTimer | VideoSendTiming::kTriggeredBySize;
sprangba050a62017-08-18 02:51:12 -0700771
772 send_packet.SetExtension<VideoTimingExtension>(timing);
773
774 // Serialize the packet and then parse it again.
775 RtpPacketReceived::ExtensionManager extensions;
776 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
777 RtpPacketReceived receive_packet(&extensions);
778 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
779
780 VideoSendTiming receivied_timing;
781 EXPECT_TRUE(
782 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing));
783
784 // Only check first and last timestamp (covered by other tests) plus flags.
785 EXPECT_EQ(receivied_timing.encode_start_delta_ms,
786 timing.encode_start_delta_ms);
787 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, timing.pacer_exit_delta_ms);
788 EXPECT_EQ(receivied_timing.flags, timing.flags);
789}
790
791TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) {
792 // Parse the modified packet.
793 RtpPacketReceived::ExtensionManager extensions;
794 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
795 RtpPacketReceived packet(&extensions);
796 EXPECT_TRUE(packet.Parse(kPacketWithLegacyTimingExtension,
797 sizeof(kPacketWithLegacyTimingExtension)));
798 VideoSendTiming receivied_timing;
799 EXPECT_TRUE(packet.GetExtension<VideoTimingExtension>(&receivied_timing));
800
801 // Check first and last timestamp are still OK. Flags should now be 0.
802 EXPECT_EQ(receivied_timing.encode_start_delta_ms, 1);
803 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, 4);
804 EXPECT_EQ(receivied_timing.flags, 0);
805}
806
Johannes Kron09d65882018-11-27 14:36:41 +0100807TEST(RtpPacketTest, CreateAndParseColorSpaceExtension) {
808 TestCreateAndParseColorSpaceExtension(/*with_hdr_metadata=*/true);
809}
Johannes Kronad1d9f02018-11-09 11:12:36 +0100810
Johannes Kron09d65882018-11-27 14:36:41 +0100811TEST(RtpPacketTest, CreateAndParseColorSpaceExtensionWithoutHdrMetadata) {
812 TestCreateAndParseColorSpaceExtension(/*with_hdr_metadata=*/false);
Johannes Kronad1d9f02018-11-09 11:12:36 +0100813}
814
Chen Xingcd8a6e22019-07-01 10:56:51 +0200815TEST(RtpPacketTest, CreateAndParseAbsoluteCaptureTime) {
816 // Create a packet with absolute capture time extension populated.
817 RtpPacketToSend::ExtensionManager extensions;
818 constexpr int kExtensionId = 1;
819 extensions.Register<AbsoluteCaptureTimeExtension>(kExtensionId);
820 RtpPacketToSend send_packet(&extensions);
821 send_packet.SetPayloadType(kPayloadType);
822 send_packet.SetSequenceNumber(kSeqNum);
823 send_packet.SetTimestamp(kTimestamp);
824 send_packet.SetSsrc(kSsrc);
825
826 constexpr AbsoluteCaptureTime kAbsoluteCaptureTime{
827 /*absolute_capture_timestamp=*/9876543210123456789ULL,
828 /*estimated_capture_clock_offset=*/-1234567890987654321LL};
829 send_packet.SetExtension<AbsoluteCaptureTimeExtension>(kAbsoluteCaptureTime);
830
831 // Serialize the packet and then parse it again.
832 RtpPacketReceived receive_packet(&extensions);
833 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
834
835 AbsoluteCaptureTime received_absolute_capture_time;
836 EXPECT_TRUE(receive_packet.GetExtension<AbsoluteCaptureTimeExtension>(
837 &received_absolute_capture_time));
838 EXPECT_EQ(kAbsoluteCaptureTime.absolute_capture_timestamp,
839 received_absolute_capture_time.absolute_capture_timestamp);
840 EXPECT_EQ(kAbsoluteCaptureTime.estimated_capture_clock_offset,
841 received_absolute_capture_time.estimated_capture_clock_offset);
842}
843
844TEST(RtpPacketTest,
845 CreateAndParseAbsoluteCaptureTimeWithoutEstimatedCaptureClockOffset) {
846 // Create a packet with absolute capture time extension populated.
847 RtpPacketToSend::ExtensionManager extensions;
848 constexpr int kExtensionId = 1;
849 extensions.Register<AbsoluteCaptureTimeExtension>(kExtensionId);
850 RtpPacketToSend send_packet(&extensions);
851 send_packet.SetPayloadType(kPayloadType);
852 send_packet.SetSequenceNumber(kSeqNum);
853 send_packet.SetTimestamp(kTimestamp);
854 send_packet.SetSsrc(kSsrc);
855
856 constexpr AbsoluteCaptureTime kAbsoluteCaptureTime{
857 /*absolute_capture_timestamp=*/9876543210123456789ULL,
858 /*estimated_capture_clock_offset=*/absl::nullopt};
859 send_packet.SetExtension<AbsoluteCaptureTimeExtension>(kAbsoluteCaptureTime);
860
861 // Serialize the packet and then parse it again.
862 RtpPacketReceived receive_packet(&extensions);
863 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
864
865 AbsoluteCaptureTime received_absolute_capture_time;
866 EXPECT_TRUE(receive_packet.GetExtension<AbsoluteCaptureTimeExtension>(
867 &received_absolute_capture_time));
868 EXPECT_EQ(kAbsoluteCaptureTime.absolute_capture_timestamp,
869 received_absolute_capture_time.absolute_capture_timestamp);
870 EXPECT_EQ(kAbsoluteCaptureTime.estimated_capture_clock_offset,
871 received_absolute_capture_time.estimated_capture_clock_offset);
872}
873
Johannes Kron54047be2019-02-21 14:09:20 +0000874TEST(RtpPacketTest, CreateAndParseTransportSequenceNumber) {
875 // Create a packet with transport sequence number extension populated.
876 RtpPacketToSend::ExtensionManager extensions;
877 constexpr int kExtensionId = 1;
878 extensions.Register<TransportSequenceNumber>(kExtensionId);
879 RtpPacketToSend send_packet(&extensions);
880 send_packet.SetPayloadType(kPayloadType);
881 send_packet.SetSequenceNumber(kSeqNum);
882 send_packet.SetTimestamp(kTimestamp);
883 send_packet.SetSsrc(kSsrc);
884
885 constexpr int kTransportSequenceNumber = 12345;
886 send_packet.SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
887
888 // Serialize the packet and then parse it again.
889 RtpPacketReceived receive_packet(&extensions);
890 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
891
892 uint16_t received_transport_sequeunce_number;
893 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumber>(
894 &received_transport_sequeunce_number));
895 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
896}
897
Johannes Kron0da25a12019-03-06 09:34:13 +0100898TEST(RtpPacketTest, CreateAndParseTransportSequenceNumberV2) {
899 // Create a packet with transport sequence number V2 extension populated.
900 // No feedback request means that the extension will be two bytes unless it's
901 // pre-allocated.
902 RtpPacketToSend::ExtensionManager extensions;
903 constexpr int kExtensionId = 1;
904 extensions.Register<TransportSequenceNumberV2>(kExtensionId);
905 RtpPacketToSend send_packet(&extensions);
906 send_packet.SetPayloadType(kPayloadType);
907 send_packet.SetSequenceNumber(kSeqNum);
908 send_packet.SetTimestamp(kTimestamp);
909 send_packet.SetSsrc(kSsrc);
910
911 constexpr int kTransportSequenceNumber = 12345;
912 send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
913 absl::nullopt);
914 EXPECT_EQ(send_packet.GetRawExtension<TransportSequenceNumberV2>().size(),
915 2u);
916
917 // Serialize the packet and then parse it again.
918 RtpPacketReceived receive_packet(&extensions);
919 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
920
921 uint16_t received_transport_sequeunce_number;
922 absl::optional<FeedbackRequest> received_feedback_request;
923 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
924 &received_transport_sequeunce_number, &received_feedback_request));
925 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
926 EXPECT_FALSE(received_feedback_request);
927}
928
929TEST(RtpPacketTest, CreateAndParseTransportSequenceNumberV2Preallocated) {
930 // Create a packet with transport sequence number V2 extension populated.
931 // No feedback request means that the extension could be two bytes, but since
932 // it's pre-allocated we don't know if it is with or without feedback request
933 // therefore the size is four bytes.
934 RtpPacketToSend::ExtensionManager extensions;
935 constexpr int kExtensionId = 1;
936 extensions.Register<TransportSequenceNumberV2>(kExtensionId);
937 RtpPacketToSend send_packet(&extensions);
938 send_packet.SetPayloadType(kPayloadType);
939 send_packet.SetSequenceNumber(kSeqNum);
940 send_packet.SetTimestamp(kTimestamp);
941 send_packet.SetSsrc(kSsrc);
942
943 constexpr int kTransportSequenceNumber = 12345;
944 constexpr absl::optional<FeedbackRequest> kNoFeedbackRequest =
945 FeedbackRequest{/*include_timestamps=*/false, /*sequence_count=*/0};
946 send_packet.ReserveExtension<TransportSequenceNumberV2>();
947 send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
948 kNoFeedbackRequest);
949 EXPECT_EQ(send_packet.GetRawExtension<TransportSequenceNumberV2>().size(),
950 4u);
951
952 // Serialize the packet and then parse it again.
953 RtpPacketReceived receive_packet(&extensions);
954 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
955
956 uint16_t received_transport_sequeunce_number;
957 absl::optional<FeedbackRequest> received_feedback_request;
958 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
959 &received_transport_sequeunce_number, &received_feedback_request));
960 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
961 EXPECT_FALSE(received_feedback_request);
962}
963
964TEST(RtpPacketTest,
965 CreateAndParseTransportSequenceNumberV2WithFeedbackRequest) {
Johannes Kron54047be2019-02-21 14:09:20 +0000966 // Create a packet with TransportSequenceNumberV2 extension populated.
967 RtpPacketToSend::ExtensionManager extensions;
968 constexpr int kExtensionId = 1;
969 extensions.Register<TransportSequenceNumberV2>(kExtensionId);
970 RtpPacketToSend send_packet(&extensions);
971 send_packet.SetPayloadType(kPayloadType);
972 send_packet.SetSequenceNumber(kSeqNum);
973 send_packet.SetTimestamp(kTimestamp);
974 send_packet.SetSsrc(kSsrc);
975
976 constexpr int kTransportSequenceNumber = 12345;
977 constexpr absl::optional<FeedbackRequest> kFeedbackRequest =
978 FeedbackRequest{/*include_timestamps=*/true, /*sequence_count=*/3};
979 send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
980 kFeedbackRequest);
981
982 // Serialize the packet and then parse it again.
983 RtpPacketReceived receive_packet(&extensions);
984 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
985
986 // Parse transport sequence number and feedback request.
987 uint16_t received_transport_sequeunce_number;
988 absl::optional<FeedbackRequest> received_feedback_request;
989 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
990 &received_transport_sequeunce_number, &received_feedback_request));
991 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
992 ASSERT_TRUE(received_feedback_request);
993 EXPECT_EQ(received_feedback_request->include_timestamps,
994 kFeedbackRequest->include_timestamps);
995 EXPECT_EQ(received_feedback_request->sequence_count,
996 kFeedbackRequest->sequence_count);
997}
998
Erik Språng1d46f9c2019-07-02 21:24:47 +0200999TEST(RtpPacketTest, IsExtensionReserved) {
1000 // Register two extensions.
1001 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +02001002 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
1003 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
Erik Språng1d46f9c2019-07-02 21:24:47 +02001004
1005 RtpPacketReceived packet(&extensions);
1006
1007 // Reserve slot for only one of them.
1008 EXPECT_TRUE(packet.ReserveExtension<TransmissionOffset>());
1009 // Non-registered extension cannot be reserved.
1010 EXPECT_FALSE(packet.ReserveExtension<VideoContentTypeExtension>());
1011
1012 // Only the extension that is both registered and reserved matches
1013 // IsExtensionReserved().
1014 EXPECT_FALSE(packet.IsExtensionReserved<VideoContentTypeExtension>());
1015 EXPECT_FALSE(packet.IsExtensionReserved<AudioLevel>());
1016 EXPECT_TRUE(packet.IsExtensionReserved<TransmissionOffset>());
1017}
1018
Anton Sukhanovff25b872019-07-09 13:04:07 -07001019// Tests that RtpPacket::RemoveExtension can successfully remove extensions.
1020TEST(RtpPacketTest, RemoveMultipleExtensions) {
1021 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +02001022 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
1023 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
Anton Sukhanovff25b872019-07-09 13:04:07 -07001024 RtpPacketToSend packet(&extensions);
1025 packet.SetPayloadType(kPayloadType);
1026 packet.SetSequenceNumber(kSeqNum);
1027 packet.SetTimestamp(kTimestamp);
1028 packet.SetSsrc(kSsrc);
1029 packet.SetExtension<TransmissionOffset>(kTimeOffset);
1030 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
1031
1032 EXPECT_THAT(kPacketWithTOAndAL,
1033 ElementsAreArray(packet.data(), packet.size()));
1034
1035 // Remove one of two extensions.
1036 EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionAudioLevel));
1037
1038 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1039
1040 // Remove remaining extension.
1041 EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionTransmissionTimeOffset));
1042
1043 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size()));
1044}
1045
1046// Tests that RtpPacket::RemoveExtension can successfully remove extension when
1047// other extensions are present but not registered.
1048TEST(RtpPacketTest, RemoveExtensionPreservesOtherUnregisteredExtensions) {
1049 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +02001050 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
1051 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
Anton Sukhanovff25b872019-07-09 13:04:07 -07001052 RtpPacketToSend packet(&extensions);
1053 packet.SetPayloadType(kPayloadType);
1054 packet.SetSequenceNumber(kSeqNum);
1055 packet.SetTimestamp(kTimestamp);
1056 packet.SetSsrc(kSsrc);
1057 packet.SetExtension<TransmissionOffset>(kTimeOffset);
1058 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
1059
1060 EXPECT_THAT(kPacketWithTOAndAL,
1061 ElementsAreArray(packet.data(), packet.size()));
1062
1063 // "Unregister" kRtpExtensionTransmissionTimeOffset.
1064 RtpPacketToSend::ExtensionManager extensions1;
Danil Chapovalova74e4772019-09-12 17:53:04 +02001065 extensions1.Register<AudioLevel>(kAudioLevelExtensionId);
Anton Sukhanovff25b872019-07-09 13:04:07 -07001066 packet.IdentifyExtensions(extensions1);
1067
1068 // Make sure we can not delete extension which is set but not registered.
1069 EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionTransmissionTimeOffset));
1070
1071 // Remove registered extension.
1072 EXPECT_TRUE(packet.RemoveExtension(kRtpExtensionAudioLevel));
1073
1074 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1075}
1076
1077// Tests that RtpPacket::RemoveExtension fails if extension is not present or
1078// not registered and does not modify packet.
1079TEST(RtpPacketTest, RemoveExtensionFailure) {
1080 RtpPacketToSend::ExtensionManager extensions;
Danil Chapovalova74e4772019-09-12 17:53:04 +02001081 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
1082 extensions.Register<AudioLevel>(kAudioLevelExtensionId);
Anton Sukhanovff25b872019-07-09 13:04:07 -07001083 RtpPacketToSend packet(&extensions);
1084 packet.SetPayloadType(kPayloadType);
1085 packet.SetSequenceNumber(kSeqNum);
1086 packet.SetTimestamp(kTimestamp);
1087 packet.SetSsrc(kSsrc);
1088 packet.SetExtension<TransmissionOffset>(kTimeOffset);
1089
1090 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1091
1092 // Try to remove extension, which was registered, but not set.
1093 EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionAudioLevel));
1094
1095 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1096
1097 // Try to remove extension, which was not registered.
1098 EXPECT_FALSE(packet.RemoveExtension(kRtpExtensionPlayoutDelay));
1099
1100 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
1101}
1102
danilchap1edb7ab2016-04-20 05:25:10 -07001103} // namespace webrtc