blob: 648ddc33c67573aa997f6935857e85c7386127fa [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
14#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
15#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
danilchap1edb7ab2016-04-20 05:25:10 -0700188} // namespace
189
190TEST(RtpPacketTest, CreateMinimum) {
191 RtpPacketToSend packet(nullptr);
192 packet.SetPayloadType(kPayloadType);
193 packet.SetSequenceNumber(kSeqNum);
194 packet.SetTimestamp(kTimestamp);
195 packet.SetSsrc(kSsrc);
196 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size()));
197}
198
199TEST(RtpPacketTest, CreateWithExtension) {
200 RtpPacketToSend::ExtensionManager extensions;
201 extensions.Register(kRtpExtensionTransmissionTimeOffset,
202 kTransmissionOffsetExtensionId);
203 RtpPacketToSend packet(&extensions);
204 packet.SetPayloadType(kPayloadType);
205 packet.SetSequenceNumber(kSeqNum);
206 packet.SetTimestamp(kTimestamp);
207 packet.SetSsrc(kSsrc);
208 packet.SetExtension<TransmissionOffset>(kTimeOffset);
209 EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
210}
211
212TEST(RtpPacketTest, CreateWith2Extensions) {
213 RtpPacketToSend::ExtensionManager extensions;
214 extensions.Register(kRtpExtensionTransmissionTimeOffset,
215 kTransmissionOffsetExtensionId);
216 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
217 RtpPacketToSend packet(&extensions);
218 packet.SetPayloadType(kPayloadType);
219 packet.SetSequenceNumber(kSeqNum);
220 packet.SetTimestamp(kTimestamp);
221 packet.SetSsrc(kSsrc);
222 packet.SetExtension<TransmissionOffset>(kTimeOffset);
223 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
224 EXPECT_THAT(kPacketWithTOAndAL,
225 ElementsAreArray(packet.data(), packet.size()));
226}
227
Johannes Kron78cdde32018-10-05 10:00:46 +0200228TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionFirst) {
229 RtpPacketToSend::ExtensionManager extensions;
230 extensions.SetMixedOneTwoByteHeaderSupported(true);
231 extensions.Register(kRtpExtensionTransmissionTimeOffset,
232 kTransmissionOffsetExtensionId);
233 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
234 extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
235 RtpPacketToSend packet(&extensions);
236 packet.SetPayloadType(kPayloadType);
237 packet.SetSequenceNumber(kSeqNum);
238 packet.SetTimestamp(kTimestamp);
239 packet.SetSsrc(kSsrc);
240 // Set extension that requires two-byte header.
241 PlayoutDelay playoutDelay = {30, 340};
242 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
243 packet.SetExtension<TransmissionOffset>(kTimeOffset);
244 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
245 EXPECT_THAT(kPacketWithTwoByteExtensionIdFirst,
246 ElementsAreArray(packet.data(), packet.size()));
247}
248
249TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionLast) {
250 // This test will trigger RtpPacket::PromoteToTwoByteHeaderExtension().
251 RtpPacketToSend::ExtensionManager extensions;
252 extensions.SetMixedOneTwoByteHeaderSupported(true);
253 extensions.Register(kRtpExtensionTransmissionTimeOffset,
254 kTransmissionOffsetExtensionId);
255 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
256 extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
257 RtpPacketToSend packet(&extensions);
258 packet.SetPayloadType(kPayloadType);
259 packet.SetSequenceNumber(kSeqNum);
260 packet.SetTimestamp(kTimestamp);
261 packet.SetSsrc(kSsrc);
262 packet.SetExtension<TransmissionOffset>(kTimeOffset);
263 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
264 EXPECT_THAT(kPacketWithTOAndAL,
265 ElementsAreArray(packet.data(), packet.size()));
266 // Set extension that requires two-byte header.
267 PlayoutDelay playoutDelay = {30, 340};
268 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
269 EXPECT_THAT(kPacketWithTwoByteExtensionIdLast,
270 ElementsAreArray(packet.data(), packet.size()));
271}
272
erikvargae6b16192017-05-11 02:36:32 -0700273TEST(RtpPacketTest, CreateWithDynamicSizedExtensions) {
274 RtpPacketToSend::ExtensionManager extensions;
275 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
276 RtpPacketToSend packet(&extensions);
277 packet.SetPayloadType(kPayloadType);
278 packet.SetSequenceNumber(kSeqNum);
279 packet.SetTimestamp(kTimestamp);
280 packet.SetSsrc(kSsrc);
281 packet.SetExtension<RtpStreamId>(kStreamId);
282 EXPECT_THAT(kPacketWithRsid, ElementsAreArray(packet.data(), packet.size()));
283}
284
285TEST(RtpPacketTest, TryToCreateWithEmptyRsid) {
286 RtpPacketToSend::ExtensionManager extensions;
287 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
288 RtpPacketToSend packet(&extensions);
289 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(""));
290}
291
292TEST(RtpPacketTest, TryToCreateWithLongRsid) {
293 RtpPacketToSend::ExtensionManager extensions;
294 constexpr char kLongStreamId[] = "LoooooooooongRsid";
295 ASSERT_EQ(strlen(kLongStreamId), 17u);
296 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
297 RtpPacketToSend packet(&extensions);
298 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kLongStreamId));
299}
300
Steve Antona3251dd2017-07-21 09:58:31 -0700301TEST(RtpPacketTest, TryToCreateWithEmptyMid) {
302 RtpPacketToSend::ExtensionManager extensions;
303 extensions.Register<RtpMid>(kRtpMidExtensionId);
304 RtpPacketToSend packet(&extensions);
305 EXPECT_FALSE(packet.SetExtension<RtpMid>(""));
306}
307
308TEST(RtpPacketTest, TryToCreateWithLongMid) {
309 RtpPacketToSend::ExtensionManager extensions;
310 constexpr char kLongMid[] = "LoooooooooonogMid";
311 ASSERT_EQ(strlen(kLongMid), 17u);
312 extensions.Register<RtpMid>(kRtpMidExtensionId);
313 RtpPacketToSend packet(&extensions);
314 EXPECT_FALSE(packet.SetExtension<RtpMid>(kLongMid));
315}
316
Johannes Kron78cdde32018-10-05 10:00:46 +0200317TEST(RtpPacketTest, TryToCreateTwoByteHeaderNotSupported) {
318 RtpPacketToSend::ExtensionManager extensions;
319 extensions.Register(kRtpExtensionAudioLevel, kTwoByteExtensionId);
320 RtpPacketToSend packet(&extensions);
321 // Set extension that requires two-byte header.
322 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
323}
324
danilchap653063f2017-04-03 06:16:30 -0700325TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) {
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200326 const std::string kValue = "123456789abcdef";
327 RtpPacket::ExtensionManager extensions;
328 extensions.Register<RtpMid>(1);
329 extensions.Register<RtpStreamId>(2);
danilchap653063f2017-04-03 06:16:30 -0700330
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200331 RtpPacket packet(&extensions);
332 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700333
334 packet.SetPayloadSize(42);
335 // Rewriting allocated extension is allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200336 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700337 // Adding another extension after payload is set is not allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200338 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700339
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200340 // Read packet with the extension.
341 RtpPacketReceived parsed(&extensions);
danilchap653063f2017-04-03 06:16:30 -0700342 EXPECT_TRUE(parsed.Parse(packet.Buffer()));
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200343 std::string read;
344 EXPECT_TRUE(parsed.GetExtension<RtpMid>(&read));
345 EXPECT_EQ(read, kValue);
danilchap653063f2017-04-03 06:16:30 -0700346}
347
danilchap1edb7ab2016-04-20 05:25:10 -0700348TEST(RtpPacketTest, SetReservedExtensionsAfterPayload) {
349 const size_t kPayloadSize = 4;
350 RtpPacketToSend::ExtensionManager extensions;
351 extensions.Register(kRtpExtensionTransmissionTimeOffset,
352 kTransmissionOffsetExtensionId);
353 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
354 RtpPacketToSend packet(&extensions);
355
356 EXPECT_TRUE(packet.ReserveExtension<TransmissionOffset>());
danilchap07a01b32017-03-29 07:33:13 -0700357 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700358 // Can't set extension after payload.
359 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
360 // Unless reserved.
361 EXPECT_TRUE(packet.SetExtension<TransmissionOffset>(kTimeOffset));
362}
363
364TEST(RtpPacketTest, CreatePurePadding) {
365 const size_t kPaddingSize = kMaxPaddingSize - 1;
366 RtpPacketToSend packet(nullptr, 12 + kPaddingSize);
367 packet.SetPayloadType(kPayloadType);
368 packet.SetSequenceNumber(kSeqNum);
369 packet.SetTimestamp(kTimestamp);
370 packet.SetSsrc(kSsrc);
danilchap1edb7ab2016-04-20 05:25:10 -0700371
372 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200373 EXPECT_FALSE(packet.SetPadding(kPaddingSize + 1));
374 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700375 EXPECT_EQ(packet.size(), packet.capacity());
376}
377
378TEST(RtpPacketTest, CreateUnalignedPadding) {
379 const size_t kPayloadSize = 3; // Make padding start at unaligned address.
380 RtpPacketToSend packet(nullptr, 12 + kPayloadSize + kMaxPaddingSize);
381 packet.SetPayloadType(kPayloadType);
382 packet.SetSequenceNumber(kSeqNum);
383 packet.SetTimestamp(kTimestamp);
384 packet.SetSsrc(kSsrc);
danilchap07a01b32017-03-29 07:33:13 -0700385 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700386
387 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200388 EXPECT_TRUE(packet.SetPadding(kMaxPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700389 EXPECT_EQ(packet.size(), packet.capacity());
390}
391
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200392TEST(RtpPacketTest, WritesPaddingSizeToLastByte) {
393 const size_t kPaddingSize = 5;
394 RtpPacket packet;
395
396 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
397 EXPECT_EQ(packet.data()[packet.size() - 1], kPaddingSize);
398}
399
400TEST(RtpPacketTest, UsesZerosForPadding) {
401 const size_t kPaddingSize = 5;
402 RtpPacket packet;
403
404 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
405 EXPECT_THAT(rtc::MakeArrayView(packet.data() + 12, kPaddingSize - 1),
406 Each(0));
407}
408
409TEST(RtpPacketTest, CreateOneBytePadding) {
410 size_t kPayloadSize = 123;
411 RtpPacket packet(nullptr, 12 + kPayloadSize + 1);
412 packet.SetPayloadSize(kPayloadSize);
413
414 EXPECT_TRUE(packet.SetPadding(1));
415
416 EXPECT_EQ(packet.size(), 12 + kPayloadSize + 1);
417 EXPECT_EQ(packet.padding_size(), 1u);
418}
419
420TEST(RtpPacketTest, FailsToAddPaddingWithoutCapacity) {
421 size_t kPayloadSize = 123;
422 RtpPacket packet(nullptr, 12 + kPayloadSize);
423 packet.SetPayloadSize(kPayloadSize);
424
425 EXPECT_FALSE(packet.SetPadding(1));
426}
427
danilchap1edb7ab2016-04-20 05:25:10 -0700428TEST(RtpPacketTest, ParseMinimum) {
429 RtpPacketReceived packet;
430 EXPECT_TRUE(packet.Parse(kMinimumPacket, sizeof(kMinimumPacket)));
431 EXPECT_EQ(kPayloadType, packet.PayloadType());
432 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
433 EXPECT_EQ(kTimestamp, packet.Timestamp());
434 EXPECT_EQ(kSsrc, packet.Ssrc());
435 EXPECT_EQ(0u, packet.padding_size());
436 EXPECT_EQ(0u, packet.payload_size());
437}
438
439TEST(RtpPacketTest, ParseBuffer) {
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200440 rtc::CopyOnWriteBuffer unparsed(kMinimumPacket);
danilchap1edb7ab2016-04-20 05:25:10 -0700441 const uint8_t* raw = unparsed.data();
442
443 RtpPacketReceived packet;
444 EXPECT_TRUE(packet.Parse(std::move(unparsed)));
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200445 EXPECT_EQ(raw, packet.data()); // Expect packet take the buffer without copy.
danilchap1edb7ab2016-04-20 05:25:10 -0700446 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
447 EXPECT_EQ(kTimestamp, packet.Timestamp());
448 EXPECT_EQ(kSsrc, packet.Ssrc());
449 EXPECT_EQ(0u, packet.padding_size());
450 EXPECT_EQ(0u, packet.payload_size());
451}
452
453TEST(RtpPacketTest, ParseWithExtension) {
454 RtpPacketToSend::ExtensionManager extensions;
455 extensions.Register(kRtpExtensionTransmissionTimeOffset,
456 kTransmissionOffsetExtensionId);
457
458 RtpPacketReceived packet(&extensions);
459 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
460 EXPECT_EQ(kPayloadType, packet.PayloadType());
461 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
462 EXPECT_EQ(kTimestamp, packet.Timestamp());
463 EXPECT_EQ(kSsrc, packet.Ssrc());
464 int32_t time_offset;
465 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
466 EXPECT_EQ(kTimeOffset, time_offset);
467 EXPECT_EQ(0u, packet.payload_size());
468 EXPECT_EQ(0u, packet.padding_size());
469}
470
Danil Chapovalove19953b2018-10-01 16:12:28 +0200471TEST(RtpPacketTest, GetRawExtensionWhenPresent) {
472 constexpr uint8_t kRawPacket[] = {
473 // comment for clang-format to align kRawPacket nicer.
474 0x90, 100, 0x5e, 0x04, //
475 0x65, 0x43, 0x12, 0x78, // Timestamp.
476 0x12, 0x34, 0x56, 0x78, // Ssrc
477 0xbe, 0xde, 0x00, 0x01, // Extension header
478 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
479 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
480 RtpPacketToSend::ExtensionManager extensions;
481 extensions.Register<RtpMid>(1);
482 RtpPacket packet(&extensions);
483 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
484 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), ElementsAre('m', 'i', 'd'));
485}
486
487TEST(RtpPacketTest, GetRawExtensionWhenAbsent) {
488 constexpr uint8_t kRawPacket[] = {
489 // comment for clang-format to align kRawPacket nicer.
490 0x90, 100, 0x5e, 0x04, //
491 0x65, 0x43, 0x12, 0x78, // Timestamp.
492 0x12, 0x34, 0x56, 0x78, // Ssrc
493 0xbe, 0xde, 0x00, 0x01, // Extension header
494 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
495 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
496 RtpPacketToSend::ExtensionManager extensions;
497 extensions.Register<RtpMid>(2);
498 RtpPacket packet(&extensions);
499 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
500 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), IsEmpty());
501}
502
danilchap07ec26d2016-06-17 04:18:54 -0700503TEST(RtpPacketTest, ParseWithInvalidSizedExtension) {
504 RtpPacketToSend::ExtensionManager extensions;
505 extensions.Register(kRtpExtensionTransmissionTimeOffset,
506 kTransmissionOffsetExtensionId);
507
508 RtpPacketReceived packet(&extensions);
509 EXPECT_TRUE(packet.Parse(kPacketWithInvalidExtension,
510 sizeof(kPacketWithInvalidExtension)));
511
512 // Extension should be ignored.
513 int32_t time_offset;
514 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
515
516 // But shouldn't prevent reading payload.
danilchap96c15872016-11-21 01:35:29 -0800517 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap07ec26d2016-06-17 04:18:54 -0700518}
519
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200520TEST(RtpPacketTest, ParseWithOverSizedExtension) {
521 // clang-format off
522 const uint8_t bad_packet[] = {
eladalonae550e32017-05-24 08:28:13 -0700523 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200524 0x65, 0x43, 0x12, 0x78, // kTimestamp.
525 0x12, 0x34, 0x56, 0x78, // kSsrc.
526 0xbe, 0xde, 0x00, 0x01, // Extension of size 1x32bit word.
527 0x00, // Add a byte of padding.
528 0x12, // Extension id 1 size (2+1).
529 0xda, 0x1a // Only 2 bytes of extension payload.
530 };
531 // clang-format on
532 RtpPacketToSend::ExtensionManager extensions;
533 extensions.Register(TransmissionOffset::kId, 1);
534 RtpPacketReceived packet(&extensions);
535
536 // Parse should ignore bad extension and proceed.
537 EXPECT_TRUE(packet.Parse(bad_packet, sizeof(bad_packet)));
538 int32_t time_offset;
539 // But extracting extension should fail.
540 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
541}
542
danilchap1edb7ab2016-04-20 05:25:10 -0700543TEST(RtpPacketTest, ParseWith2Extensions) {
544 RtpPacketToSend::ExtensionManager extensions;
545 extensions.Register(kRtpExtensionTransmissionTimeOffset,
546 kTransmissionOffsetExtensionId);
547 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
548 RtpPacketReceived packet(&extensions);
549 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
550 int32_t time_offset;
551 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
552 EXPECT_EQ(kTimeOffset, time_offset);
553 bool voice_active;
554 uint8_t audio_level;
555 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
556 EXPECT_EQ(kVoiceActive, voice_active);
557 EXPECT_EQ(kAudioLevel, audio_level);
558}
559
Johannes Kron6ea77192018-09-24 17:19:52 +0200560TEST(RtpPacketTest, ParseSecondPacketWithFewerExtensions) {
561 RtpPacketToSend::ExtensionManager extensions;
562 extensions.Register(kRtpExtensionTransmissionTimeOffset,
563 kTransmissionOffsetExtensionId);
564 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
565 RtpPacketReceived packet(&extensions);
566 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
567 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
568 EXPECT_TRUE(packet.HasExtension<AudioLevel>());
569
570 // Second packet without audio level.
571 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
572 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
573 EXPECT_FALSE(packet.HasExtension<AudioLevel>());
574}
575
Johannes Kron07ba2b92018-09-26 13:33:35 +0200576TEST(RtpPacketTest, ParseWith2ExtensionsInvalidPadding) {
577 RtpPacketToSend::ExtensionManager extensions;
578 extensions.Register(kRtpExtensionTransmissionTimeOffset,
579 kTransmissionOffsetExtensionId);
580 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
581 RtpPacketReceived packet(&extensions);
582 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALInvalidPadding,
583 sizeof(kPacketWithTOAndALInvalidPadding)));
584 int32_t time_offset;
585 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
586 EXPECT_EQ(kTimeOffset, time_offset);
587 bool voice_active;
588 uint8_t audio_level;
589 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
590}
591
592TEST(RtpPacketTest, ParseWith2ExtensionsReservedExtensionId) {
593 RtpPacketToSend::ExtensionManager extensions;
594 extensions.Register(kRtpExtensionTransmissionTimeOffset,
595 kTransmissionOffsetExtensionId);
596 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
597 RtpPacketReceived packet(&extensions);
598 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALReservedExtensionId,
599 sizeof(kPacketWithTOAndALReservedExtensionId)));
600 int32_t time_offset;
601 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
602 EXPECT_EQ(kTimeOffset, time_offset);
603 bool voice_active;
604 uint8_t audio_level;
605 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
606}
607
danilchap1edb7ab2016-04-20 05:25:10 -0700608TEST(RtpPacketTest, ParseWithAllFeatures) {
609 RtpPacketToSend::ExtensionManager extensions;
610 extensions.Register(kRtpExtensionTransmissionTimeOffset,
611 kTransmissionOffsetExtensionId);
612 RtpPacketReceived packet(&extensions);
613 EXPECT_TRUE(packet.Parse(kPacket, sizeof(kPacket)));
614 EXPECT_EQ(kPayloadType, packet.PayloadType());
615 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
616 EXPECT_EQ(kTimestamp, packet.Timestamp());
617 EXPECT_EQ(kSsrc, packet.Ssrc());
618 EXPECT_THAT(packet.Csrcs(), ElementsAreArray(kCsrcs));
danilchap96c15872016-11-21 01:35:29 -0800619 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap1edb7ab2016-04-20 05:25:10 -0700620 EXPECT_EQ(kPacketPaddingSize, packet.padding_size());
621 int32_t time_offset;
622 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
623}
624
Johannes Kron07ba2b92018-09-26 13:33:35 +0200625TEST(RtpPacketTest, ParseTwoByteHeaderExtension) {
626 RtpPacketToSend::ExtensionManager extensions;
627 extensions.Register(kRtpExtensionTransmissionTimeOffset, kTwoByteExtensionId);
628 RtpPacketReceived packet(&extensions);
629 EXPECT_TRUE(packet.Parse(kPacketWithTwoByteHeaderExtension,
630 sizeof(kPacketWithTwoByteHeaderExtension)));
631 int32_t time_offset;
632 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
633 EXPECT_EQ(kTimeOffset, time_offset);
634}
635
636TEST(RtpPacketTest, ParseLongTwoByteHeaderExtension) {
637 RtpPacketToSend::ExtensionManager extensions;
638 extensions.Register(kRtpExtensionMid, kTwoByteExtensionId);
639 RtpPacketReceived packet(&extensions);
640 EXPECT_TRUE(packet.Parse(kPacketWithLongTwoByteHeaderExtension,
641 sizeof(kPacketWithLongTwoByteHeaderExtension)));
642 std::string long_rtp_mid;
643 EXPECT_TRUE(packet.GetExtension<RtpMid>(&long_rtp_mid));
644 EXPECT_EQ(kLongMid, long_rtp_mid);
645}
646
647TEST(RtpPacketTest, ParseTwoByteHeaderExtensionWithPadding) {
648 RtpPacketToSend::ExtensionManager extensions;
649 extensions.Register(kRtpExtensionTransmissionTimeOffset, kTwoByteExtensionId);
650 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
651 RtpPacketReceived packet(&extensions);
652 EXPECT_TRUE(
653 packet.Parse(kPacketWithTwoByteHeaderExtensionWithPadding,
654 sizeof(kPacketWithTwoByteHeaderExtensionWithPadding)));
655 int32_t time_offset;
656 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
657 EXPECT_EQ(kTimeOffset, time_offset);
658 bool voice_active;
659 uint8_t audio_level;
660 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
661 EXPECT_EQ(kVoiceActive, voice_active);
662 EXPECT_EQ(kAudioLevel, audio_level);
663}
664
danilchap1edb7ab2016-04-20 05:25:10 -0700665TEST(RtpPacketTest, ParseWithExtensionDelayed) {
666 RtpPacketReceived packet;
667 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
668 EXPECT_EQ(kPayloadType, packet.PayloadType());
669 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
670 EXPECT_EQ(kTimestamp, packet.Timestamp());
671 EXPECT_EQ(kSsrc, packet.Ssrc());
672
673 RtpPacketToSend::ExtensionManager extensions;
674 extensions.Register(kRtpExtensionTransmissionTimeOffset,
675 kTransmissionOffsetExtensionId);
676
677 int32_t time_offset;
678 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
danilchap70f39a32016-12-16 05:48:18 -0800679 packet.IdentifyExtensions(extensions);
danilchap1edb7ab2016-04-20 05:25:10 -0700680 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
681 EXPECT_EQ(kTimeOffset, time_offset);
682 EXPECT_EQ(0u, packet.payload_size());
683 EXPECT_EQ(0u, packet.padding_size());
684}
685
danilchapef8d7732017-04-19 02:59:48 -0700686TEST(RtpPacketTest, ParseDynamicSizeExtension) {
687 // clang-format off
688 const uint8_t kPacket1[] = {
eladalonae550e32017-05-24 08:28:13 -0700689 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700690 0x65, 0x43, 0x12, 0x78, // Timestamp.
691 0x12, 0x34, 0x56, 0x78, // Ssrc.
692 0xbe, 0xde, 0x00, 0x02, // Extensions block of size 2x32bit words.
693 0x21, 'H', 'D', // Extension with id = 2, size = (1+1).
694 0x12, 'r', 't', 'x', // Extension with id = 1, size = (2+1).
695 0x00}; // Extension padding.
696 const uint8_t kPacket2[] = {
eladalonae550e32017-05-24 08:28:13 -0700697 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700698 0x65, 0x43, 0x12, 0x78, // Timestamp.
699 0x12, 0x34, 0x56, 0x79, // Ssrc.
700 0xbe, 0xde, 0x00, 0x01, // Extensions block of size 1x32bit words.
701 0x11, 'H', 'D', // Extension with id = 1, size = (1+1).
702 0x00}; // Extension padding.
703 // clang-format on
704 RtpPacketReceived::ExtensionManager extensions;
705 extensions.Register<RtpStreamId>(1);
706 extensions.Register<RepairedRtpStreamId>(2);
707 RtpPacketReceived packet(&extensions);
708 ASSERT_TRUE(packet.Parse(kPacket1, sizeof(kPacket1)));
709
710 std::string rsid;
711 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
712 EXPECT_EQ(rsid, "rtx");
713
714 std::string repaired_rsid;
715 EXPECT_TRUE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
716 EXPECT_EQ(repaired_rsid, "HD");
717
718 // Parse another packet with RtpStreamId extension of different size.
719 ASSERT_TRUE(packet.Parse(kPacket2, sizeof(kPacket2)));
720 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
721 EXPECT_EQ(rsid, "HD");
722 EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
723}
724
Steve Antona3251dd2017-07-21 09:58:31 -0700725TEST(RtpPacketTest, ParseWithMid) {
726 RtpPacketReceived::ExtensionManager extensions;
727 extensions.Register<RtpMid>(kRtpMidExtensionId);
728 RtpPacketReceived packet(&extensions);
729 ASSERT_TRUE(packet.Parse(kPacketWithMid, sizeof(kPacketWithMid)));
730
731 std::string mid;
732 EXPECT_TRUE(packet.GetExtension<RtpMid>(&mid));
733 EXPECT_EQ(mid, kMid);
734}
735
sprangba050a62017-08-18 02:51:12 -0700736TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) {
737 // Create a packet with video frame timing extension populated.
738 RtpPacketToSend::ExtensionManager send_extensions;
739 send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId);
740 RtpPacketToSend send_packet(&send_extensions);
741 send_packet.SetPayloadType(kPayloadType);
742 send_packet.SetSequenceNumber(kSeqNum);
743 send_packet.SetTimestamp(kTimestamp);
744 send_packet.SetSsrc(kSsrc);
745
746 VideoSendTiming timing;
747 timing.encode_start_delta_ms = 1;
748 timing.encode_finish_delta_ms = 2;
749 timing.packetization_finish_delta_ms = 3;
750 timing.pacer_exit_delta_ms = 4;
751 timing.flags =
Ilya Nikolaevskiyb6c462d2018-06-05 15:21:32 +0200752 VideoSendTiming::kTriggeredByTimer | VideoSendTiming::kTriggeredBySize;
sprangba050a62017-08-18 02:51:12 -0700753
754 send_packet.SetExtension<VideoTimingExtension>(timing);
755
756 // Serialize the packet and then parse it again.
757 RtpPacketReceived::ExtensionManager extensions;
758 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
759 RtpPacketReceived receive_packet(&extensions);
760 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
761
762 VideoSendTiming receivied_timing;
763 EXPECT_TRUE(
764 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing));
765
766 // Only check first and last timestamp (covered by other tests) plus flags.
767 EXPECT_EQ(receivied_timing.encode_start_delta_ms,
768 timing.encode_start_delta_ms);
769 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, timing.pacer_exit_delta_ms);
770 EXPECT_EQ(receivied_timing.flags, timing.flags);
771}
772
773TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) {
774 // Parse the modified packet.
775 RtpPacketReceived::ExtensionManager extensions;
776 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
777 RtpPacketReceived packet(&extensions);
778 EXPECT_TRUE(packet.Parse(kPacketWithLegacyTimingExtension,
779 sizeof(kPacketWithLegacyTimingExtension)));
780 VideoSendTiming receivied_timing;
781 EXPECT_TRUE(packet.GetExtension<VideoTimingExtension>(&receivied_timing));
782
783 // Check first and last timestamp are still OK. Flags should now be 0.
784 EXPECT_EQ(receivied_timing.encode_start_delta_ms, 1);
785 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, 4);
786 EXPECT_EQ(receivied_timing.flags, 0);
787}
788
danilchap1edb7ab2016-04-20 05:25:10 -0700789} // namespace webrtc