blob: 37a9a531de6c89e5cb0d4e5d80e8de21d81d835a [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
Johannes Kronad1d9f02018-11-09 11:12:36 +0100188
189HdrMetadata CreateTestHdrMetadata() {
190 // Random but reasonable HDR metadata.
191 HdrMetadata hdr_metadata;
192 hdr_metadata.mastering_metadata.luminance_max = 2000.0;
193 hdr_metadata.mastering_metadata.luminance_min = 2.0001;
194 hdr_metadata.mastering_metadata.primary_r.x = 0.3003;
195 hdr_metadata.mastering_metadata.primary_r.y = 0.4004;
196 hdr_metadata.mastering_metadata.primary_g.x = 0.3201;
197 hdr_metadata.mastering_metadata.primary_g.y = 0.4604;
198 hdr_metadata.mastering_metadata.primary_b.x = 0.3409;
199 hdr_metadata.mastering_metadata.primary_b.y = 0.4907;
200 hdr_metadata.mastering_metadata.white_point.x = 0.4103;
201 hdr_metadata.mastering_metadata.white_point.y = 0.4806;
202 hdr_metadata.max_content_light_level = 2345;
203 hdr_metadata.max_frame_average_light_level = 1789;
204 return hdr_metadata;
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 Kronad1d9f02018-11-09 11:12:36 +0100822TEST(RtpPacketTest, CreateAndParseHdrMetadataExtension) {
823 // Create packet with extension.
824 RtpPacket::ExtensionManager extensions(/*extmap-allow-mixed=*/true);
825 extensions.Register<HdrMetadataExtension>(1);
826 RtpPacket packet(&extensions);
827 const HdrMetadata kHdrMetadata = CreateTestHdrMetadata();
828 EXPECT_TRUE(packet.SetExtension<HdrMetadataExtension>(kHdrMetadata));
829 packet.SetPayloadSize(42);
830
831 // Read packet with the extension.
832 RtpPacketReceived parsed(&extensions);
833 EXPECT_TRUE(parsed.Parse(packet.Buffer()));
834 HdrMetadata parsed_hdr_metadata;
835 EXPECT_TRUE(parsed.GetExtension<HdrMetadataExtension>(&parsed_hdr_metadata));
836 EXPECT_EQ(kHdrMetadata, parsed_hdr_metadata);
837}
838
danilchap1edb7ab2016-04-20 05:25:10 -0700839} // namespace webrtc