Chromium Code Reviews

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc

Issue 1232023006: Add support for VP9 packetization/depacketization. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: rebase Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2015 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 */
10
11 #include <vector>
12
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h"
16 #include "webrtc/typedefs.h"
17
18 namespace webrtc {
19 namespace {
20 void VerifyHeader(const RTPVideoHeaderVP9& expected,
21 const RTPVideoHeaderVP9& actual) {
22 EXPECT_EQ(expected.inter_layer_predicted, actual.inter_layer_predicted);
23 EXPECT_EQ(expected.inter_pic_predicted, actual.inter_pic_predicted);
24 EXPECT_EQ(expected.flexible_mode, actual.flexible_mode);
25 EXPECT_EQ(expected.beginning_of_frame, actual.beginning_of_frame);
26 EXPECT_EQ(expected.end_of_frame, actual.end_of_frame);
27 EXPECT_EQ(expected.ss_data_available, actual.ss_data_available);
28 EXPECT_EQ(expected.picture_id, actual.picture_id);
29 EXPECT_EQ(expected.max_picture_id, actual.max_picture_id);
30 EXPECT_EQ(expected.temporal_idx == kNoTemporalIdx ? 0 : expected.temporal_idx,
31 actual.temporal_idx);
32 EXPECT_EQ(expected.spatial_idx == kNoSpatialIdx ? 0 : expected.spatial_idx,
33 actual.spatial_idx);
34 EXPECT_EQ(expected.gof_idx, actual.gof_idx);
35 EXPECT_EQ(expected.tl0_pic_idx, actual.tl0_pic_idx);
36 EXPECT_EQ(expected.temporal_up_switch, actual.temporal_up_switch);
37
38 EXPECT_EQ(expected.num_ref_pics, actual.num_ref_pics);
39 for (uint8_t i = 0; i < expected.num_ref_pics; ++i) {
40 EXPECT_EQ(expected.pid_diff[i], actual.pid_diff[i]);
41 EXPECT_EQ(expected.ref_picture_id[i], actual.ref_picture_id[i]);
42 }
43 if (expected.ss_data_available) {
44 EXPECT_EQ(expected.spatial_layer_resolution_present,
45 actual.spatial_layer_resolution_present);
46 EXPECT_EQ(expected.num_spatial_layers, actual.num_spatial_layers);
47 if (expected.spatial_layer_resolution_present) {
48 for (size_t i = 0; i < expected.num_spatial_layers; i++) {
49 EXPECT_EQ(expected.width[i], actual.width[i]);
50 EXPECT_EQ(expected.height[i], actual.height[i]);
51 }
52 }
53 EXPECT_EQ(expected.gof.num_frames_in_gof, actual.gof.num_frames_in_gof);
54 for (size_t i = 0; i < expected.gof.num_frames_in_gof; i++) {
55 EXPECT_EQ(expected.gof.temporal_up_switch[i],
56 actual.gof.temporal_up_switch[i]);
57 EXPECT_EQ(expected.gof.temporal_idx[i], actual.gof.temporal_idx[i]);
58 EXPECT_EQ(expected.gof.num_ref_pics[i], actual.gof.num_ref_pics[i]);
59 for (size_t j = 0; j < expected.gof.num_ref_pics[i]; j++) {
60 EXPECT_EQ(expected.gof.pid_diff[i][j], actual.gof.pid_diff[i][j]);
61 }
62 }
63 }
64 }
65
66 void VerifyPayload(const RtpDepacketizer::ParsedPayload& parsed,
67 const uint8_t* payload,
68 size_t payload_length) {
69 EXPECT_EQ(payload, parsed.payload);
70 EXPECT_EQ(payload_length, parsed.payload_length);
71 EXPECT_THAT(std::vector<uint8_t>(parsed.payload,
72 parsed.payload + parsed.payload_length),
73 ::testing::ElementsAreArray(payload, payload_length));
74 }
75
76 void ParseAndCheckPacket(const uint8_t* packet,
77 const RTPVideoHeaderVP9& expected,
78 size_t expected_hdr_length,
79 size_t expected_length) {
80 rtc::scoped_ptr<RtpDepacketizer> depacketizer(new RtpDepacketizerVp9());
81 RtpDepacketizer::ParsedPayload parsed;
82 ASSERT_TRUE(depacketizer->Parse(&parsed, packet, expected_length));
83 EXPECT_EQ(kRtpVideoVp9, parsed.type.Video.codec);
84 VerifyHeader(expected, parsed.type.Video.codecHeader.VP9);
85 const size_t kExpectedPayloadLength = expected_length - expected_hdr_length;
86 VerifyPayload(parsed, packet + expected_hdr_length, kExpectedPayloadLength);
87 }
88 } // namespace
89
90 // Payload descriptor for flexible mode
91 // 0 1 2 3 4 5 6 7
92 // +-+-+-+-+-+-+-+-+
93 // |I|P|L|F|B|E|V|-| (REQUIRED)
94 // +-+-+-+-+-+-+-+-+
95 // I: |M| PICTURE ID | (RECOMMENDED)
96 // +-+-+-+-+-+-+-+-+
97 // M: | EXTENDED PID | (RECOMMENDED)
98 // +-+-+-+-+-+-+-+-+
99 // L: | T |U| S |D| (CONDITIONALLY RECOMMENDED)
100 // +-+-+-+-+-+-+-+-+ -|
101 // P,F: | P_DIFF |X|N| (CONDITIONALLY RECOMMENDED) .
102 // +-+-+-+-+-+-+-+-+ . up to 3 times
103 // X: |EXTENDED P_DIFF| (OPTIONAL) .
104 // +-+-+-+-+-+-+-+-+ -|
105 // V: | SS |
106 // | .. |
107 // +-+-+-+-+-+-+-+-+
108 //
109 // Payload descriptor for non-flexible mode
110 // 0 1 2 3 4 5 6 7
111 // +-+-+-+-+-+-+-+-+
112 // |I|P|L|F|B|E|V|-| (REQUIRED)
113 // +-+-+-+-+-+-+-+-+
114 // I: |M| PICTURE ID | (RECOMMENDED)
115 // +-+-+-+-+-+-+-+-+
116 // M: | EXTENDED PID | (RECOMMENDED)
117 // +-+-+-+-+-+-+-+-+
118 // L: |GOF_IDX| S |D| (CONDITIONALLY RECOMMENDED)
119 // +-+-+-+-+-+-+-+-+
120 // | TL0PICIDX | (CONDITIONALLY REQUIRED)
121 // +-+-+-+-+-+-+-+-+
122 // V: | SS |
123 // | .. |
124 // +-+-+-+-+-+-+-+-+
125
126 class RtpPacketizerVp9Test : public ::testing::Test {
127 protected:
128 RtpPacketizerVp9Test() {}
129 virtual void SetUp() {
130 expected_.InitRTPVideoHeaderVP9();
131 // Always input one layer frame at a time.
132 expected_.beginning_of_frame = true;
133 expected_.end_of_frame = true;
134 }
135
136 rtc::scoped_ptr<uint8_t[]> packet_;
137 rtc::scoped_ptr<uint8_t[]> payload_;
138 size_t payload_size_;
139 size_t payload_pos_;
140 RTPVideoHeaderVP9 expected_;
141 rtc::scoped_ptr<RtpPacketizerVp9> packetizer_;
142
143 void Init(size_t payload_size, size_t packet_size) {
144 payload_.reset(new uint8_t[payload_size]);
145 memset(payload_.get(), 7, payload_size);
146 payload_size_ = payload_size;
147 payload_pos_ = 0;
148 packetizer_.reset(new RtpPacketizerVp9(expected_, packet_size));
149 packetizer_->SetPayloadData(payload_.get(), payload_size_, NULL);
150
151 const int kMaxPayloadDescriptorLength = 100;
152 packet_.reset(new uint8_t[payload_size_ + kMaxPayloadDescriptorLength]);
153 }
154
155 void CheckPayload(const uint8_t* packet,
156 size_t start_pos,
157 size_t end_pos,
158 bool last) {
159 for (size_t i = start_pos; i < end_pos; ++i) {
160 EXPECT_EQ(packet[i], payload_[payload_pos_++]);
161 }
162 EXPECT_EQ(last, payload_pos_ == payload_size_);
163 }
164
165 void CreateParseAndCheckPackets(const size_t* expected_hdr_sizes,
166 const size_t* expected_sizes,
167 size_t expected_num_packets) {
168 ASSERT_TRUE(packetizer_.get() != NULL);
169 size_t length = 0;
170 bool last = false;
171 if (expected_num_packets == 0) {
172 EXPECT_FALSE(packetizer_->NextPacket(packet_.get(), &length, &last));
173 return;
174 }
175 for (size_t i = 0; i < expected_num_packets; ++i) {
176 EXPECT_TRUE(packetizer_->NextPacket(packet_.get(), &length, &last));
177 EXPECT_EQ(expected_sizes[i], length);
178 RTPVideoHeaderVP9 hdr = expected_;
179 hdr.beginning_of_frame = (i == 0);
180 hdr.end_of_frame = last;
181 ParseAndCheckPacket(packet_.get(), hdr, expected_hdr_sizes[i], length);
182 CheckPayload(packet_.get(), expected_hdr_sizes[i], length, last);
183 }
184 EXPECT_TRUE(last);
185 }
186 };
187
188 TEST_F(RtpPacketizerVp9Test, TestEqualSizedMode_OnePacket) {
189 const size_t kFrameSize = 25;
190 const size_t kPacketSize = 26;
191 Init(kFrameSize, kPacketSize);
192
193 // One packet:
194 // I:0, P:0, L:0, F:0, B:1, E:1, V:0 (1hdr + 25 payload)
195 const size_t kExpectedHdrSizes[] = {1};
196 const size_t kExpectedSizes[] = {26};
197 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
198 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
199 }
200
201 TEST_F(RtpPacketizerVp9Test, TestEqualSizedMode_TwoPackets) {
202 const size_t kFrameSize = 27;
203 const size_t kPacketSize = 27;
204 Init(kFrameSize, kPacketSize);
205
206 // Two packets:
207 // I:0, P:0, L:0, F:0, B:1, E:0, V:0 (1hdr + 14 payload)
208 // I:0, P:0, L:0, F:0, B:0, E:1, V:0 (1hdr + 13 payload)
209 const size_t kExpectedHdrSizes[] = {1, 1};
210 const size_t kExpectedSizes[] = {15, 14};
211 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
212 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
213 }
214
215 TEST_F(RtpPacketizerVp9Test, TestTooShortBufferToFitPayload) {
216 const size_t kFrameSize = 1;
217 const size_t kPacketSize = 1;
218 Init(kFrameSize, kPacketSize); // 1hdr + 1 payload
219
220 const size_t kExpectedNum = 0;
221 CreateParseAndCheckPackets(NULL, NULL, kExpectedNum);
222 }
223
224 TEST_F(RtpPacketizerVp9Test, TestOneBytePictureId) {
225 const size_t kFrameSize = 30;
226 const size_t kPacketSize = 12;
227
228 expected_.picture_id = kMaxOneBytePictureId; // 2 byte payload descriptor
229 expected_.max_picture_id = kMaxOneBytePictureId;
230 Init(kFrameSize, kPacketSize);
231
232 // Three packets:
233 // I:1, P:0, L:0, F:0, B:1, E:0, V:0 (2hdr + 10 payload)
234 // I:1, P:0, L:0, F:0, B:0, E:0, V:0 (2hdr + 10 payload)
235 // I:1, P:0, L:0, F:0, B:0, E:1, V:0 (2hdr + 10 payload)
236 const size_t kExpectedHdrSizes[] = {2, 2, 2};
237 const size_t kExpectedSizes[] = {12, 12, 12};
238 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
239 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
240 }
241
242 TEST_F(RtpPacketizerVp9Test, TestTwoBytePictureId) {
243 const size_t kFrameSize = 31;
244 const size_t kPacketSize = 13;
245
246 expected_.picture_id = kMaxTwoBytePictureId; // 3 byte payload descriptor
247 Init(kFrameSize, kPacketSize);
248
249 // Four packets:
250 // I:1, P:0, L:0, F:0, B:1, E:0, V:0 (3hdr + 8 payload)
251 // I:1, P:0, L:0, F:0, B:0, E:0, V:0 (3hdr + 8 payload)
252 // I:1, P:0, L:0, F:0, B:0, E:0, V:0 (3hdr + 8 payload)
253 // I:1, P:0, L:0, F:0, B:0, E:1, V:0 (3hdr + 7 payload)
254 const size_t kExpectedHdrSizes[] = {3, 3, 3, 3};
255 const size_t kExpectedSizes[] = {11, 11, 11, 10};
256 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
257 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
258 }
259
260 TEST_F(RtpPacketizerVp9Test, TestLayerInfoWithNonFlexibleMode) {
261 const size_t kFrameSize = 30;
262 const size_t kPacketSize = 25;
263
264 expected_.gof_idx = 3;
265 expected_.spatial_idx = 2;
266 expected_.inter_layer_predicted = true; // D
267 expected_.tl0_pic_idx = 117;
268 Init(kFrameSize, kPacketSize);
269
270 // Two packets:
271 // | I:0, P:0, L:1, F:0, B:1, E:0, V:0 | (3hdr + 15 payload)
272 // L: | GOF_IDX:3, S:2, D:1 | TL0PICIDX:117 |
273 // | I:0, P:0, L:1, F:0, B:0, E:1, V:0 | (3hdr + 15 payload)
274 // L: | GOF_IDX:3, S:2, D:1 | TL0PICIDX:117 |
275 const size_t kExpectedHdrSizes[] = {3, 3};
276 const size_t kExpectedSizes[] = {18, 18};
277 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
278 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
279 }
280
281 TEST_F(RtpPacketizerVp9Test, TestLayerInfoWithFlexibleMode) {
282 const size_t kFrameSize = 21;
283 const size_t kPacketSize = 23;
284
285 expected_.flexible_mode = true;
286 expected_.temporal_idx = 3;
287 expected_.temporal_up_switch = true; // U
288 expected_.spatial_idx = 2;
289 expected_.inter_layer_predicted = false; // D
290 Init(kFrameSize, kPacketSize);
291
292 // One packet:
293 // I:0, P:0, L:1, F:1, B:1, E:1, V:0 (2hdr + 21 payload)
294 // L: T:3, U:1, S:2, D:0
295 const size_t kExpectedHdrSizes[] = {2};
296 const size_t kExpectedSizes[] = {23};
297 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
298 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
299 }
300
301 TEST_F(RtpPacketizerVp9Test, TestRefIdx) {
302 const size_t kFrameSize = 16;
303 const size_t kPacketSize = 22;
304
305 expected_.inter_pic_predicted = true; // P
306 expected_.flexible_mode = true; // F
307 expected_.picture_id = 100;
308 expected_.num_ref_pics = 2;
309 expected_.pid_diff[0] = 3;
310 expected_.pid_diff[1] = 1171;
311 expected_.ref_picture_id[0] = 97; // 100 - 3 = 97
312 expected_.ref_picture_id[1] = 31697; // 0x7FFF + 1 + 100 - 1171 = 31697
313 Init(kFrameSize, kPacketSize);
314
315 // Two packets:
316 // I:1, P:1, L:0, F:1, B:1, E:1, V:0 (6hdr + 16 payload)
317 // I: 100 (2 bytes)
318 // P,F: P_DIFF:3, X:0, N:1
319 // P_DIFF:1171, X:1, N:0 (2 bytes)
320 const size_t kExpectedHdrSizes[] = {6};
321 const size_t kExpectedSizes[] = {22};
322 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
323 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
324 }
325
326 TEST_F(RtpPacketizerVp9Test, TestRefIdxFailsWithoutPictureId) {
327 const size_t kFrameSize = 16;
328 const size_t kPacketSize = 22;
329
330 expected_.inter_pic_predicted = true;
331 expected_.flexible_mode = true;
332 expected_.num_ref_pics = 1;
333 expected_.pid_diff[0] = 3;
334 Init(kFrameSize, kPacketSize);
335
336 const size_t kExpectedNum = 0;
337 CreateParseAndCheckPackets(NULL, NULL, kExpectedNum);
338 }
339
340 TEST_F(RtpPacketizerVp9Test, TestSsDataWithoutSpatialResolutionPresent) {
341 const size_t kFrameSize = 21;
342 const size_t kPacketSize = 25;
343
344 expected_.ss_data_available = true;
345 expected_.num_spatial_layers = 1;
346 expected_.spatial_layer_resolution_present = false;
347 expected_.gof.num_frames_in_gof = 1;
348 expected_.gof.temporal_idx[0] = 0;
349 expected_.gof.temporal_up_switch[0] = true;
350 expected_.gof.num_ref_pics[0] = 1;
351 expected_.gof.pid_diff[0][0] = 4;
352 Init(kFrameSize, kPacketSize);
353
354 // One packet:
355 // I:0, P:0, L:0, F:0, B:1, E:1, V:1 (4hdr + 21 payload)
356 // N_S:0, Y:0, N_G:0
357 // T:0, U:1, R:1 | P_DIFF[0][0]:4
358 const size_t kExpectedHdrSizes[] = {4};
359 const size_t kExpectedSizes[] = {25};
360 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
361 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
362 }
363
364 TEST_F(RtpPacketizerVp9Test, TestSsData) {
365 const size_t kFrameSize = 21;
366 const size_t kPacketSize = 39;
367
368 expected_.ss_data_available = true;
369 expected_.num_spatial_layers = 2;
370 expected_.spatial_layer_resolution_present = true;
371 expected_.width[0] = 640;
372 expected_.width[1] = 1280;
373 expected_.height[0] = 360;
374 expected_.height[1] = 720;
375 expected_.gof.num_frames_in_gof = 3;
376 expected_.gof.temporal_idx[0] = 0;
377 expected_.gof.temporal_idx[1] = 1;
378 expected_.gof.temporal_idx[2] = 2;
379 expected_.gof.temporal_up_switch[0] = true;
380 expected_.gof.temporal_up_switch[1] = true;
381 expected_.gof.temporal_up_switch[2] = false;
382 expected_.gof.num_ref_pics[0] = 0;
383 expected_.gof.num_ref_pics[1] = 3;
384 expected_.gof.num_ref_pics[2] = 2;
385 expected_.gof.pid_diff[1][0] = 5;
386 expected_.gof.pid_diff[1][1] = 6;
387 expected_.gof.pid_diff[1][2] = 7;
388 expected_.gof.pid_diff[2][0] = 8;
389 expected_.gof.pid_diff[2][1] = 9;
390 Init(kFrameSize, kPacketSize);
391
392 // One packet:
393 // I:0, P:0, L:0, F:0, B:1, E:1, V:1 (18hdr + 21 payload)
394 // N_S:1, Y:1, N_G:2
395 // WIDTH:640 // 2 bytes
396 // HEIGHT:360 // 2 bytes
397 // WIDTH:1280 // 2 bytes
398 // HEIGHT:720 // 2 bytes
399 // T:0, U:1, R:0
400 // T:1, U:1, R:3 | P_DIFF[1][0]:5 | P_DIFF[1][1]:6 | P_DIFF[1][2]:7
401 // T:2, U:0, R:2 | P_DIFF[2][0]:8 | P_DIFF[2][0]:9
402 const size_t kExpectedHdrSizes[] = {18};
403 const size_t kExpectedSizes[] = {39};
404 const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
405 CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
406 }
407
408 TEST_F(RtpPacketizerVp9Test, TestBaseLayerProtectionAndStorageType) {
409 const size_t kFrameSize = 10;
410 const size_t kPacketSize = 12;
411
412 // I:0, P:0, L:1, F:1, B:1, E:1, V:0 (2hdr + 10 payload)
413 // L: T:0, U:0, S:0, D:0
414 expected_.flexible_mode = true;
415 expected_.temporal_idx = 0;
416 Init(kFrameSize, kPacketSize);
417 EXPECT_EQ(kProtectedPacket, packetizer_->GetProtectionType());
418 EXPECT_EQ(kAllowRetransmission,
419 packetizer_->GetStorageType(kRetransmitBaseLayer));
420 EXPECT_EQ(kDontRetransmit, packetizer_->GetStorageType(kRetransmitOff));
421 }
422
423 TEST_F(RtpPacketizerVp9Test, TestHigherLayerProtectionAndStorageType) {
424 const size_t kFrameSize = 10;
425 const size_t kPacketSize = 12;
426
427 // I:0, P:0, L:1, F:1, B:1, E:1, V:0 (2hdr + 10 payload)
428 // L: T:1, U:0, S:0, D:0
429 expected_.flexible_mode = true;
430 expected_.temporal_idx = 1;
431 Init(kFrameSize, kPacketSize);
432 EXPECT_EQ(kUnprotectedPacket, packetizer_->GetProtectionType());
433 EXPECT_EQ(kDontRetransmit, packetizer_->GetStorageType(kRetransmitBaseLayer));
434 EXPECT_EQ(kAllowRetransmission,
435 packetizer_->GetStorageType(kRetransmitHigherLayers));
436 }
437
438
439 class RtpDepacketizerVp9Test : public ::testing::Test {
440 protected:
441 RtpDepacketizerVp9Test()
442 : depacketizer_(new RtpDepacketizerVp9()) {}
443
444 virtual void SetUp() {
445 expected_.InitRTPVideoHeaderVP9();
446 }
447
448 RTPVideoHeaderVP9 expected_;
449 rtc::scoped_ptr<RtpDepacketizer> depacketizer_;
450 };
451
452 TEST_F(RtpDepacketizerVp9Test, ParseBasicHeader) {
453 const uint8_t kHeaderLength = 1;
454 uint8_t packet[4] = {0};
455 packet[0] = 0x0C; // I:0 P:0 L:0 F:0 B:1 E:1 V:0 R:0
456 expected_.beginning_of_frame = true;
457 expected_.end_of_frame = true;
458 ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
459 }
460
461 TEST_F(RtpDepacketizerVp9Test, ParseOneBytePictureId) {
462 const uint8_t kHeaderLength = 2;
463 uint8_t packet[10] = {0};
464 packet[0] = 0x80; // I:1 P:0 L:0 F:0 B:0 E:0 V:0 R:0
465 packet[1] = kMaxOneBytePictureId;
466
467 expected_.picture_id = kMaxOneBytePictureId;
468 expected_.max_picture_id = kMaxOneBytePictureId;
469 ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
470 }
471
472 TEST_F(RtpDepacketizerVp9Test, ParseTwoBytePictureId) {
473 const uint8_t kHeaderLength = 3;
474 uint8_t packet[10] = {0};
475 packet[0] = 0x80; // I:1 P:0 L:0 F:0 B:0 E:0 V:0 R:0
476 packet[1] = 0x80 | ((kMaxTwoBytePictureId >> 8) & 0x7F);
477 packet[2] = kMaxTwoBytePictureId & 0xFF;
478
479 expected_.picture_id = kMaxTwoBytePictureId;
480 expected_.max_picture_id = kMaxTwoBytePictureId;
481 ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
482 }
483
484 TEST_F(RtpDepacketizerVp9Test, ParseLayerInfoWithNonFlexibleMode) {
485 const uint8_t kHeaderLength = 3;
486 const uint8_t kGofIdx = 7;
487 const uint8_t kSpatialIdx = 1;
488 const uint8_t kDbit = 1;
489 const uint8_t kTl0PicIdx = 17;
490 uint8_t packet[13] = {0};
491 packet[0] = 0x20; // I:0 P:0 L:1 F:0 B:0 E:0 V:0 R:0
492 packet[1] = (kGofIdx << 4) | (kSpatialIdx << 1) | kDbit; // GOF_IDX:7 S:1 D:1
493 packet[2] = kTl0PicIdx; // TL0PICIDX:17
494
495 expected_.gof_idx = kGofIdx;
496 expected_.spatial_idx = kSpatialIdx;
497 expected_.inter_layer_predicted = kDbit ? true : false;
498 expected_.tl0_pic_idx = kTl0PicIdx;
499 ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
500 }
501
502 TEST_F(RtpDepacketizerVp9Test, ParseLayerInfoWithFlexibleMode) {
503 const uint8_t kHeaderLength = 2;
504 const uint8_t kTemporalIdx = 2;
505 const uint8_t kUbit = 1;
506 const uint8_t kSpatialIdx = 0;
507 const uint8_t kDbit = 0;
508 uint8_t packet[13] = {0};
509 packet[0] = 0x38; // I:0 P:0 L:1 F:1 B:1 E:0 V:0 R:0
510 packet[1] = (kTemporalIdx << 5) | (kUbit << 4) | (kSpatialIdx << 1) | kDbit;
511
512 // I:0 P:0 L:1 F:1 B:1 E:0 V:0
513 // L: T:2 U:1 S:0 D:0
514 expected_.beginning_of_frame = true;
515 expected_.flexible_mode = true;
516 expected_.temporal_idx = kTemporalIdx;
517 expected_.temporal_up_switch = kUbit ? true : false;
518 expected_.spatial_idx = kSpatialIdx;
519 expected_.inter_layer_predicted = kDbit ? true : false;
520 ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
521 }
522
523 TEST_F(RtpDepacketizerVp9Test, ParseRefIdx) {
524 const uint8_t kHeaderLength = 7;
525 const int16_t kPictureId = 17;
526 const int16_t kPdiff1 = 17;
527 const int16_t kPdiff2 = 18;
528 const int16_t kExtPdiff3 = 2171;
529 uint8_t packet[13] = {0};
530 packet[0] = 0xD8; // I:1 P:1 L:0 F:1 B:1 E:0 V:0 R:0
531 packet[1] = 0x80 | ((kPictureId >> 8) & 0x7F); // Two byte pictureID.
532 packet[2] = kPictureId;
533 packet[3] = (kPdiff1 << 2) | (0 << 1) | 1; // P_DIFF X:0 N:1
534 packet[4] = (kPdiff2 << 2) | (0 << 1) | 1; // P_DIFF X:0 N:1
535 packet[5] = ((kExtPdiff3 >> 8) << 2) | (1 << 1) | 0; // P_DIFF X:1 N:0
536 packet[6] = kExtPdiff3 & 0xff; // EXTENDED P_DIFF
537
538 // I:1 P:1 L:0 F:1 B:1 E:0 V:0
539 // I: PICTURE ID:17
540 // I:
541 // P,F: P_DIFF:17 X:0 N:1 => refPictureId = 17 - 17 = 0
542 // P,F: P_DIFF:18 X:0 N:1 => refPictureId = 0x7FFF + 1 + 17 - 18 = 0x7FFF
543 // P,F: P_DIFF:2171 X:1 N:0 => refPictureId = 0x7FFF + 1 + 17 - 2171 = 30614
544 expected_.beginning_of_frame = true;
545 expected_.inter_pic_predicted = true;
546 expected_.flexible_mode = true;
547 expected_.picture_id = kPictureId;
548 expected_.num_ref_pics = 3;
549 expected_.pid_diff[0] = kPdiff1;
550 expected_.pid_diff[1] = kPdiff2;
551 expected_.pid_diff[2] = kExtPdiff3;
552 expected_.ref_picture_id[0] = 0;
553 expected_.ref_picture_id[1] = 0x7FFF;
554 expected_.ref_picture_id[2] = 30614;
555 ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
556 }
557
558 TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithNoPictureId) {
559 const int16_t kPdiff = 3;
560 uint8_t packet[13] = {0};
561 packet[0] = 0x58; // I:0 P:1 L:0 F:1 B:1 E:0 V:0 R:0
562 packet[1] = (kPdiff << 2) | (0 << 1) | 0; // P,F: P_DIFF:3 X:0 N:0
563
564 RtpDepacketizer::ParsedPayload parsed;
565 EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
566 }
567
568 TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithTooManyRefPics) {
569 const int16_t kPdiff = 3;
570 uint8_t packet[13] = {0};
571 packet[0] = 0xD8; // I:1 P:1 L:0 F:1 B:1 E:0 V:0 R:0
572 packet[1] = kMaxOneBytePictureId; // I: PICTURE ID:127
573 packet[2] = (kPdiff << 2) | (0 << 1) | 1; // P,F: P_DIFF:3 X:0 N:1
574 packet[3] = (kPdiff << 2) | (0 << 1) | 1; // P,F: P_DIFF:3 X:0 N:1
575 packet[4] = (kPdiff << 2) | (0 << 1) | 1; // P,F: P_DIFF:3 X:0 N:1
576 packet[5] = (kPdiff << 2) | (0 << 1) | 0; // P,F: P_DIFF:3 X:0 N:0
577
578 RtpDepacketizer::ParsedPayload parsed;
579 EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
580 }
581
582 TEST_F(RtpDepacketizerVp9Test, ParseSsData) {
583 const uint8_t kHeaderLength = 5;
584 const uint8_t kYbit = 0;
585 const size_t kNs = 2;
586 const size_t kNg = 2;
587 uint8_t packet[23] = {0};
588 packet[0] = 0x0A; // I:0 P:0 L:0 F:0 B:1 E:0 V:1 R:0
589 packet[1] = ((kNs - 1) << 5) | (kYbit << 4) | (kNg - 1); // N_S Y N_G
590 packet[2] = (0 << 5) | (1 << 4) | (0 << 2) | 0; // T:0 U:1 R:0 -
591 packet[3] = (2 << 5) | (0 << 4) | (1 << 2) | 0; // T:2 U:0 R:1 -
592 packet[4] = 33;
593
594 expected_.beginning_of_frame = true;
595 expected_.ss_data_available = true;
596 expected_.num_spatial_layers = kNs;
597 expected_.spatial_layer_resolution_present = kYbit ? true : false;
598 expected_.gof.num_frames_in_gof = kNg;
599 expected_.gof.temporal_idx[0] = 0;
600 expected_.gof.temporal_idx[1] = 2;
601 expected_.gof.temporal_up_switch[0] = true;
602 expected_.gof.temporal_up_switch[1] = false;
603 expected_.gof.num_ref_pics[0] = 0;
604 expected_.gof.num_ref_pics[1] = 1;
605 expected_.gof.pid_diff[1][0] = 33;
606 ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
607 }
608
609 TEST_F(RtpDepacketizerVp9Test, ParseFirstPacketInKeyFrame) {
610 uint8_t packet[2] = {0};
611 packet[0] = 0x08; // I:0 P:0 L:0 F:0 B:1 E:0 V:0 R:0
612
613 RtpDepacketizer::ParsedPayload parsed;
614 ASSERT_TRUE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
615 EXPECT_EQ(kVideoFrameKey, parsed.frame_type);
616 EXPECT_TRUE(parsed.type.Video.isFirstPacket);
617 }
618
619 TEST_F(RtpDepacketizerVp9Test, ParseLastPacketInDeltaFrame) {
620 uint8_t packet[2] = {0};
621 packet[0] = 0x44; // I:0 P:1 L:0 F:0 B:0 E:1 V:0 R:0
622
623 RtpDepacketizer::ParsedPayload parsed;
624 ASSERT_TRUE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
625 EXPECT_EQ(kVideoFrameDelta, parsed.frame_type);
626 EXPECT_FALSE(parsed.type.Video.isFirstPacket);
627 }
628
629 TEST_F(RtpDepacketizerVp9Test, ParseResolution) {
630 const uint16_t kWidth[2] = {640, 1280};
631 const uint16_t kHeight[2] = {360, 720};
632 uint8_t packet[20] = {0};
633 packet[0] = 0x0A; // I:0 P:0 L:0 F:0 B:1 E:0 V:1 R:0
634 packet[1] = (1 << 5) | (1 << 4) | 0; // N_S:1 Y:1 N_G:0
635 packet[2] = kWidth[0] >> 8;
636 packet[3] = kWidth[0] & 0xFF;
637 packet[4] = kHeight[0] >> 8;
638 packet[5] = kHeight[0] & 0xFF;
639 packet[6] = kWidth[1] >> 8;
640 packet[7] = kWidth[1] & 0xFF;
641 packet[8] = kHeight[1] >> 8;
642 packet[9] = kHeight[1] & 0xFF;
643 packet[10] = 0; // T:0 U:0 R:0 -
644
645 RtpDepacketizer::ParsedPayload parsed;
646 ASSERT_TRUE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
647 EXPECT_EQ(kWidth[0], parsed.type.Video.width);
648 EXPECT_EQ(kHeight[0], parsed.type.Video.height);
649 }
650
651 TEST_F(RtpDepacketizerVp9Test, ParseFailsForNoPayloadLength) {
652 uint8_t packet[1] = {0};
653 RtpDepacketizer::ParsedPayload parsed;
654 EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, 0));
655 }
656
657 TEST_F(RtpDepacketizerVp9Test, ParseFailsForTooShortBufferToFitPayload) {
658 const uint8_t kHeaderLength = 1;
659 uint8_t packet[kHeaderLength] = {0};
660 RtpDepacketizer::ParsedPayload parsed;
661 EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
662 }
663
664 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc ('k') | webrtc/modules/video_coding/main/source/packet.cc » ('j') | no next file with comments »

Powered by Google App Engine