Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

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

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

Powered by Google App Engine
This is Rietveld 408576698