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