blob: b485df62d66156172b8a1b6f2a2bd47ab1b4186f [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) {
Johannes Kron9581bc42018-10-23 10:17:39 +0200229 RtpPacketToSend::ExtensionManager extensions(true);
Johannes Kron78cdde32018-10-05 10:00:46 +0200230 extensions.Register(kRtpExtensionTransmissionTimeOffset,
231 kTransmissionOffsetExtensionId);
232 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
233 extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
234 RtpPacketToSend packet(&extensions);
235 packet.SetPayloadType(kPayloadType);
236 packet.SetSequenceNumber(kSeqNum);
237 packet.SetTimestamp(kTimestamp);
238 packet.SetSsrc(kSsrc);
239 // Set extension that requires two-byte header.
240 PlayoutDelay playoutDelay = {30, 340};
241 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
242 packet.SetExtension<TransmissionOffset>(kTimeOffset);
243 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
244 EXPECT_THAT(kPacketWithTwoByteExtensionIdFirst,
245 ElementsAreArray(packet.data(), packet.size()));
246}
247
248TEST(RtpPacketTest, CreateWithTwoByteHeaderExtensionLast) {
249 // This test will trigger RtpPacket::PromoteToTwoByteHeaderExtension().
Johannes Kron9581bc42018-10-23 10:17:39 +0200250 RtpPacketToSend::ExtensionManager extensions(true);
Johannes Kron78cdde32018-10-05 10:00:46 +0200251 extensions.Register(kRtpExtensionTransmissionTimeOffset,
252 kTransmissionOffsetExtensionId);
253 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
254 extensions.Register(kRtpExtensionPlayoutDelay, kTwoByteExtensionId);
255 RtpPacketToSend packet(&extensions);
256 packet.SetPayloadType(kPayloadType);
257 packet.SetSequenceNumber(kSeqNum);
258 packet.SetTimestamp(kTimestamp);
259 packet.SetSsrc(kSsrc);
260 packet.SetExtension<TransmissionOffset>(kTimeOffset);
261 packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
262 EXPECT_THAT(kPacketWithTOAndAL,
263 ElementsAreArray(packet.data(), packet.size()));
264 // Set extension that requires two-byte header.
265 PlayoutDelay playoutDelay = {30, 340};
266 ASSERT_TRUE(packet.SetExtension<PlayoutDelayLimits>(playoutDelay));
267 EXPECT_THAT(kPacketWithTwoByteExtensionIdLast,
268 ElementsAreArray(packet.data(), packet.size()));
269}
270
erikvargae6b16192017-05-11 02:36:32 -0700271TEST(RtpPacketTest, CreateWithDynamicSizedExtensions) {
272 RtpPacketToSend::ExtensionManager extensions;
273 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
274 RtpPacketToSend packet(&extensions);
275 packet.SetPayloadType(kPayloadType);
276 packet.SetSequenceNumber(kSeqNum);
277 packet.SetTimestamp(kTimestamp);
278 packet.SetSsrc(kSsrc);
279 packet.SetExtension<RtpStreamId>(kStreamId);
280 EXPECT_THAT(kPacketWithRsid, ElementsAreArray(packet.data(), packet.size()));
281}
282
283TEST(RtpPacketTest, TryToCreateWithEmptyRsid) {
284 RtpPacketToSend::ExtensionManager extensions;
285 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
286 RtpPacketToSend packet(&extensions);
287 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(""));
288}
289
290TEST(RtpPacketTest, TryToCreateWithLongRsid) {
291 RtpPacketToSend::ExtensionManager extensions;
292 constexpr char kLongStreamId[] = "LoooooooooongRsid";
293 ASSERT_EQ(strlen(kLongStreamId), 17u);
294 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
295 RtpPacketToSend packet(&extensions);
296 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kLongStreamId));
297}
298
Steve Antona3251dd2017-07-21 09:58:31 -0700299TEST(RtpPacketTest, TryToCreateWithEmptyMid) {
300 RtpPacketToSend::ExtensionManager extensions;
301 extensions.Register<RtpMid>(kRtpMidExtensionId);
302 RtpPacketToSend packet(&extensions);
303 EXPECT_FALSE(packet.SetExtension<RtpMid>(""));
304}
305
306TEST(RtpPacketTest, TryToCreateWithLongMid) {
307 RtpPacketToSend::ExtensionManager extensions;
308 constexpr char kLongMid[] = "LoooooooooonogMid";
309 ASSERT_EQ(strlen(kLongMid), 17u);
310 extensions.Register<RtpMid>(kRtpMidExtensionId);
311 RtpPacketToSend packet(&extensions);
312 EXPECT_FALSE(packet.SetExtension<RtpMid>(kLongMid));
313}
314
Johannes Kron78cdde32018-10-05 10:00:46 +0200315TEST(RtpPacketTest, TryToCreateTwoByteHeaderNotSupported) {
316 RtpPacketToSend::ExtensionManager extensions;
317 extensions.Register(kRtpExtensionAudioLevel, kTwoByteExtensionId);
318 RtpPacketToSend packet(&extensions);
319 // Set extension that requires two-byte header.
320 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
321}
322
danilchap653063f2017-04-03 06:16:30 -0700323TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) {
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200324 const std::string kValue = "123456789abcdef";
325 RtpPacket::ExtensionManager extensions;
326 extensions.Register<RtpMid>(1);
327 extensions.Register<RtpStreamId>(2);
danilchap653063f2017-04-03 06:16:30 -0700328
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200329 RtpPacket packet(&extensions);
330 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700331
332 packet.SetPayloadSize(42);
333 // Rewriting allocated extension is allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200334 EXPECT_TRUE(packet.SetExtension<RtpMid>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700335 // Adding another extension after payload is set is not allowed.
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200336 EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kValue));
danilchap653063f2017-04-03 06:16:30 -0700337
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200338 // Read packet with the extension.
339 RtpPacketReceived parsed(&extensions);
danilchap653063f2017-04-03 06:16:30 -0700340 EXPECT_TRUE(parsed.Parse(packet.Buffer()));
Danil Chapovalov527ff1e2018-08-06 19:34:32 +0200341 std::string read;
342 EXPECT_TRUE(parsed.GetExtension<RtpMid>(&read));
343 EXPECT_EQ(read, kValue);
danilchap653063f2017-04-03 06:16:30 -0700344}
345
danilchap1edb7ab2016-04-20 05:25:10 -0700346TEST(RtpPacketTest, SetReservedExtensionsAfterPayload) {
347 const size_t kPayloadSize = 4;
348 RtpPacketToSend::ExtensionManager extensions;
349 extensions.Register(kRtpExtensionTransmissionTimeOffset,
350 kTransmissionOffsetExtensionId);
351 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
352 RtpPacketToSend packet(&extensions);
353
354 EXPECT_TRUE(packet.ReserveExtension<TransmissionOffset>());
danilchap07a01b32017-03-29 07:33:13 -0700355 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700356 // Can't set extension after payload.
357 EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
358 // Unless reserved.
359 EXPECT_TRUE(packet.SetExtension<TransmissionOffset>(kTimeOffset));
360}
361
362TEST(RtpPacketTest, CreatePurePadding) {
363 const size_t kPaddingSize = kMaxPaddingSize - 1;
364 RtpPacketToSend packet(nullptr, 12 + kPaddingSize);
365 packet.SetPayloadType(kPayloadType);
366 packet.SetSequenceNumber(kSeqNum);
367 packet.SetTimestamp(kTimestamp);
368 packet.SetSsrc(kSsrc);
danilchap1edb7ab2016-04-20 05:25:10 -0700369
370 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200371 EXPECT_FALSE(packet.SetPadding(kPaddingSize + 1));
372 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700373 EXPECT_EQ(packet.size(), packet.capacity());
374}
375
376TEST(RtpPacketTest, CreateUnalignedPadding) {
377 const size_t kPayloadSize = 3; // Make padding start at unaligned address.
378 RtpPacketToSend packet(nullptr, 12 + kPayloadSize + kMaxPaddingSize);
379 packet.SetPayloadType(kPayloadType);
380 packet.SetSequenceNumber(kSeqNum);
381 packet.SetTimestamp(kTimestamp);
382 packet.SetSsrc(kSsrc);
danilchap07a01b32017-03-29 07:33:13 -0700383 packet.SetPayloadSize(kPayloadSize);
danilchap1edb7ab2016-04-20 05:25:10 -0700384
385 EXPECT_LT(packet.size(), packet.capacity());
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200386 EXPECT_TRUE(packet.SetPadding(kMaxPaddingSize));
danilchap1edb7ab2016-04-20 05:25:10 -0700387 EXPECT_EQ(packet.size(), packet.capacity());
388}
389
Danil Chapovalovf7fcaf02018-10-10 14:56:01 +0200390TEST(RtpPacketTest, WritesPaddingSizeToLastByte) {
391 const size_t kPaddingSize = 5;
392 RtpPacket packet;
393
394 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
395 EXPECT_EQ(packet.data()[packet.size() - 1], kPaddingSize);
396}
397
398TEST(RtpPacketTest, UsesZerosForPadding) {
399 const size_t kPaddingSize = 5;
400 RtpPacket packet;
401
402 EXPECT_TRUE(packet.SetPadding(kPaddingSize));
403 EXPECT_THAT(rtc::MakeArrayView(packet.data() + 12, kPaddingSize - 1),
404 Each(0));
405}
406
407TEST(RtpPacketTest, CreateOneBytePadding) {
408 size_t kPayloadSize = 123;
409 RtpPacket packet(nullptr, 12 + kPayloadSize + 1);
410 packet.SetPayloadSize(kPayloadSize);
411
412 EXPECT_TRUE(packet.SetPadding(1));
413
414 EXPECT_EQ(packet.size(), 12 + kPayloadSize + 1);
415 EXPECT_EQ(packet.padding_size(), 1u);
416}
417
418TEST(RtpPacketTest, FailsToAddPaddingWithoutCapacity) {
419 size_t kPayloadSize = 123;
420 RtpPacket packet(nullptr, 12 + kPayloadSize);
421 packet.SetPayloadSize(kPayloadSize);
422
423 EXPECT_FALSE(packet.SetPadding(1));
424}
425
danilchap1edb7ab2016-04-20 05:25:10 -0700426TEST(RtpPacketTest, ParseMinimum) {
427 RtpPacketReceived packet;
428 EXPECT_TRUE(packet.Parse(kMinimumPacket, sizeof(kMinimumPacket)));
429 EXPECT_EQ(kPayloadType, packet.PayloadType());
430 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
431 EXPECT_EQ(kTimestamp, packet.Timestamp());
432 EXPECT_EQ(kSsrc, packet.Ssrc());
433 EXPECT_EQ(0u, packet.padding_size());
434 EXPECT_EQ(0u, packet.payload_size());
435}
436
437TEST(RtpPacketTest, ParseBuffer) {
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200438 rtc::CopyOnWriteBuffer unparsed(kMinimumPacket);
danilchap1edb7ab2016-04-20 05:25:10 -0700439 const uint8_t* raw = unparsed.data();
440
441 RtpPacketReceived packet;
442 EXPECT_TRUE(packet.Parse(std::move(unparsed)));
Danil Chapovalov31e4e802016-08-03 18:27:40 +0200443 EXPECT_EQ(raw, packet.data()); // Expect packet take the buffer without copy.
danilchap1edb7ab2016-04-20 05:25:10 -0700444 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
445 EXPECT_EQ(kTimestamp, packet.Timestamp());
446 EXPECT_EQ(kSsrc, packet.Ssrc());
447 EXPECT_EQ(0u, packet.padding_size());
448 EXPECT_EQ(0u, packet.payload_size());
449}
450
451TEST(RtpPacketTest, ParseWithExtension) {
452 RtpPacketToSend::ExtensionManager extensions;
453 extensions.Register(kRtpExtensionTransmissionTimeOffset,
454 kTransmissionOffsetExtensionId);
455
456 RtpPacketReceived packet(&extensions);
457 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
458 EXPECT_EQ(kPayloadType, packet.PayloadType());
459 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
460 EXPECT_EQ(kTimestamp, packet.Timestamp());
461 EXPECT_EQ(kSsrc, packet.Ssrc());
462 int32_t time_offset;
463 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
464 EXPECT_EQ(kTimeOffset, time_offset);
465 EXPECT_EQ(0u, packet.payload_size());
466 EXPECT_EQ(0u, packet.padding_size());
467}
468
Danil Chapovalovc5dd3002018-11-08 15:12:45 +0100469TEST(RtpPacketTest, GetExtensionWithoutParametersReturnsOptionalValue) {
470 RtpPacket::ExtensionManager extensions;
471 extensions.Register<TransmissionOffset>(kTransmissionOffsetExtensionId);
472 extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
473
474 RtpPacketReceived packet(&extensions);
475 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
476
477 auto time_offset = packet.GetExtension<TransmissionOffset>();
478 static_assert(
479 std::is_same<decltype(time_offset),
480 absl::optional<TransmissionOffset::value_type>>::value,
481 "");
482 EXPECT_EQ(time_offset, kTimeOffset);
483 EXPECT_FALSE(packet.GetExtension<RtpStreamId>().has_value());
484}
485
Danil Chapovalove19953b2018-10-01 16:12:28 +0200486TEST(RtpPacketTest, GetRawExtensionWhenPresent) {
487 constexpr uint8_t kRawPacket[] = {
488 // comment for clang-format to align kRawPacket nicer.
489 0x90, 100, 0x5e, 0x04, //
490 0x65, 0x43, 0x12, 0x78, // Timestamp.
491 0x12, 0x34, 0x56, 0x78, // Ssrc
492 0xbe, 0xde, 0x00, 0x01, // Extension header
493 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
494 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
495 RtpPacketToSend::ExtensionManager extensions;
496 extensions.Register<RtpMid>(1);
497 RtpPacket packet(&extensions);
498 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
499 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), ElementsAre('m', 'i', 'd'));
500}
501
502TEST(RtpPacketTest, GetRawExtensionWhenAbsent) {
503 constexpr uint8_t kRawPacket[] = {
504 // comment for clang-format to align kRawPacket nicer.
505 0x90, 100, 0x5e, 0x04, //
506 0x65, 0x43, 0x12, 0x78, // Timestamp.
507 0x12, 0x34, 0x56, 0x78, // Ssrc
508 0xbe, 0xde, 0x00, 0x01, // Extension header
509 0x12, 'm', 'i', 'd', // 3-byte extension with id=1.
510 'p', 'a', 'y', 'l', 'o', 'a', 'd'};
511 RtpPacketToSend::ExtensionManager extensions;
512 extensions.Register<RtpMid>(2);
513 RtpPacket packet(&extensions);
514 ASSERT_TRUE(packet.Parse(kRawPacket, sizeof(kRawPacket)));
515 EXPECT_THAT(packet.GetRawExtension<RtpMid>(), IsEmpty());
516}
517
danilchap07ec26d2016-06-17 04:18:54 -0700518TEST(RtpPacketTest, ParseWithInvalidSizedExtension) {
519 RtpPacketToSend::ExtensionManager extensions;
520 extensions.Register(kRtpExtensionTransmissionTimeOffset,
521 kTransmissionOffsetExtensionId);
522
523 RtpPacketReceived packet(&extensions);
524 EXPECT_TRUE(packet.Parse(kPacketWithInvalidExtension,
525 sizeof(kPacketWithInvalidExtension)));
526
527 // Extension should be ignored.
528 int32_t time_offset;
529 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
530
531 // But shouldn't prevent reading payload.
danilchap96c15872016-11-21 01:35:29 -0800532 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap07ec26d2016-06-17 04:18:54 -0700533}
534
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200535TEST(RtpPacketTest, ParseWithOverSizedExtension) {
536 // clang-format off
537 const uint8_t bad_packet[] = {
eladalonae550e32017-05-24 08:28:13 -0700538 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
Danil Chapovalova64a2fb2016-09-12 11:41:35 +0200539 0x65, 0x43, 0x12, 0x78, // kTimestamp.
540 0x12, 0x34, 0x56, 0x78, // kSsrc.
541 0xbe, 0xde, 0x00, 0x01, // Extension of size 1x32bit word.
542 0x00, // Add a byte of padding.
543 0x12, // Extension id 1 size (2+1).
544 0xda, 0x1a // Only 2 bytes of extension payload.
545 };
546 // clang-format on
547 RtpPacketToSend::ExtensionManager extensions;
548 extensions.Register(TransmissionOffset::kId, 1);
549 RtpPacketReceived packet(&extensions);
550
551 // Parse should ignore bad extension and proceed.
552 EXPECT_TRUE(packet.Parse(bad_packet, sizeof(bad_packet)));
553 int32_t time_offset;
554 // But extracting extension should fail.
555 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
556}
557
danilchap1edb7ab2016-04-20 05:25:10 -0700558TEST(RtpPacketTest, ParseWith2Extensions) {
559 RtpPacketToSend::ExtensionManager extensions;
560 extensions.Register(kRtpExtensionTransmissionTimeOffset,
561 kTransmissionOffsetExtensionId);
562 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
563 RtpPacketReceived packet(&extensions);
564 EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
565 int32_t time_offset;
566 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
567 EXPECT_EQ(kTimeOffset, time_offset);
568 bool voice_active;
569 uint8_t audio_level;
570 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
571 EXPECT_EQ(kVoiceActive, voice_active);
572 EXPECT_EQ(kAudioLevel, audio_level);
573}
574
Johannes Kron6ea77192018-09-24 17:19:52 +0200575TEST(RtpPacketTest, ParseSecondPacketWithFewerExtensions) {
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 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
583 EXPECT_TRUE(packet.HasExtension<AudioLevel>());
584
585 // Second packet without audio level.
586 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
587 EXPECT_TRUE(packet.HasExtension<TransmissionOffset>());
588 EXPECT_FALSE(packet.HasExtension<AudioLevel>());
589}
590
Johannes Kron07ba2b92018-09-26 13:33:35 +0200591TEST(RtpPacketTest, ParseWith2ExtensionsInvalidPadding) {
592 RtpPacketToSend::ExtensionManager extensions;
593 extensions.Register(kRtpExtensionTransmissionTimeOffset,
594 kTransmissionOffsetExtensionId);
595 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
596 RtpPacketReceived packet(&extensions);
597 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALInvalidPadding,
598 sizeof(kPacketWithTOAndALInvalidPadding)));
599 int32_t time_offset;
600 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
601 EXPECT_EQ(kTimeOffset, time_offset);
602 bool voice_active;
603 uint8_t audio_level;
604 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
605}
606
607TEST(RtpPacketTest, ParseWith2ExtensionsReservedExtensionId) {
608 RtpPacketToSend::ExtensionManager extensions;
609 extensions.Register(kRtpExtensionTransmissionTimeOffset,
610 kTransmissionOffsetExtensionId);
611 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
612 RtpPacketReceived packet(&extensions);
613 EXPECT_TRUE(packet.Parse(kPacketWithTOAndALReservedExtensionId,
614 sizeof(kPacketWithTOAndALReservedExtensionId)));
615 int32_t time_offset;
616 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
617 EXPECT_EQ(kTimeOffset, time_offset);
618 bool voice_active;
619 uint8_t audio_level;
620 EXPECT_FALSE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
621}
622
danilchap1edb7ab2016-04-20 05:25:10 -0700623TEST(RtpPacketTest, ParseWithAllFeatures) {
624 RtpPacketToSend::ExtensionManager extensions;
625 extensions.Register(kRtpExtensionTransmissionTimeOffset,
626 kTransmissionOffsetExtensionId);
627 RtpPacketReceived packet(&extensions);
628 EXPECT_TRUE(packet.Parse(kPacket, sizeof(kPacket)));
629 EXPECT_EQ(kPayloadType, packet.PayloadType());
630 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
631 EXPECT_EQ(kTimestamp, packet.Timestamp());
632 EXPECT_EQ(kSsrc, packet.Ssrc());
633 EXPECT_THAT(packet.Csrcs(), ElementsAreArray(kCsrcs));
danilchap96c15872016-11-21 01:35:29 -0800634 EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
danilchap1edb7ab2016-04-20 05:25:10 -0700635 EXPECT_EQ(kPacketPaddingSize, packet.padding_size());
636 int32_t time_offset;
637 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
638}
639
Johannes Kron07ba2b92018-09-26 13:33:35 +0200640TEST(RtpPacketTest, ParseTwoByteHeaderExtension) {
641 RtpPacketToSend::ExtensionManager extensions;
642 extensions.Register(kRtpExtensionTransmissionTimeOffset, kTwoByteExtensionId);
643 RtpPacketReceived packet(&extensions);
644 EXPECT_TRUE(packet.Parse(kPacketWithTwoByteHeaderExtension,
645 sizeof(kPacketWithTwoByteHeaderExtension)));
646 int32_t time_offset;
647 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
648 EXPECT_EQ(kTimeOffset, time_offset);
649}
650
651TEST(RtpPacketTest, ParseLongTwoByteHeaderExtension) {
652 RtpPacketToSend::ExtensionManager extensions;
653 extensions.Register(kRtpExtensionMid, kTwoByteExtensionId);
654 RtpPacketReceived packet(&extensions);
655 EXPECT_TRUE(packet.Parse(kPacketWithLongTwoByteHeaderExtension,
656 sizeof(kPacketWithLongTwoByteHeaderExtension)));
657 std::string long_rtp_mid;
658 EXPECT_TRUE(packet.GetExtension<RtpMid>(&long_rtp_mid));
659 EXPECT_EQ(kLongMid, long_rtp_mid);
660}
661
662TEST(RtpPacketTest, ParseTwoByteHeaderExtensionWithPadding) {
663 RtpPacketToSend::ExtensionManager extensions;
664 extensions.Register(kRtpExtensionTransmissionTimeOffset, kTwoByteExtensionId);
665 extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
666 RtpPacketReceived packet(&extensions);
667 EXPECT_TRUE(
668 packet.Parse(kPacketWithTwoByteHeaderExtensionWithPadding,
669 sizeof(kPacketWithTwoByteHeaderExtensionWithPadding)));
670 int32_t time_offset;
671 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
672 EXPECT_EQ(kTimeOffset, time_offset);
673 bool voice_active;
674 uint8_t audio_level;
675 EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
676 EXPECT_EQ(kVoiceActive, voice_active);
677 EXPECT_EQ(kAudioLevel, audio_level);
678}
679
danilchap1edb7ab2016-04-20 05:25:10 -0700680TEST(RtpPacketTest, ParseWithExtensionDelayed) {
681 RtpPacketReceived packet;
682 EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
683 EXPECT_EQ(kPayloadType, packet.PayloadType());
684 EXPECT_EQ(kSeqNum, packet.SequenceNumber());
685 EXPECT_EQ(kTimestamp, packet.Timestamp());
686 EXPECT_EQ(kSsrc, packet.Ssrc());
687
688 RtpPacketToSend::ExtensionManager extensions;
689 extensions.Register(kRtpExtensionTransmissionTimeOffset,
690 kTransmissionOffsetExtensionId);
691
692 int32_t time_offset;
693 EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
danilchap70f39a32016-12-16 05:48:18 -0800694 packet.IdentifyExtensions(extensions);
danilchap1edb7ab2016-04-20 05:25:10 -0700695 EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
696 EXPECT_EQ(kTimeOffset, time_offset);
697 EXPECT_EQ(0u, packet.payload_size());
698 EXPECT_EQ(0u, packet.padding_size());
699}
700
danilchapef8d7732017-04-19 02:59:48 -0700701TEST(RtpPacketTest, ParseDynamicSizeExtension) {
702 // clang-format off
703 const uint8_t kPacket1[] = {
eladalonae550e32017-05-24 08:28:13 -0700704 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700705 0x65, 0x43, 0x12, 0x78, // Timestamp.
706 0x12, 0x34, 0x56, 0x78, // Ssrc.
707 0xbe, 0xde, 0x00, 0x02, // Extensions block of size 2x32bit words.
708 0x21, 'H', 'D', // Extension with id = 2, size = (1+1).
709 0x12, 'r', 't', 'x', // Extension with id = 1, size = (2+1).
710 0x00}; // Extension padding.
711 const uint8_t kPacket2[] = {
eladalonae550e32017-05-24 08:28:13 -0700712 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
danilchapef8d7732017-04-19 02:59:48 -0700713 0x65, 0x43, 0x12, 0x78, // Timestamp.
714 0x12, 0x34, 0x56, 0x79, // Ssrc.
715 0xbe, 0xde, 0x00, 0x01, // Extensions block of size 1x32bit words.
716 0x11, 'H', 'D', // Extension with id = 1, size = (1+1).
717 0x00}; // Extension padding.
718 // clang-format on
719 RtpPacketReceived::ExtensionManager extensions;
720 extensions.Register<RtpStreamId>(1);
721 extensions.Register<RepairedRtpStreamId>(2);
722 RtpPacketReceived packet(&extensions);
723 ASSERT_TRUE(packet.Parse(kPacket1, sizeof(kPacket1)));
724
725 std::string rsid;
726 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
727 EXPECT_EQ(rsid, "rtx");
728
729 std::string repaired_rsid;
730 EXPECT_TRUE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
731 EXPECT_EQ(repaired_rsid, "HD");
732
733 // Parse another packet with RtpStreamId extension of different size.
734 ASSERT_TRUE(packet.Parse(kPacket2, sizeof(kPacket2)));
735 EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
736 EXPECT_EQ(rsid, "HD");
737 EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
738}
739
Steve Antona3251dd2017-07-21 09:58:31 -0700740TEST(RtpPacketTest, ParseWithMid) {
741 RtpPacketReceived::ExtensionManager extensions;
742 extensions.Register<RtpMid>(kRtpMidExtensionId);
743 RtpPacketReceived packet(&extensions);
744 ASSERT_TRUE(packet.Parse(kPacketWithMid, sizeof(kPacketWithMid)));
745
746 std::string mid;
747 EXPECT_TRUE(packet.GetExtension<RtpMid>(&mid));
748 EXPECT_EQ(mid, kMid);
749}
750
sprangba050a62017-08-18 02:51:12 -0700751TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) {
752 // Create a packet with video frame timing extension populated.
753 RtpPacketToSend::ExtensionManager send_extensions;
754 send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId);
755 RtpPacketToSend send_packet(&send_extensions);
756 send_packet.SetPayloadType(kPayloadType);
757 send_packet.SetSequenceNumber(kSeqNum);
758 send_packet.SetTimestamp(kTimestamp);
759 send_packet.SetSsrc(kSsrc);
760
761 VideoSendTiming timing;
762 timing.encode_start_delta_ms = 1;
763 timing.encode_finish_delta_ms = 2;
764 timing.packetization_finish_delta_ms = 3;
765 timing.pacer_exit_delta_ms = 4;
766 timing.flags =
Ilya Nikolaevskiyb6c462d2018-06-05 15:21:32 +0200767 VideoSendTiming::kTriggeredByTimer | VideoSendTiming::kTriggeredBySize;
sprangba050a62017-08-18 02:51:12 -0700768
769 send_packet.SetExtension<VideoTimingExtension>(timing);
770
771 // Serialize the packet and then parse it again.
772 RtpPacketReceived::ExtensionManager extensions;
773 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
774 RtpPacketReceived receive_packet(&extensions);
775 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
776
777 VideoSendTiming receivied_timing;
778 EXPECT_TRUE(
779 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing));
780
781 // Only check first and last timestamp (covered by other tests) plus flags.
782 EXPECT_EQ(receivied_timing.encode_start_delta_ms,
783 timing.encode_start_delta_ms);
784 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, timing.pacer_exit_delta_ms);
785 EXPECT_EQ(receivied_timing.flags, timing.flags);
786}
787
788TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) {
789 // Parse the modified packet.
790 RtpPacketReceived::ExtensionManager extensions;
791 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
792 RtpPacketReceived packet(&extensions);
793 EXPECT_TRUE(packet.Parse(kPacketWithLegacyTimingExtension,
794 sizeof(kPacketWithLegacyTimingExtension)));
795 VideoSendTiming receivied_timing;
796 EXPECT_TRUE(packet.GetExtension<VideoTimingExtension>(&receivied_timing));
797
798 // Check first and last timestamp are still OK. Flags should now be 0.
799 EXPECT_EQ(receivied_timing.encode_start_delta_ms, 1);
800 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, 4);
801 EXPECT_EQ(receivied_timing.flags, 0);
802}
803
danilchap1edb7ab2016-04-20 05:25:10 -0700804} // namespace webrtc