blob: 4700a776f5b6b5fb4456a5d719de6cf36c1d949c [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 */
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020010#include "modules/rtp_rtcp/source/rtp_packet_received.h"
11#include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
danilchap1edb7ab2016-04-20 05:25:10 -070012
Johannes Kronf1ab9b92018-12-14 10:14:07 +010013#include "common_video/test/utilities.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
15#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
16#include "rtc_base/random.h"
17#include "test/gmock.h"
18#include "test/gtest.h"
danilchap1edb7ab2016-04-20 05:25:10 -070019
danilchap1edb7ab2016-04-20 05:25:10 -070020namespace webrtc {
21namespace {
Danil Chapovalove19953b2018-10-01 16:12:28 +020022
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +020023using ::testing::Each;
Danil Chapovalove19953b2018-10-01 16:12:28 +020024using ::testing::ElementsAre;
danilchapc547e842017-04-10 01:31:49 -070025using ::testing::ElementsAreArray;
26using ::testing::IsEmpty;
27using ::testing::make_tuple;
28
danilchap1edb7ab2016-04-20 05:25:10 -070029constexpr int8_t kPayloadType = 100;
30constexpr uint32_t kSsrc = 0x12345678;
eladalonae550e32017-05-24 08:28:13 -070031constexpr uint16_t kSeqNum = 0x1234;
32constexpr uint8_t kSeqNumFirstByte = kSeqNum >> 8;
33constexpr uint8_t kSeqNumSecondByte = kSeqNum & 0xff;
danilchap1edb7ab2016-04-20 05:25:10 -070034constexpr uint32_t kTimestamp = 0x65431278;
35constexpr uint8_t kTransmissionOffsetExtensionId = 1;
36constexpr uint8_t kAudioLevelExtensionId = 9;
erikvargae6b16192017-05-11 02:36:32 -070037constexpr uint8_t kRtpStreamIdExtensionId = 0xa;
Steve Antona3251dd2017-07-21 09:58:31 -070038constexpr uint8_t kRtpMidExtensionId = 0xb;
sprangba050a62017-08-18 02:51:12 -070039constexpr uint8_t kVideoTimingExtensionId = 0xc;
Johannes Kron07ba2b92018-09-26 13:33:35 +020040constexpr uint8_t kTwoByteExtensionId = 0xf0;
danilchap1edb7ab2016-04-20 05:25:10 -070041constexpr int32_t kTimeOffset = 0x56ce;
42constexpr bool kVoiceActive = true;
43constexpr uint8_t kAudioLevel = 0x5a;
erikvargae6b16192017-05-11 02:36:32 -070044constexpr char kStreamId[] = "streamid";
Steve Antona3251dd2017-07-21 09:58:31 -070045constexpr char kMid[] = "mid";
Johannes Kron07ba2b92018-09-26 13:33:35 +020046constexpr char kLongMid[] = "extra-long string to test two-byte header";
danilchap1edb7ab2016-04-20 05:25:10 -070047constexpr size_t kMaxPaddingSize = 224u;
danilchap07ec26d2016-06-17 04:18:54 -070048// clang-format off
danilchap1edb7ab2016-04-20 05:25:10 -070049constexpr uint8_t kMinimumPacket[] = {
eladalonae550e32017-05-24 08:28:13 -070050 0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap1edb7ab2016-04-20 05:25:10 -070051 0x65, 0x43, 0x12, 0x78,
52 0x12, 0x34, 0x56, 0x78};
erikvargae6b16192017-05-11 02:36:32 -070053
danilchap1edb7ab2016-04-20 05:25:10 -070054constexpr uint8_t kPacketWithTO[] = {
eladalonae550e32017-05-24 08:28:13 -070055 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap1edb7ab2016-04-20 05:25:10 -070056 0x65, 0x43, 0x12, 0x78,
57 0x12, 0x34, 0x56, 0x78,
58 0xbe, 0xde, 0x00, 0x01,
59 0x12, 0x00, 0x56, 0xce};
60
61constexpr uint8_t kPacketWithTOAndAL[] = {
eladalonae550e32017-05-24 08:28:13 -070062 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap1edb7ab2016-04-20 05:25:10 -070063 0x65, 0x43, 0x12, 0x78,
64 0x12, 0x34, 0x56, 0x78,
65 0xbe, 0xde, 0x00, 0x02,
66 0x12, 0x00, 0x56, 0xce,
67 0x90, 0x80|kAudioLevel, 0x00, 0x00};
68
Johannes Kron78cdde32018-10-05 10:00:46 +020069constexpr uint8_t kPacketWithTwoByteExtensionIdLast[] = {
70 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
71 0x65, 0x43, 0x12, 0x78,
72 0x12, 0x34, 0x56, 0x78,
73 0x10, 0x00, 0x00, 0x04,
74 0x01, 0x03, 0x00, 0x56,
75 0xce, 0x09, 0x01, 0x80|kAudioLevel,
76 kTwoByteExtensionId, 0x03, 0x00, 0x30, // => 0x00 0x30 0x22
77 0x22, 0x00, 0x00, 0x00}; // => Playout delay.min_ms = 3*10
78 // => Playout delay.max_ms = 34*10
79
80constexpr uint8_t kPacketWithTwoByteExtensionIdFirst[] = {
81 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
82 0x65, 0x43, 0x12, 0x78,
83 0x12, 0x34, 0x56, 0x78,
84 0x10, 0x00, 0x00, 0x04,
85 kTwoByteExtensionId, 0x03, 0x00, 0x30, // => 0x00 0x30 0x22
86 0x22, 0x01, 0x03, 0x00, // => Playout delay.min_ms = 3*10
87 0x56, 0xce, 0x09, 0x01, // => Playout delay.max_ms = 34*10
88 0x80|kAudioLevel, 0x00, 0x00, 0x00};
89
Johannes Kron07ba2b92018-09-26 13:33:35 +020090constexpr uint8_t kPacketWithTOAndALInvalidPadding[] = {
91 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
92 0x65, 0x43, 0x12, 0x78,
93 0x12, 0x34, 0x56, 0x78,
94 0xbe, 0xde, 0x00, 0x03,
95 0x12, 0x00, 0x56, 0xce,
96 0x00, 0x02, 0x00, 0x00, // 0x02 is invalid padding, parsing should stop.
97 0x90, 0x80|kAudioLevel, 0x00, 0x00};
98
99constexpr uint8_t kPacketWithTOAndALReservedExtensionId[] = {
100 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
101 0x65, 0x43, 0x12, 0x78,
102 0x12, 0x34, 0x56, 0x78,
103 0xbe, 0xde, 0x00, 0x03,
104 0x12, 0x00, 0x56, 0xce,
105 0x00, 0xF0, 0x00, 0x00, // F is a reserved id, parsing should stop.
106 0x90, 0x80|kAudioLevel, 0x00, 0x00};
107
erikvargae6b16192017-05-11 02:36:32 -0700108constexpr uint8_t kPacketWithRsid[] = {
eladalonae550e32017-05-24 08:28:13 -0700109 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
erikvargae6b16192017-05-11 02:36:32 -0700110 0x65, 0x43, 0x12, 0x78,
111 0x12, 0x34, 0x56, 0x78,
112 0xbe, 0xde, 0x00, 0x03,
113 0xa7, 's', 't', 'r',
114 'e', 'a', 'm', 'i',
115 'd' , 0x00, 0x00, 0x00};
116
Steve Antona3251dd2017-07-21 09:58:31 -0700117constexpr uint8_t kPacketWithMid[] = {
118 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
119 0x65, 0x43, 0x12, 0x78,
120 0x12, 0x34, 0x56, 0x78,
121 0xbe, 0xde, 0x00, 0x01,
122 0xb2, 'm', 'i', 'd'};
123
danilchap1edb7ab2016-04-20 05:25:10 -0700124constexpr uint32_t kCsrcs[] = {0x34567890, 0x32435465};
125constexpr uint8_t kPayload[] = {'p', 'a', 'y', 'l', 'o', 'a', 'd'};
126constexpr uint8_t kPacketPaddingSize = 8;
127constexpr uint8_t kPacket[] = {
eladalonae550e32017-05-24 08:28:13 -0700128 0xb2, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap1edb7ab2016-04-20 05:25:10 -0700129 0x65, 0x43, 0x12, 0x78,
130 0x12, 0x34, 0x56, 0x78,
131 0x34, 0x56, 0x78, 0x90,
132 0x32, 0x43, 0x54, 0x65,
133 0xbe, 0xde, 0x00, 0x01,
134 0x12, 0x00, 0x56, 0xce,
135 'p', 'a', 'y', 'l', 'o', 'a', 'd',
136 'p', 'a', 'd', 'd', 'i', 'n', 'g', kPacketPaddingSize};
danilchape565a042016-06-16 10:04:50 -0700137
Johannes Kron07ba2b92018-09-26 13:33:35 +0200138constexpr uint8_t kPacketWithTwoByteHeaderExtension[] = {
139 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
140 0x65, 0x43, 0x12, 0x78,
141 0x12, 0x34, 0x56, 0x78,
142 0x10, 0x00, 0x00, 0x02, // Two-byte header extension profile id + length.
143 kTwoByteExtensionId, 0x03, 0x00, 0x56,
144 0xce, 0x00, 0x00, 0x00};
145
146constexpr uint8_t kPacketWithLongTwoByteHeaderExtension[] = {
147 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
148 0x65, 0x43, 0x12, 0x78,
149 0x12, 0x34, 0x56, 0x78,
150 0x10, 0x00, 0x00, 0x0B, // Two-byte header extension profile id + length.
151 kTwoByteExtensionId, 0x29, 'e', 'x',
152 't', 'r', 'a', '-', 'l', 'o', 'n', 'g',
153 ' ', 's', 't', 'r', 'i', 'n', 'g', ' ',
154 't', 'o', ' ', 't', 'e', 's', 't', ' ',
155 't', 'w', 'o', '-', 'b', 'y', 't', 'e',
156 ' ', 'h', 'e', 'a', 'd', 'e', 'r', 0x00};
157
158constexpr uint8_t kPacketWithTwoByteHeaderExtensionWithPadding[] = {
159 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
160 0x65, 0x43, 0x12, 0x78,
161 0x12, 0x34, 0x56, 0x78,
162 0x10, 0x00, 0x00, 0x03, // Two-byte header extension profile id + length.
163 kTwoByteExtensionId, 0x03, 0x00, 0x56,
164 0xce, 0x00, 0x00, 0x00, // Three padding bytes.
165 kAudioLevelExtensionId, 0x01, 0x80|kAudioLevel, 0x00};
166
danilchap07ec26d2016-06-17 04:18:54 -0700167constexpr uint8_t kPacketWithInvalidExtension[] = {
eladalonae550e32017-05-24 08:28:13 -0700168 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchap07ec26d2016-06-17 04:18:54 -0700169 0x65, 0x43, 0x12, 0x78, // kTimestamp.
170 0x12, 0x34, 0x56, 0x78, // kSSrc.
171 0xbe, 0xde, 0x00, 0x02, // Extension block of size 2 x 32bit words.
172 (kTransmissionOffsetExtensionId << 4) | 6, // (6+1)-byte extension, but
173 'e', 'x', 't', // Transmission Offset
174 'd', 'a', 't', 'a', // expected to be 3-bytes.
sprangba050a62017-08-18 02:51:12 -0700175 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
176
177constexpr uint8_t kPacketWithLegacyTimingExtension[] = {
178 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
179 0x65, 0x43, 0x12, 0x78, // kTimestamp.
180 0x12, 0x34, 0x56, 0x78, // kSSrc.
181 0xbe, 0xde, 0x00, 0x04, // Extension block of size 4 x 32bit words.
182 (kVideoTimingExtensionId << 4)
183 | VideoTimingExtension::kValueSizeBytes - 2, // Old format without flags.
184 0x00, 0x01, 0x00,
185 0x02, 0x00, 0x03, 0x00,
186 0x04, 0x00, 0x00, 0x00,
187 0x00, 0x00, 0x00, 0x00};
danilchap07ec26d2016-06-17 04:18:54 -0700188// clang-format on
Johannes Kronad1d9f02018-11-09 11:12:36 +0100189
Johannes Kron09d65882018-11-27 14:36:41 +0100190void TestCreateAndParseColorSpaceExtension(bool with_hdr_metadata) {
191 // Create packet with extension.
192 RtpPacket::ExtensionManager extensions(/*extmap-allow-mixed=*/true);
193 extensions.Register<ColorSpaceExtension>(1);
194 RtpPacket packet(&extensions);
195 const ColorSpace kColorSpace = CreateTestColorSpace(with_hdr_metadata);
196 EXPECT_TRUE(packet.SetExtension<ColorSpaceExtension>(kColorSpace));
197 packet.SetPayloadSize(42);
198
199 // Read packet with the extension.
200 RtpPacketReceived parsed(&extensions);
201 EXPECT_TRUE(parsed.Parse(packet.Buffer()));
202 ColorSpace parsed_color_space;
203 EXPECT_TRUE(parsed.GetExtension<ColorSpaceExtension>(&parsed_color_space));
204 EXPECT_EQ(kColorSpace, parsed_color_space);
205}
danilchap1edb7ab2016-04-20 05:25:10 -0700206} // namespace
207
208TEST(RtpPacketTest, CreateMinimum) {
209 RtpPacketToSend packet(nullptr);
210 packet.SetPayloadType(kPayloadType);
211 packet.SetSequenceNumber(kSeqNum);
212 packet.SetTimestamp(kTimestamp);
213 packet.SetSsrc(kSsrc);
214 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size()));
215}
216
217TEST(RtpPacketTest, CreateWithExtension) {
218 RtpPacketToSend::ExtensionManager extensions;
219 extensions.Register(kRtpExtensionTransmissionTimeOffset,
220 kTransmissionOffsetExtensionId);
221 RtpPacketToSend packet(&extensions);
222 packet.SetPayloadType(kPayloadType);
223 packet.SetSequenceNumber(kSeqNum);
224 packet.SetTimestamp(kTimestamp);
225 packet.SetSsrc(kSsrc);
226 packet.SetExtension<TransmissionOffset>(kTimeOffset);
227 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
228}
229
230TEST(RtpPacketTest, CreateWith2Extensions) {
231 RtpPacketToSend::ExtensionManager extensions;
232 extensions.Register(kRtpExtensionTransmissionTimeOffset,
233 kTransmissionOffsetExtensionId);
234 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
235 RtpPacketToSend packet(&extensions);
236 packet.SetPayloadType(kPayloadType);
237 packet.SetSequenceNumber(kSeqNum);
238 packet.SetTimestamp(kTimestamp);
239 packet.SetSsrc(kSsrc);
240 packet.SetExtension<TransmissionOffset>(kTimeOffset);
241 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
242 EXPECT_THAT(kPacketWithTOAndAL,
243 ElementsAreArray(packet.data(), packet.size()));
244}
245
Johannes Kron78cdde32018-10-05 10:00:46 +0200246TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionFirst) {
Johannes Kron9581bc42018-10-23 10:17:39 +0200247 RtpPacketToSend::ExtensionManager extensions(true);
Johannes Kron78cdde32018-10-05 10:00:46 +0200248 extensions.Register(kRtpExtensionTransmissionTimeOffset,
249 kTransmissionOffsetExtensionId);
250 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
251 extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
252 RtpPacketToSend packet(&extensions);
253 packet.SetPayloadType(kPayloadType);
254 packet.SetSequenceNumber(kSeqNum);
255 packet.SetTimestamp(kTimestamp);
256 packet.SetSsrc(kSsrc);
257 // Set extension that requires two-byte header.
258 PlayoutDelay playoutDelay = {30, 340};
259 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
260 packet.SetExtension<TransmissionOffset>(kTimeOffset);
261 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
262 EXPECT_THAT(kPacketWithTwoByteExtensionIdFirst,
263 ElementsAreArray(packet.data(), packet.size()));
264}
265
266TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionLast) {
267 // This test will trigger RtpPacket::PromoteToTwoByteHeaderExtension().
Johannes Kron9581bc42018-10-23 10:17:39 +0200268 RtpPacketToSend::ExtensionManager extensions(true);
Johannes Kron78cdde32018-10-05 10:00:46 +0200269 extensions.Register(kRtpExtensionTransmissionTimeOffset,
270 kTransmissionOffsetExtensionId);
271 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
272 extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
273 RtpPacketToSend packet(&extensions);
274 packet.SetPayloadType(kPayloadType);
275 packet.SetSequenceNumber(kSeqNum);
276 packet.SetTimestamp(kTimestamp);
277 packet.SetSsrc(kSsrc);
278 packet.SetExtension<TransmissionOffset>(kTimeOffset);
279 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
280 EXPECT_THAT(kPacketWithTOAndAL,
281 ElementsAreArray(packet.data(), packet.size()));
282 // Set extension that requires two-byte header.
283 PlayoutDelay playoutDelay = {30, 340};
284 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
285 EXPECT_THAT(kPacketWithTwoByteExtensionIdLast,
286 ElementsAreArray(packet.data(), packet.size()));
287}
288
erikvargae6b16192017-05-11 02:36:32 -0700289TEST(RtpPacketTest, CreateWithDynamicSizedExtensions) {
290 RtpPacketToSend::ExtensionManager extensions;
291 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
292 RtpPacketToSend packet(&extensions);
293 packet.SetPayloadType(kPayloadType);
294 packet.SetSequenceNumber(kSeqNum);
295 packet.SetTimestamp(kTimestamp);
296 packet.SetSsrc(kSsrc);
297 packet.SetExtension<RtpStreamId>(kStreamId);
298 EXPECT_THAT(kPacketWithRsid, ElementsAreArray(packet.data(), packet.size()));
299}
300
301TEST(RtpPacketTest, TryToCreateWithEmptyRsid) {
302 RtpPacketToSend::ExtensionManager extensions;
303 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
304 RtpPacketToSend packet(&extensions);
305 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(""));
306}
307
308TEST(RtpPacketTest, TryToCreateWithLongRsid) {
309 RtpPacketToSend::ExtensionManager extensions;
310 constexpr char kLongStreamId[] = "LoooooooooongRsid";
311 ASSERT_EQ(strlen(kLongStreamId), 17u);
312 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
313 RtpPacketToSend packet(&extensions);
314 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kLongStreamId));
315}
316
Steve Antona3251dd2017-07-21 09:58:31 -0700317TEST(RtpPacketTest, TryToCreateWithEmptyMid) {
318 RtpPacketToSend::ExtensionManager extensions;
319 extensions.Register<RtpMid>(kRtpMidExtensionId);
320 RtpPacketToSend packet(&extensions);
321 EXPECT_FALSE(packet.SetExtension<RtpMid>(""));
322}
323
324TEST(RtpPacketTest, TryToCreateWithLongMid) {
325 RtpPacketToSend::ExtensionManager extensions;
326 constexpr char kLongMid[] = "LoooooooooonogMid";
327 ASSERT_EQ(strlen(kLongMid), 17u);
328 extensions.Register<RtpMid>(kRtpMidExtensionId);
329 RtpPacketToSend packet(&extensions);
330 EXPECT_FALSE(packet.SetExtension<RtpMid>(kLongMid));
331}
332
Johannes Kron78cdde32018-10-05 10:00:46 +0200333TEST(RtpPacketTest, TryToCreateTwoByteHeaderNotSupported) {
334 RtpPacketToSend::ExtensionManager extensions;
335 extensions.Register(kRtpExtensionAudioLevel, kTwoByteExtensionId);
336 RtpPacketToSend packet(&extensions);
337 // Set extension that requires two-byte header.
338 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
339}
340
danilchap653063f2017-04-03 06:16:30 -0700341TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) {
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200342 const std::string kValue = "123456789abcdef";
343 RtpPacket::ExtensionManager extensions;
344 extensions.Register<RtpMid>(1);
345 extensions.Register<RtpStreamId>(2);
danilchap653063f2017-04-03 06:16:30 -0700346
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200347 RtpPacket packet(&extensions);
348 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700349
350 packet.SetPayloadSize(42);
351 // Rewriting allocated extension is allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200352 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700353 // Adding another extension after payload is set is not allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200354 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700355
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200356 // Read packet with the extension.
357 RtpPacketReceived parsed(&extensions);
danilchap653063f2017-04-03 06:16:30 -0700358 EXPECT_TRUE(parsed.Parse(packet.Buffer()));
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200359 std::string read;
360 EXPECT_TRUE(parsed.GetExtension<RtpMid>(&read));
361 EXPECT_EQ(read, kValue);
danilchap653063f2017-04-03 06:16:30 -0700362}
363
danilchap1edb7ab2016-04-20 05:25:10 -0700364TEST(RtpPacketTest, SetReservedExtensionsAfterPayload) {
365 const size_t kPayloadSize = 4;
366 RtpPacketToSend::ExtensionManager extensions;
367 extensions.Register(kRtpExtensionTransmissionTimeOffset,
368 kTransmissionOffsetExtensionId);
369 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
370 RtpPacketToSend packet(&extensions);
371
372 EXPECT_TRUE(packet.ReserveExtension<TransmissionOffset>());
danilchap07a01b32017-03-29 07:33:13 -0700373 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700374 // Can't set extension after payload.
375 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
376 // Unless reserved.
377 EXPECT_TRUE(packet.SetExtension<TransmissionOffset>(kTimeOffset));
378}
379
380TEST(RtpPacketTest, CreatePurePadding) {
381 const size_t kPaddingSize = kMaxPaddingSize - 1;
382 RtpPacketToSend packet(nullptr, 12 + kPaddingSize);
383 packet.SetPayloadType(kPayloadType);
384 packet.SetSequenceNumber(kSeqNum);
385 packet.SetTimestamp(kTimestamp);
386 packet.SetSsrc(kSsrc);
danilchap1edb7ab2016-04-20 05:25:10 -0700387
388 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200389 EXPECT_FALSE(packet.SetPadding(kPaddingSize + 1));
390 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700391 EXPECT_EQ(packet.size(), packet.capacity());
392}
393
394TEST(RtpPacketTest, CreateUnalignedPadding) {
395 const size_t kPayloadSize = 3; // Make padding start at unaligned address.
396 RtpPacketToSend packet(nullptr, 12 + kPayloadSize + kMaxPaddingSize);
397 packet.SetPayloadType(kPayloadType);
398 packet.SetSequenceNumber(kSeqNum);
399 packet.SetTimestamp(kTimestamp);
400 packet.SetSsrc(kSsrc);
danilchap07a01b32017-03-29 07:33:13 -0700401 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700402
403 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200404 EXPECT_TRUE(packet.SetPadding(kMaxPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700405 EXPECT_EQ(packet.size(), packet.capacity());
406}
407
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200408TEST(RtpPacketTest, WritesPaddingSizeToLastByte) {
409 const size_t kPaddingSize = 5;
410 RtpPacket packet;
411
412 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
413 EXPECT_EQ(packet.data()[packet.size() - 1], kPaddingSize);
414}
415
416TEST(RtpPacketTest, UsesZerosForPadding) {
417 const size_t kPaddingSize = 5;
418 RtpPacket packet;
419
420 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
421 EXPECT_THAT(rtc::MakeArrayView(packet.data() + 12, kPaddingSize - 1),
422 Each(0));
423}
424
425TEST(RtpPacketTest, CreateOneBytePadding) {
426 size_t kPayloadSize = 123;
427 RtpPacket packet(nullptr, 12 + kPayloadSize + 1);
428 packet.SetPayloadSize(kPayloadSize);
429
430 EXPECT_TRUE(packet.SetPadding(1));
431
432 EXPECT_EQ(packet.size(), 12 + kPayloadSize + 1);
433 EXPECT_EQ(packet.padding_size(), 1u);
434}
435
436TEST(RtpPacketTest, FailsToAddPaddingWithoutCapacity) {
437 size_t kPayloadSize = 123;
438 RtpPacket packet(nullptr, 12 + kPayloadSize);
439 packet.SetPayloadSize(kPayloadSize);
440
441 EXPECT_FALSE(packet.SetPadding(1));
442}
443
danilchap1edb7ab2016-04-20 05:25:10 -0700444TEST(RtpPacketTest, ParseMinimum) {
445 RtpPacketReceived packet;
446 EXPECT_TRUE(packet.Parse(kMinimumPacket, sizeof(kMinimumPacket)));
447 EXPECT_EQ(kPayloadType, packet.PayloadType());
448 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
449 EXPECT_EQ(kTimestamp, packet.Timestamp());
450 EXPECT_EQ(kSsrc, packet.Ssrc());
451 EXPECT_EQ(0u, packet.padding_size());
452 EXPECT_EQ(0u, packet.payload_size());
453}
454
455TEST(RtpPacketTest, ParseBuffer) {
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200456 rtc::CopyOnWriteBuffer unparsed(kMinimumPacket);
danilchap1edb7ab2016-04-20 05:25:10 -0700457 const uint8_t* raw = unparsed.data();
458
459 RtpPacketReceived packet;
460 EXPECT_TRUE(packet.Parse(std::move(unparsed)));
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200461 EXPECT_EQ(raw, packet.data()); // Expect packet take the buffer without copy.
danilchap1edb7ab2016-04-20 05:25:10 -0700462 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
463 EXPECT_EQ(kTimestamp, packet.Timestamp());
464 EXPECT_EQ(kSsrc, packet.Ssrc());
465 EXPECT_EQ(0u, packet.padding_size());
466 EXPECT_EQ(0u, packet.payload_size());
467}
468
469TEST(RtpPacketTest, ParseWithExtension) {
470 RtpPacketToSend::ExtensionManager extensions;
471 extensions.Register(kRtpExtensionTransmissionTimeOffset,
472 kTransmissionOffsetExtensionId);
473
474 RtpPacketReceived packet(&extensions);
475 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
476 EXPECT_EQ(kPayloadType, packet.PayloadType());
477 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
478 EXPECT_EQ(kTimestamp, packet.Timestamp());
479 EXPECT_EQ(kSsrc, packet.Ssrc());
480 int32_t time_offset;
481 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
482 EXPECT_EQ(kTimeOffset, time_offset);
483 EXPECT_EQ(0u, packet.payload_size());
484 EXPECT_EQ(0u, packet.padding_size());
485}
486
Danil Chapovalovc5dd3002018-11-08 15:12:45 +0100487TEST(RtpPacketTest, GetExtensionWithoutParametersReturnsOptionalValue) {
488 RtpPacket::ExtensionManager extensions;
489 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
490 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
491
492 RtpPacketReceived packet(&extensions);
493 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
494
495 auto time_offset = packet.GetExtension<TransmissionOffset>();
496 static_assert(
497 std::is_same<decltype(time_offset),
498 absl::optional<TransmissionOffset::value_type>>::value,
499 "");
500 EXPECT_EQ(time_offset, kTimeOffset);
501 EXPECT_FALSE(packet.GetExtension<RtpStreamId>().has_value());
502}
503
Danil Chapovalove19953b2018-10-01 16:12:28 +0200504TEST(RtpPacketTest, GetRawExtensionWhenPresent) {
505 constexpr uint8_t kRawPacket[] = {
506 // comment for clang-format to align kRawPacket nicer.
507 0x90, 100, 0x5e, 0x04, //
508 0x65, 0x43, 0x12, 0x78, // Timestamp.
509 0x12, 0x34, 0x56, 0x78, // Ssrc
510 0xbe, 0xde, 0x00, 0x01, // Extension header
511 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
512 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
513 RtpPacketToSend::ExtensionManager extensions;
514 extensions.Register<RtpMid>(1);
515 RtpPacket packet(&extensions);
516 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
517 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), ElementsAre('m', 'i', 'd'));
518}
519
520TEST(RtpPacketTest, GetRawExtensionWhenAbsent) {
521 constexpr uint8_t kRawPacket[] = {
522 // comment for clang-format to align kRawPacket nicer.
523 0x90, 100, 0x5e, 0x04, //
524 0x65, 0x43, 0x12, 0x78, // Timestamp.
525 0x12, 0x34, 0x56, 0x78, // Ssrc
526 0xbe, 0xde, 0x00, 0x01, // Extension header
527 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
528 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
529 RtpPacketToSend::ExtensionManager extensions;
530 extensions.Register<RtpMid>(2);
531 RtpPacket packet(&extensions);
532 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
533 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), IsEmpty());
534}
535
danilchap07ec26d2016-06-17 04:18:54 -0700536TEST(RtpPacketTest, ParseWithInvalidSizedExtension) {
537 RtpPacketToSend::ExtensionManager extensions;
538 extensions.Register(kRtpExtensionTransmissionTimeOffset,
539 kTransmissionOffsetExtensionId);
540
541 RtpPacketReceived packet(&extensions);
542 EXPECT_TRUE(packet.Parse(kPacketWithInvalidExtension,
543 sizeof(kPacketWithInvalidExtension)));
544
545 // Extension should be ignored.
546 int32_t time_offset;
547 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
548
549 // But shouldn't prevent reading payload.
danilchap96c15872016-11-21 01:35:29 -0800550 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap07ec26d2016-06-17 04:18:54 -0700551}
552
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200553TEST(RtpPacketTest, ParseWithOverSizedExtension) {
554 // clang-format off
555 const uint8_t bad_packet[] = {
eladalonae550e32017-05-24 08:28:13 -0700556 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200557 0x65, 0x43, 0x12, 0x78, // kTimestamp.
558 0x12, 0x34, 0x56, 0x78, // kSsrc.
559 0xbe, 0xde, 0x00, 0x01, // Extension of size 1x32bit word.
560 0x00, // Add a byte of padding.
561 0x12, // Extension id 1 size (2+1).
562 0xda, 0x1a // Only 2 bytes of extension payload.
563 };
564 // clang-format on
565 RtpPacketToSend::ExtensionManager extensions;
566 extensions.Register(TransmissionOffset::kId, 1);
567 RtpPacketReceived packet(&extensions);
568
569 // Parse should ignore bad extension and proceed.
570 EXPECT_TRUE(packet.Parse(bad_packet, sizeof(bad_packet)));
571 int32_t time_offset;
572 // But extracting extension should fail.
573 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
574}
575
danilchap1edb7ab2016-04-20 05:25:10 -0700576TEST(RtpPacketTest, ParseWith2Extensions) {
577 RtpPacketToSend::ExtensionManager extensions;
578 extensions.Register(kRtpExtensionTransmissionTimeOffset,
579 kTransmissionOffsetExtensionId);
580 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
581 RtpPacketReceived packet(&extensions);
582 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
583 int32_t time_offset;
584 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
585 EXPECT_EQ(kTimeOffset, time_offset);
586 bool voice_active;
587 uint8_t audio_level;
588 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
589 EXPECT_EQ(kVoiceActive, voice_active);
590 EXPECT_EQ(kAudioLevel, audio_level);
591}
592
Johannes Kron6ea77192018-09-24 17:19:52 +0200593TEST(RtpPacketTest, ParseSecondPacketWithFewerExtensions) {
594 RtpPacketToSend::ExtensionManager extensions;
595 extensions.Register(kRtpExtensionTransmissionTimeOffset,
596 kTransmissionOffsetExtensionId);
597 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
598 RtpPacketReceived packet(&extensions);
599 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
600 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
601 EXPECT_TRUE(packet.HasExtension<AudioLevel>());
602
603 // Second packet without audio level.
604 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
605 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
606 EXPECT_FALSE(packet.HasExtension<AudioLevel>());
607}
608
Johannes Kron07ba2b92018-09-26 13:33:35 +0200609TEST(RtpPacketTest, ParseWith2ExtensionsInvalidPadding) {
610 RtpPacketToSend::ExtensionManager extensions;
611 extensions.Register(kRtpExtensionTransmissionTimeOffset,
612 kTransmissionOffsetExtensionId);
613 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
614 RtpPacketReceived packet(&extensions);
615 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALInvalidPadding,
616 sizeof(kPacketWithTOAndALInvalidPadding)));
617 int32_t time_offset;
618 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
619 EXPECT_EQ(kTimeOffset, time_offset);
620 bool voice_active;
621 uint8_t audio_level;
622 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
623}
624
625TEST(RtpPacketTest, ParseWith2ExtensionsReservedExtensionId) {
626 RtpPacketToSend::ExtensionManager extensions;
627 extensions.Register(kRtpExtensionTransmissionTimeOffset,
628 kTransmissionOffsetExtensionId);
629 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
630 RtpPacketReceived packet(&extensions);
631 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALReservedExtensionId,
632 sizeof(kPacketWithTOAndALReservedExtensionId)));
633 int32_t time_offset;
634 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
635 EXPECT_EQ(kTimeOffset, time_offset);
636 bool voice_active;
637 uint8_t audio_level;
638 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
639}
640
danilchap1edb7ab2016-04-20 05:25:10 -0700641TEST(RtpPacketTest, ParseWithAllFeatures) {
642 RtpPacketToSend::ExtensionManager extensions;
643 extensions.Register(kRtpExtensionTransmissionTimeOffset,
644 kTransmissionOffsetExtensionId);
645 RtpPacketReceived packet(&extensions);
646 EXPECT_TRUE(packet.Parse(kPacket, sizeof(kPacket)));
647 EXPECT_EQ(kPayloadType, packet.PayloadType());
648 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
649 EXPECT_EQ(kTimestamp, packet.Timestamp());
650 EXPECT_EQ(kSsrc, packet.Ssrc());
651 EXPECT_THAT(packet.Csrcs(), ElementsAreArray(kCsrcs));
danilchap96c15872016-11-21 01:35:29 -0800652 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap1edb7ab2016-04-20 05:25:10 -0700653 EXPECT_EQ(kPacketPaddingSize, packet.padding_size());
654 int32_t time_offset;
655 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
656}
657
Johannes Kron07ba2b92018-09-26 13:33:35 +0200658TEST(RtpPacketTest, ParseTwoByteHeaderExtension) {
659 RtpPacketToSend::ExtensionManager extensions;
660 extensions.Register(kRtpExtensionTransmissionTimeOffset, kTwoByteExtensionId);
661 RtpPacketReceived packet(&extensions);
662 EXPECT_TRUE(packet.Parse(kPacketWithTwoByteHeaderExtension,
663 sizeof(kPacketWithTwoByteHeaderExtension)));
664 int32_t time_offset;
665 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
666 EXPECT_EQ(kTimeOffset, time_offset);
667}
668
669TEST(RtpPacketTest, ParseLongTwoByteHeaderExtension) {
670 RtpPacketToSend::ExtensionManager extensions;
671 extensions.Register(kRtpExtensionMid, kTwoByteExtensionId);
672 RtpPacketReceived packet(&extensions);
673 EXPECT_TRUE(packet.Parse(kPacketWithLongTwoByteHeaderExtension,
674 sizeof(kPacketWithLongTwoByteHeaderExtension)));
675 std::string long_rtp_mid;
676 EXPECT_TRUE(packet.GetExtension<RtpMid>(&long_rtp_mid));
677 EXPECT_EQ(kLongMid, long_rtp_mid);
678}
679
680TEST(RtpPacketTest, ParseTwoByteHeaderExtensionWithPadding) {
681 RtpPacketToSend::ExtensionManager extensions;
682 extensions.Register(kRtpExtensionTransmissionTimeOffset, kTwoByteExtensionId);
683 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
684 RtpPacketReceived packet(&extensions);
685 EXPECT_TRUE(
686 packet.Parse(kPacketWithTwoByteHeaderExtensionWithPadding,
687 sizeof(kPacketWithTwoByteHeaderExtensionWithPadding)));
688 int32_t time_offset;
689 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
690 EXPECT_EQ(kTimeOffset, time_offset);
691 bool voice_active;
692 uint8_t audio_level;
693 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
694 EXPECT_EQ(kVoiceActive, voice_active);
695 EXPECT_EQ(kAudioLevel, audio_level);
696}
697
danilchap1edb7ab2016-04-20 05:25:10 -0700698TEST(RtpPacketTest, ParseWithExtensionDelayed) {
699 RtpPacketReceived packet;
700 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
701 EXPECT_EQ(kPayloadType, packet.PayloadType());
702 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
703 EXPECT_EQ(kTimestamp, packet.Timestamp());
704 EXPECT_EQ(kSsrc, packet.Ssrc());
705
706 RtpPacketToSend::ExtensionManager extensions;
707 extensions.Register(kRtpExtensionTransmissionTimeOffset,
708 kTransmissionOffsetExtensionId);
709
710 int32_t time_offset;
711 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
danilchap70f39a32016-12-16 05:48:18 -0800712 packet.IdentifyExtensions(extensions);
danilchap1edb7ab2016-04-20 05:25:10 -0700713 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
714 EXPECT_EQ(kTimeOffset, time_offset);
715 EXPECT_EQ(0u, packet.payload_size());
716 EXPECT_EQ(0u, packet.padding_size());
717}
718
danilchapef8d7732017-04-19 02:59:48 -0700719TEST(RtpPacketTest, ParseDynamicSizeExtension) {
720 // clang-format off
721 const uint8_t kPacket1[] = {
eladalonae550e32017-05-24 08:28:13 -0700722 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700723 0x65, 0x43, 0x12, 0x78, // Timestamp.
724 0x12, 0x34, 0x56, 0x78, // Ssrc.
725 0xbe, 0xde, 0x00, 0x02, // Extensions block of size 2x32bit words.
726 0x21, 'H', 'D', // Extension with id = 2, size = (1+1).
727 0x12, 'r', 't', 'x', // Extension with id = 1, size = (2+1).
728 0x00}; // Extension padding.
729 const uint8_t kPacket2[] = {
eladalonae550e32017-05-24 08:28:13 -0700730 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700731 0x65, 0x43, 0x12, 0x78, // Timestamp.
732 0x12, 0x34, 0x56, 0x79, // Ssrc.
733 0xbe, 0xde, 0x00, 0x01, // Extensions block of size 1x32bit words.
734 0x11, 'H', 'D', // Extension with id = 1, size = (1+1).
735 0x00}; // Extension padding.
736 // clang-format on
737 RtpPacketReceived::ExtensionManager extensions;
738 extensions.Register<RtpStreamId>(1);
739 extensions.Register<RepairedRtpStreamId>(2);
740 RtpPacketReceived packet(&extensions);
741 ASSERT_TRUE(packet.Parse(kPacket1, sizeof(kPacket1)));
742
743 std::string rsid;
744 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
745 EXPECT_EQ(rsid, "rtx");
746
747 std::string repaired_rsid;
748 EXPECT_TRUE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
749 EXPECT_EQ(repaired_rsid, "HD");
750
751 // Parse another packet with RtpStreamId extension of different size.
752 ASSERT_TRUE(packet.Parse(kPacket2, sizeof(kPacket2)));
753 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
754 EXPECT_EQ(rsid, "HD");
755 EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
756}
757
Steve Antona3251dd2017-07-21 09:58:31 -0700758TEST(RtpPacketTest, ParseWithMid) {
759 RtpPacketReceived::ExtensionManager extensions;
760 extensions.Register<RtpMid>(kRtpMidExtensionId);
761 RtpPacketReceived packet(&extensions);
762 ASSERT_TRUE(packet.Parse(kPacketWithMid, sizeof(kPacketWithMid)));
763
764 std::string mid;
765 EXPECT_TRUE(packet.GetExtension<RtpMid>(&mid));
766 EXPECT_EQ(mid, kMid);
767}
768
sprangba050a62017-08-18 02:51:12 -0700769TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) {
770 // Create a packet with video frame timing extension populated.
771 RtpPacketToSend::ExtensionManager send_extensions;
772 send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId);
773 RtpPacketToSend send_packet(&send_extensions);
774 send_packet.SetPayloadType(kPayloadType);
775 send_packet.SetSequenceNumber(kSeqNum);
776 send_packet.SetTimestamp(kTimestamp);
777 send_packet.SetSsrc(kSsrc);
778
779 VideoSendTiming timing;
780 timing.encode_start_delta_ms = 1;
781 timing.encode_finish_delta_ms = 2;
782 timing.packetization_finish_delta_ms = 3;
783 timing.pacer_exit_delta_ms = 4;
784 timing.flags =
Ilya Nikolaevskiyb6c462d2018-06-05 15:21:32 +0200785 VideoSendTiming::kTriggeredByTimer | VideoSendTiming::kTriggeredBySize;
sprangba050a62017-08-18 02:51:12 -0700786
787 send_packet.SetExtension<VideoTimingExtension>(timing);
788
789 // Serialize the packet and then parse it again.
790 RtpPacketReceived::ExtensionManager extensions;
791 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
792 RtpPacketReceived receive_packet(&extensions);
793 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
794
795 VideoSendTiming receivied_timing;
796 EXPECT_TRUE(
797 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing));
798
799 // Only check first and last timestamp (covered by other tests) plus flags.
800 EXPECT_EQ(receivied_timing.encode_start_delta_ms,
801 timing.encode_start_delta_ms);
802 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, timing.pacer_exit_delta_ms);
803 EXPECT_EQ(receivied_timing.flags, timing.flags);
804}
805
806TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) {
807 // Parse the modified packet.
808 RtpPacketReceived::ExtensionManager extensions;
809 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
810 RtpPacketReceived packet(&extensions);
811 EXPECT_TRUE(packet.Parse(kPacketWithLegacyTimingExtension,
812 sizeof(kPacketWithLegacyTimingExtension)));
813 VideoSendTiming receivied_timing;
814 EXPECT_TRUE(packet.GetExtension<VideoTimingExtension>(&receivied_timing));
815
816 // Check first and last timestamp are still OK. Flags should now be 0.
817 EXPECT_EQ(receivied_timing.encode_start_delta_ms, 1);
818 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, 4);
819 EXPECT_EQ(receivied_timing.flags, 0);
820}
821
Johannes Kron09d65882018-11-27 14:36:41 +0100822TEST(RtpPacketTest, CreateAndParseColorSpaceExtension) {
823 TestCreateAndParseColorSpaceExtension(/*with_hdr_metadata=*/true);
824}
Johannes Kronad1d9f02018-11-09 11:12:36 +0100825
Johannes Kron09d65882018-11-27 14:36:41 +0100826TEST(RtpPacketTest, CreateAndParseColorSpaceExtensionWithoutHdrMetadata) {
827 TestCreateAndParseColorSpaceExtension(/*with_hdr_metadata=*/false);
Johannes Kronad1d9f02018-11-09 11:12:36 +0100828}
829
Johannes Kron54047be2019-02-21 14:09:20 +0000830TEST(RtpPacketTest, CreateAndParseTransportSequenceNumber) {
831 // Create a packet with transport sequence number extension populated.
832 RtpPacketToSend::ExtensionManager extensions;
833 constexpr int kExtensionId = 1;
834 extensions.Register<TransportSequenceNumber>(kExtensionId);
835 RtpPacketToSend send_packet(&extensions);
836 send_packet.SetPayloadType(kPayloadType);
837 send_packet.SetSequenceNumber(kSeqNum);
838 send_packet.SetTimestamp(kTimestamp);
839 send_packet.SetSsrc(kSsrc);
840
841 constexpr int kTransportSequenceNumber = 12345;
842 send_packet.SetExtension<TransportSequenceNumber>(kTransportSequenceNumber);
843
844 // Serialize the packet and then parse it again.
845 RtpPacketReceived receive_packet(&extensions);
846 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
847
848 uint16_t received_transport_sequeunce_number;
849 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumber>(
850 &received_transport_sequeunce_number));
851 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
852}
853
854TEST(RtpPacketTest, CreateAndParseTransportSequenceNumberWithFeedbackRequest) {
855 // Create a packet with TransportSequenceNumberV2 extension populated.
856 RtpPacketToSend::ExtensionManager extensions;
857 constexpr int kExtensionId = 1;
858 extensions.Register<TransportSequenceNumberV2>(kExtensionId);
859 RtpPacketToSend send_packet(&extensions);
860 send_packet.SetPayloadType(kPayloadType);
861 send_packet.SetSequenceNumber(kSeqNum);
862 send_packet.SetTimestamp(kTimestamp);
863 send_packet.SetSsrc(kSsrc);
864
865 constexpr int kTransportSequenceNumber = 12345;
866 constexpr absl::optional<FeedbackRequest> kFeedbackRequest =
867 FeedbackRequest{/*include_timestamps=*/true, /*sequence_count=*/3};
868 send_packet.SetExtension<TransportSequenceNumberV2>(kTransportSequenceNumber,
869 kFeedbackRequest);
870
871 // Serialize the packet and then parse it again.
872 RtpPacketReceived receive_packet(&extensions);
873 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
874
875 // Parse transport sequence number and feedback request.
876 uint16_t received_transport_sequeunce_number;
877 absl::optional<FeedbackRequest> received_feedback_request;
878 EXPECT_TRUE(receive_packet.GetExtension<TransportSequenceNumberV2>(
879 &received_transport_sequeunce_number, &received_feedback_request));
880 EXPECT_EQ(received_transport_sequeunce_number, kTransportSequenceNumber);
881 ASSERT_TRUE(received_feedback_request);
882 EXPECT_EQ(received_feedback_request->include_timestamps,
883 kFeedbackRequest->include_timestamps);
884 EXPECT_EQ(received_feedback_request->sequence_count,
885 kFeedbackRequest->sequence_count);
886}
887
danilchap1edb7ab2016-04-20 05:25:10 -0700888} // namespace webrtc