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

Side by Side Diff: webrtc/modules/video_coding/codecs/vp8/simulcast_unittest.h

Issue 2278883002: Move MutableDataY{,U,V} methods to I420Buffer only. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Delete unused variable. Created 4 years, 3 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
1 /* 1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 int stride) { 229 int stride) {
230 for (int i = 0; i < height; i++, data += stride) { 230 for (int i = 0; i < height; i++, data += stride) {
231 // Setting allocated area to zero - setting only image size to 231 // Setting allocated area to zero - setting only image size to
232 // requested values - will make it easier to distinguish between image 232 // requested values - will make it easier to distinguish between image
233 // size and frame size (accounting for stride). 233 // size and frame size (accounting for stride).
234 memset(data, value, width); 234 memset(data, value, width);
235 memset(data + width, 0, stride - width); 235 memset(data + width, 0, stride - width);
236 } 236 }
237 } 237 }
238 238
239 // Fills in an VideoFrameBuffer from |plane_colors|. 239 // Fills in an I420Buffer from |plane_colors|.
240 static void CreateImage(const rtc::scoped_refptr<VideoFrameBuffer>& buffer, 240 static void CreateImage(const rtc::scoped_refptr<I420Buffer>& buffer,
241 int plane_colors[kNumOfPlanes]) { 241 int plane_colors[kNumOfPlanes]) {
242 int width = buffer->width(); 242 int width = buffer->width();
243 int height = buffer->height(); 243 int height = buffer->height();
244 int chroma_width = (width + 1) / 2; 244 int chroma_width = (width + 1) / 2;
245 int chroma_height = (height + 1) / 2; 245 int chroma_height = (height + 1) / 2;
246 246
247 SetPlane(buffer->MutableDataY(), plane_colors[0], 247 SetPlane(buffer->MutableDataY(), plane_colors[0],
248 width, height, buffer->StrideY()); 248 width, height, buffer->StrideY());
249 249
250 SetPlane(buffer->MutableDataU(), plane_colors[1], 250 SetPlane(buffer->MutableDataU(), plane_colors[1],
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 protected: 310 protected:
311 virtual void SetUp() { SetUpCodec(kDefaultTemporalLayerProfile); } 311 virtual void SetUp() { SetUpCodec(kDefaultTemporalLayerProfile); }
312 312
313 virtual void SetUpCodec(const int* temporal_layer_profile) { 313 virtual void SetUpCodec(const int* temporal_layer_profile) {
314 encoder_->RegisterEncodeCompleteCallback(&encoder_callback_); 314 encoder_->RegisterEncodeCompleteCallback(&encoder_callback_);
315 decoder_->RegisterDecodeCompleteCallback(&decoder_callback_); 315 decoder_->RegisterDecodeCompleteCallback(&decoder_callback_);
316 DefaultSettings(&settings_, temporal_layer_profile); 316 DefaultSettings(&settings_, temporal_layer_profile);
317 EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200)); 317 EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200));
318 EXPECT_EQ(0, decoder_->InitDecode(&settings_, 1)); 318 EXPECT_EQ(0, decoder_->InitDecode(&settings_, 1));
319 int half_width = (kDefaultWidth + 1) / 2; 319 int half_width = (kDefaultWidth + 1) / 2;
320 input_frame_.CreateEmptyFrame(kDefaultWidth, kDefaultHeight, kDefaultWidth, 320 input_buffer_ = I420Buffer::Create(kDefaultWidth, kDefaultHeight,
321 half_width, half_width); 321 kDefaultWidth, half_width, half_width);
322 memset(input_frame_.video_frame_buffer()->MutableDataY(), 0, 322 input_buffer_->InitializeData();
323 input_frame_.allocated_size(kYPlane)); 323 input_frame_.reset(
324 memset(input_frame_.video_frame_buffer()->MutableDataU(), 0, 324 new VideoFrame(input_buffer_, 0, 0, webrtc::kVideoRotation_0));
325 input_frame_.allocated_size(kUPlane));
326 memset(input_frame_.video_frame_buffer()->MutableDataV(), 0,
327 input_frame_.allocated_size(kVPlane));
328 } 325 }
329 326
330 virtual void TearDown() { 327 virtual void TearDown() {
331 encoder_->Release(); 328 encoder_->Release();
332 decoder_->Release(); 329 decoder_->Release();
333 } 330 }
334 331
335 void ExpectStreams(FrameType frame_type, int expected_video_streams) { 332 void ExpectStreams(FrameType frame_type, int expected_video_streams) {
336 ASSERT_GE(expected_video_streams, 0); 333 ASSERT_GE(expected_video_streams, 0);
337 ASSERT_LE(expected_video_streams, kNumberOfSimulcastStreams); 334 ASSERT_LE(expected_video_streams, kNumberOfSimulcastStreams);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 } 386 }
390 } 387 }
391 388
392 // We currently expect all active streams to generate a key frame even though 389 // We currently expect all active streams to generate a key frame even though
393 // a key frame was only requested for some of them. 390 // a key frame was only requested for some of them.
394 void TestKeyFrameRequestsOnAllStreams() { 391 void TestKeyFrameRequestsOnAllStreams() {
395 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams. 392 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams.
396 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 393 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
397 kVideoFrameDelta); 394 kVideoFrameDelta);
398 ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams); 395 ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams);
399 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 396 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
400 397
401 ExpectStreams(kVideoFrameDelta, kNumberOfSimulcastStreams); 398 ExpectStreams(kVideoFrameDelta, kNumberOfSimulcastStreams);
402 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 399 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
403 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 400 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
404 401
405 frame_types[0] = kVideoFrameKey; 402 frame_types[0] = kVideoFrameKey;
406 ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams); 403 ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams);
407 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 404 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
408 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 405 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
409 406
410 std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta); 407 std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta);
411 frame_types[1] = kVideoFrameKey; 408 frame_types[1] = kVideoFrameKey;
412 ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams); 409 ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams);
413 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 410 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
414 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 411 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
415 412
416 std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta); 413 std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta);
417 frame_types[2] = kVideoFrameKey; 414 frame_types[2] = kVideoFrameKey;
418 ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams); 415 ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams);
419 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 416 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
420 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 417 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
421 418
422 std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta); 419 std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta);
423 ExpectStreams(kVideoFrameDelta, kNumberOfSimulcastStreams); 420 ExpectStreams(kVideoFrameDelta, kNumberOfSimulcastStreams);
424 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 421 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
425 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 422 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
426 } 423 }
427 424
428 void TestPaddingAllStreams() { 425 void TestPaddingAllStreams() {
429 // We should always encode the base layer. 426 // We should always encode the base layer.
430 encoder_->SetRates(kMinBitrates[0] - 1, 30); 427 encoder_->SetRates(kMinBitrates[0] - 1, 30);
431 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 428 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
432 kVideoFrameDelta); 429 kVideoFrameDelta);
433 ExpectStreams(kVideoFrameKey, 1); 430 ExpectStreams(kVideoFrameKey, 1);
434 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 431 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
435 432
436 ExpectStreams(kVideoFrameDelta, 1); 433 ExpectStreams(kVideoFrameDelta, 1);
437 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 434 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
438 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 435 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
439 } 436 }
440 437
441 void TestPaddingTwoStreams() { 438 void TestPaddingTwoStreams() {
442 // We have just enough to get only the first stream and padding for two. 439 // We have just enough to get only the first stream and padding for two.
443 encoder_->SetRates(kMinBitrates[0], 30); 440 encoder_->SetRates(kMinBitrates[0], 30);
444 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 441 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
445 kVideoFrameDelta); 442 kVideoFrameDelta);
446 ExpectStreams(kVideoFrameKey, 1); 443 ExpectStreams(kVideoFrameKey, 1);
447 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 444 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
448 445
449 ExpectStreams(kVideoFrameDelta, 1); 446 ExpectStreams(kVideoFrameDelta, 1);
450 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 447 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
451 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 448 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
452 } 449 }
453 450
454 void TestPaddingTwoStreamsOneMaxedOut() { 451 void TestPaddingTwoStreamsOneMaxedOut() {
455 // We are just below limit of sending second stream, so we should get 452 // We are just below limit of sending second stream, so we should get
456 // the first stream maxed out (at |maxBitrate|), and padding for two. 453 // the first stream maxed out (at |maxBitrate|), and padding for two.
457 encoder_->SetRates(kTargetBitrates[0] + kMinBitrates[1] - 1, 30); 454 encoder_->SetRates(kTargetBitrates[0] + kMinBitrates[1] - 1, 30);
458 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 455 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
459 kVideoFrameDelta); 456 kVideoFrameDelta);
460 ExpectStreams(kVideoFrameKey, 1); 457 ExpectStreams(kVideoFrameKey, 1);
461 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 458 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
462 459
463 ExpectStreams(kVideoFrameDelta, 1); 460 ExpectStreams(kVideoFrameDelta, 1);
464 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 461 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
465 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 462 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
466 } 463 }
467 464
468 void TestPaddingOneStream() { 465 void TestPaddingOneStream() {
469 // We have just enough to send two streams, so padding for one stream. 466 // We have just enough to send two streams, so padding for one stream.
470 encoder_->SetRates(kTargetBitrates[0] + kMinBitrates[1], 30); 467 encoder_->SetRates(kTargetBitrates[0] + kMinBitrates[1], 30);
471 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 468 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
472 kVideoFrameDelta); 469 kVideoFrameDelta);
473 ExpectStreams(kVideoFrameKey, 2); 470 ExpectStreams(kVideoFrameKey, 2);
474 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 471 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
475 472
476 ExpectStreams(kVideoFrameDelta, 2); 473 ExpectStreams(kVideoFrameDelta, 2);
477 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 474 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
478 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 475 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
479 } 476 }
480 477
481 void TestPaddingOneStreamTwoMaxedOut() { 478 void TestPaddingOneStreamTwoMaxedOut() {
482 // We are just below limit of sending third stream, so we should get 479 // We are just below limit of sending third stream, so we should get
483 // first stream's rate maxed out at |targetBitrate|, second at |maxBitrate|. 480 // first stream's rate maxed out at |targetBitrate|, second at |maxBitrate|.
484 encoder_->SetRates( 481 encoder_->SetRates(
485 kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] - 1, 30); 482 kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] - 1, 30);
486 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 483 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
487 kVideoFrameDelta); 484 kVideoFrameDelta);
488 ExpectStreams(kVideoFrameKey, 2); 485 ExpectStreams(kVideoFrameKey, 2);
489 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 486 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
490 487
491 ExpectStreams(kVideoFrameDelta, 2); 488 ExpectStreams(kVideoFrameDelta, 2);
492 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 489 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
493 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 490 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
494 } 491 }
495 492
496 void TestSendAllStreams() { 493 void TestSendAllStreams() {
497 // We have just enough to send all streams. 494 // We have just enough to send all streams.
498 encoder_->SetRates( 495 encoder_->SetRates(
499 kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2], 30); 496 kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2], 30);
500 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 497 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
501 kVideoFrameDelta); 498 kVideoFrameDelta);
502 ExpectStreams(kVideoFrameKey, 3); 499 ExpectStreams(kVideoFrameKey, 3);
503 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 500 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
504 501
505 ExpectStreams(kVideoFrameDelta, 3); 502 ExpectStreams(kVideoFrameDelta, 3);
506 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 503 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
507 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 504 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
508 } 505 }
509 506
510 void TestDisablingStreams() { 507 void TestDisablingStreams() {
511 // We should get three media streams. 508 // We should get three media streams.
512 encoder_->SetRates(kMaxBitrates[0] + kMaxBitrates[1] + kMaxBitrates[2], 30); 509 encoder_->SetRates(kMaxBitrates[0] + kMaxBitrates[1] + kMaxBitrates[2], 30);
513 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 510 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
514 kVideoFrameDelta); 511 kVideoFrameDelta);
515 ExpectStreams(kVideoFrameKey, 3); 512 ExpectStreams(kVideoFrameKey, 3);
516 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 513 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
517 514
518 ExpectStreams(kVideoFrameDelta, 3); 515 ExpectStreams(kVideoFrameDelta, 3);
519 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 516 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
520 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 517 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
521 518
522 // We should only get two streams and padding for one. 519 // We should only get two streams and padding for one.
523 encoder_->SetRates( 520 encoder_->SetRates(
524 kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] / 2, 30); 521 kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] / 2, 30);
525 ExpectStreams(kVideoFrameDelta, 2); 522 ExpectStreams(kVideoFrameDelta, 2);
526 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 523 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
527 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 524 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
528 525
529 // We should only get the first stream and padding for two. 526 // We should only get the first stream and padding for two.
530 encoder_->SetRates(kTargetBitrates[0] + kMinBitrates[1] / 2, 30); 527 encoder_->SetRates(kTargetBitrates[0] + kMinBitrates[1] / 2, 30);
531 ExpectStreams(kVideoFrameDelta, 1); 528 ExpectStreams(kVideoFrameDelta, 1);
532 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 529 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
533 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 530 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
534 531
535 // We don't have enough bitrate for the thumbnail stream, but we should get 532 // We don't have enough bitrate for the thumbnail stream, but we should get
536 // it anyway with current configuration. 533 // it anyway with current configuration.
537 encoder_->SetRates(kTargetBitrates[0] - 1, 30); 534 encoder_->SetRates(kTargetBitrates[0] - 1, 30);
538 ExpectStreams(kVideoFrameDelta, 1); 535 ExpectStreams(kVideoFrameDelta, 1);
539 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 536 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
540 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 537 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
541 538
542 // We should only get two streams and padding for one. 539 // We should only get two streams and padding for one.
543 encoder_->SetRates( 540 encoder_->SetRates(
544 kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] / 2, 30); 541 kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] / 2, 30);
545 // We get a key frame because a new stream is being enabled. 542 // We get a key frame because a new stream is being enabled.
546 ExpectStreams(kVideoFrameKey, 2); 543 ExpectStreams(kVideoFrameKey, 2);
547 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 544 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
548 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 545 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
549 546
550 // We should get all three streams. 547 // We should get all three streams.
551 encoder_->SetRates( 548 encoder_->SetRates(
552 kTargetBitrates[0] + kTargetBitrates[1] + kTargetBitrates[2], 30); 549 kTargetBitrates[0] + kTargetBitrates[1] + kTargetBitrates[2], 30);
553 // We get a key frame because a new stream is being enabled. 550 // We get a key frame because a new stream is being enabled.
554 ExpectStreams(kVideoFrameKey, 3); 551 ExpectStreams(kVideoFrameKey, 3);
555 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 552 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
556 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 553 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
557 } 554 }
558 555
559 void SwitchingToOneStream(int width, int height) { 556 void SwitchingToOneStream(int width, int height) {
560 // Disable all streams except the last and set the bitrate of the last to 557 // Disable all streams except the last and set the bitrate of the last to
561 // 100 kbps. This verifies the way GTP switches to screenshare mode. 558 // 100 kbps. This verifies the way GTP switches to screenshare mode.
562 settings_.codecSpecific.VP8.numberOfTemporalLayers = 1; 559 settings_.codecSpecific.VP8.numberOfTemporalLayers = 1;
563 settings_.maxBitrate = 100; 560 settings_.maxBitrate = 100;
564 settings_.startBitrate = 100; 561 settings_.startBitrate = 100;
565 settings_.width = width; 562 settings_.width = width;
566 settings_.height = height; 563 settings_.height = height;
567 for (int i = 0; i < settings_.numberOfSimulcastStreams - 1; ++i) { 564 for (int i = 0; i < settings_.numberOfSimulcastStreams - 1; ++i) {
568 settings_.simulcastStream[i].maxBitrate = 0; 565 settings_.simulcastStream[i].maxBitrate = 0;
569 settings_.simulcastStream[i].width = settings_.width; 566 settings_.simulcastStream[i].width = settings_.width;
570 settings_.simulcastStream[i].height = settings_.height; 567 settings_.simulcastStream[i].height = settings_.height;
571 } 568 }
572 // Setting input image to new resolution. 569 // Setting input image to new resolution.
573 int half_width = (settings_.width + 1) / 2; 570 int half_width = (settings_.width + 1) / 2;
574 input_frame_.CreateEmptyFrame(settings_.width, settings_.height, 571 input_buffer_ = I420Buffer::Create(settings_.width, settings_.height,
575 settings_.width, half_width, half_width); 572 settings_.width, half_width, half_width);
576 memset(input_frame_.video_frame_buffer()->MutableDataY(), 0, 573 input_buffer_->InitializeData();
577 input_frame_.allocated_size(kYPlane)); 574
578 memset(input_frame_.video_frame_buffer()->MutableDataU(), 0, 575 input_frame_.reset(
579 input_frame_.allocated_size(kUPlane)); 576 new VideoFrame(input_buffer_, 0, 0, webrtc::kVideoRotation_0));
580 memset(input_frame_.video_frame_buffer()->MutableDataV(), 0,
581 input_frame_.allocated_size(kVPlane));
582 577
583 // The for loop above did not set the bitrate of the highest layer. 578 // The for loop above did not set the bitrate of the highest layer.
584 settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1] 579 settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1]
585 .maxBitrate = 0; 580 .maxBitrate = 0;
586 // The highest layer has to correspond to the non-simulcast resolution. 581 // The highest layer has to correspond to the non-simulcast resolution.
587 settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1].width = 582 settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1].width =
588 settings_.width; 583 settings_.width;
589 settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1].height = 584 settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1].height =
590 settings_.height; 585 settings_.height;
591 EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200)); 586 EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200));
592 587
593 // Encode one frame and verify. 588 // Encode one frame and verify.
594 encoder_->SetRates(kMaxBitrates[0] + kMaxBitrates[1], 30); 589 encoder_->SetRates(kMaxBitrates[0] + kMaxBitrates[1], 30);
595 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams, 590 std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
596 kVideoFrameDelta); 591 kVideoFrameDelta);
597 EXPECT_CALL( 592 EXPECT_CALL(
598 encoder_callback_, 593 encoder_callback_,
599 OnEncodedImage(AllOf(Field(&EncodedImage::_frameType, kVideoFrameKey), 594 OnEncodedImage(AllOf(Field(&EncodedImage::_frameType, kVideoFrameKey),
600 Field(&EncodedImage::_encodedWidth, width), 595 Field(&EncodedImage::_encodedWidth, width),
601 Field(&EncodedImage::_encodedHeight, height)), 596 Field(&EncodedImage::_encodedHeight, height)),
602 _, _)) 597 _, _))
603 .Times(1) 598 .Times(1)
604 .WillRepeatedly(Return( 599 .WillRepeatedly(Return(
605 EncodedImageCallback::Result(EncodedImageCallback::Result::OK, 0))); 600 EncodedImageCallback::Result(EncodedImageCallback::Result::OK, 0)));
606 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types)); 601 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
607 602
608 // Switch back. 603 // Switch back.
609 DefaultSettings(&settings_, kDefaultTemporalLayerProfile); 604 DefaultSettings(&settings_, kDefaultTemporalLayerProfile);
610 // Start at the lowest bitrate for enabling base stream. 605 // Start at the lowest bitrate for enabling base stream.
611 settings_.startBitrate = kMinBitrates[0]; 606 settings_.startBitrate = kMinBitrates[0];
612 EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200)); 607 EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200));
613 encoder_->SetRates(settings_.startBitrate, 30); 608 encoder_->SetRates(settings_.startBitrate, 30);
614 ExpectStreams(kVideoFrameKey, 1); 609 ExpectStreams(kVideoFrameKey, 1);
615 // Resize |input_frame_| to the new resolution. 610 // Resize |input_frame_| to the new resolution.
616 half_width = (settings_.width + 1) / 2; 611 half_width = (settings_.width + 1) / 2;
617 input_frame_.CreateEmptyFrame(settings_.width, settings_.height, 612 input_buffer_ = I420Buffer::Create(settings_.width, settings_.height,
618 settings_.width, half_width, half_width); 613 settings_.width, half_width, half_width);
619 memset(input_frame_.video_frame_buffer()->MutableDataY(), 0, 614 input_buffer_->InitializeData();
620 input_frame_.allocated_size(kYPlane)); 615 input_frame_.reset(
621 memset(input_frame_.video_frame_buffer()->MutableDataU(), 0, 616 new VideoFrame(input_buffer_, 0, 0, webrtc::kVideoRotation_0));
622 input_frame_.allocated_size(kUPlane)); 617 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
623 memset(input_frame_.video_frame_buffer()->MutableDataV(), 0,
624 input_frame_.allocated_size(kVPlane));
625 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, &frame_types));
626 } 618 }
627 619
628 void TestSwitchingToOneStream() { SwitchingToOneStream(1024, 768); } 620 void TestSwitchingToOneStream() { SwitchingToOneStream(1024, 768); }
629 621
630 void TestSwitchingToOneOddStream() { SwitchingToOneStream(1023, 769); } 622 void TestSwitchingToOneOddStream() { SwitchingToOneStream(1023, 769); }
631 623
632 void TestSwitchingToOneSmallStream() { SwitchingToOneStream(4, 4); } 624 void TestSwitchingToOneSmallStream() { SwitchingToOneStream(4, 4); }
633 625
634 void TestRPSIEncoder() { 626 void TestRPSIEncoder() {
635 Vp8TestEncodedImageCallback encoder_callback; 627 Vp8TestEncodedImageCallback encoder_callback;
636 encoder_->RegisterEncodeCompleteCallback(&encoder_callback); 628 encoder_->RegisterEncodeCompleteCallback(&encoder_callback);
637 629
638 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams. 630 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams.
639 631
640 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 632 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
641 int picture_id = -1; 633 int picture_id = -1;
642 int temporal_layer = -1; 634 int temporal_layer = -1;
643 bool layer_sync = false; 635 bool layer_sync = false;
644 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer, 636 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer,
645 &layer_sync, 0); 637 &layer_sync, 0);
646 EXPECT_EQ(0, temporal_layer); 638 EXPECT_EQ(0, temporal_layer);
647 EXPECT_TRUE(layer_sync); 639 EXPECT_TRUE(layer_sync);
648 int key_frame_picture_id = picture_id; 640 int key_frame_picture_id = picture_id;
649 641
650 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 642 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
651 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 643 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
652 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer, 644 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer,
653 &layer_sync, 0); 645 &layer_sync, 0);
654 EXPECT_EQ(2, temporal_layer); 646 EXPECT_EQ(2, temporal_layer);
655 EXPECT_TRUE(layer_sync); 647 EXPECT_TRUE(layer_sync);
656 648
657 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 649 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
658 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 650 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
659 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer, 651 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer,
660 &layer_sync, 0); 652 &layer_sync, 0);
661 EXPECT_EQ(1, temporal_layer); 653 EXPECT_EQ(1, temporal_layer);
662 EXPECT_TRUE(layer_sync); 654 EXPECT_TRUE(layer_sync);
663 655
664 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 656 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
665 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 657 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
666 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer, 658 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer,
667 &layer_sync, 0); 659 &layer_sync, 0);
668 EXPECT_EQ(2, temporal_layer); 660 EXPECT_EQ(2, temporal_layer);
669 EXPECT_FALSE(layer_sync); 661 EXPECT_FALSE(layer_sync);
670 662
671 CodecSpecificInfo codec_specific; 663 CodecSpecificInfo codec_specific;
672 codec_specific.codecType = kVideoCodecVP8; 664 codec_specific.codecType = kVideoCodecVP8;
673 codec_specific.codecSpecific.VP8.hasReceivedRPSI = true; 665 codec_specific.codecSpecific.VP8.hasReceivedRPSI = true;
674 666
675 // Must match last key frame to trigger. 667 // Must match last key frame to trigger.
676 codec_specific.codecSpecific.VP8.pictureIdRPSI = key_frame_picture_id; 668 codec_specific.codecSpecific.VP8.pictureIdRPSI = key_frame_picture_id;
677 669
678 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 670 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
679 EXPECT_EQ(0, encoder_->Encode(input_frame_, &codec_specific, NULL)); 671 EXPECT_EQ(0, encoder_->Encode(*input_frame_, &codec_specific, NULL));
680 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer, 672 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer,
681 &layer_sync, 0); 673 &layer_sync, 0);
682 674
683 EXPECT_EQ(0, temporal_layer); 675 EXPECT_EQ(0, temporal_layer);
684 EXPECT_TRUE(layer_sync); 676 EXPECT_TRUE(layer_sync);
685 677
686 // Must match last key frame to trigger, test bad id. 678 // Must match last key frame to trigger, test bad id.
687 codec_specific.codecSpecific.VP8.pictureIdRPSI = key_frame_picture_id + 17; 679 codec_specific.codecSpecific.VP8.pictureIdRPSI = key_frame_picture_id + 17;
688 680
689 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 681 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
690 EXPECT_EQ(0, encoder_->Encode(input_frame_, &codec_specific, NULL)); 682 EXPECT_EQ(0, encoder_->Encode(*input_frame_, &codec_specific, NULL));
691 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer, 683 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer,
692 &layer_sync, 0); 684 &layer_sync, 0);
693 685
694 EXPECT_EQ(2, temporal_layer); 686 EXPECT_EQ(2, temporal_layer);
695 // The previous frame was a base layer sync (since it was a frame that 687 // The previous frame was a base layer sync (since it was a frame that
696 // only predicts from key frame and hence resets the temporal pattern), 688 // only predicts from key frame and hence resets the temporal pattern),
697 // so this frame (the next one) must have |layer_sync| set to true. 689 // so this frame (the next one) must have |layer_sync| set to true.
698 EXPECT_TRUE(layer_sync); 690 EXPECT_TRUE(layer_sync);
699 } 691 }
700 692
701 void TestRPSIEncodeDecode() { 693 void TestRPSIEncodeDecode() {
702 Vp8TestEncodedImageCallback encoder_callback; 694 Vp8TestEncodedImageCallback encoder_callback;
703 Vp8TestDecodedImageCallback decoder_callback; 695 Vp8TestDecodedImageCallback decoder_callback;
704 encoder_->RegisterEncodeCompleteCallback(&encoder_callback); 696 encoder_->RegisterEncodeCompleteCallback(&encoder_callback);
705 decoder_->RegisterDecodeCompleteCallback(&decoder_callback); 697 decoder_->RegisterDecodeCompleteCallback(&decoder_callback);
706 698
707 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams. 699 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams.
708 700
709 // Set color. 701 // Set color.
710 int plane_offset[kNumOfPlanes]; 702 int plane_offset[kNumOfPlanes];
711 plane_offset[kYPlane] = kColorY; 703 plane_offset[kYPlane] = kColorY;
712 plane_offset[kUPlane] = kColorU; 704 plane_offset[kUPlane] = kColorU;
713 plane_offset[kVPlane] = kColorV; 705 plane_offset[kVPlane] = kColorV;
714 CreateImage(input_frame_.video_frame_buffer(), plane_offset); 706 CreateImage(input_buffer_, plane_offset);
715 707
716 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 708 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
717 int picture_id = -1; 709 int picture_id = -1;
718 int temporal_layer = -1; 710 int temporal_layer = -1;
719 bool layer_sync = false; 711 bool layer_sync = false;
720 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer, 712 encoder_callback.GetLastEncodedFrameInfo(&picture_id, &temporal_layer,
721 &layer_sync, 0); 713 &layer_sync, 0);
722 EXPECT_EQ(0, temporal_layer); 714 EXPECT_EQ(0, temporal_layer);
723 EXPECT_TRUE(layer_sync); 715 EXPECT_TRUE(layer_sync);
724 int key_frame_picture_id = picture_id; 716 int key_frame_picture_id = picture_id;
725 717
726 // Change color. 718 // Change color.
727 plane_offset[kYPlane] += 1; 719 plane_offset[kYPlane] += 1;
728 plane_offset[kUPlane] += 1; 720 plane_offset[kUPlane] += 1;
729 plane_offset[kVPlane] += 1; 721 plane_offset[kVPlane] += 1;
730 CreateImage(input_frame_.video_frame_buffer(), plane_offset); 722 CreateImage(input_buffer_, plane_offset);
731 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 723 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
732 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 724 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
733 725
734 // Change color. 726 // Change color.
735 plane_offset[kYPlane] += 1; 727 plane_offset[kYPlane] += 1;
736 plane_offset[kUPlane] += 1; 728 plane_offset[kUPlane] += 1;
737 plane_offset[kVPlane] += 1; 729 plane_offset[kVPlane] += 1;
738 CreateImage(input_frame_.video_frame_buffer(), plane_offset); 730 CreateImage(input_buffer_, plane_offset);
739 731
740 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 732 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
741 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 733 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
742 734
743 // Change color. 735 // Change color.
744 plane_offset[kYPlane] += 1; 736 plane_offset[kYPlane] += 1;
745 plane_offset[kUPlane] += 1; 737 plane_offset[kUPlane] += 1;
746 plane_offset[kVPlane] += 1; 738 plane_offset[kVPlane] += 1;
747 CreateImage(input_frame_.video_frame_buffer(), plane_offset); 739 CreateImage(input_buffer_, plane_offset);
748 740
749 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 741 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
750 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 742 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
751 743
752 CodecSpecificInfo codec_specific; 744 CodecSpecificInfo codec_specific;
753 codec_specific.codecType = kVideoCodecVP8; 745 codec_specific.codecType = kVideoCodecVP8;
754 codec_specific.codecSpecific.VP8.hasReceivedRPSI = true; 746 codec_specific.codecSpecific.VP8.hasReceivedRPSI = true;
755 // Must match last key frame to trigger. 747 // Must match last key frame to trigger.
756 codec_specific.codecSpecific.VP8.pictureIdRPSI = key_frame_picture_id; 748 codec_specific.codecSpecific.VP8.pictureIdRPSI = key_frame_picture_id;
757 749
758 // Change color back to original. 750 // Change color back to original.
759 plane_offset[kYPlane] = kColorY; 751 plane_offset[kYPlane] = kColorY;
760 plane_offset[kUPlane] = kColorU; 752 plane_offset[kUPlane] = kColorU;
761 plane_offset[kVPlane] = kColorV; 753 plane_offset[kVPlane] = kColorV;
762 CreateImage(input_frame_.video_frame_buffer(), plane_offset); 754 CreateImage(input_buffer_, plane_offset);
763 755
764 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 756 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
765 EXPECT_EQ(0, encoder_->Encode(input_frame_, &codec_specific, NULL)); 757 EXPECT_EQ(0, encoder_->Encode(*input_frame_, &codec_specific, NULL));
766 758
767 EncodedImage encoded_frame; 759 EncodedImage encoded_frame;
768 encoder_callback.GetLastEncodedKeyFrame(&encoded_frame); 760 encoder_callback.GetLastEncodedKeyFrame(&encoded_frame);
769 decoder_->Decode(encoded_frame, false, NULL); 761 decoder_->Decode(encoded_frame, false, NULL);
770 encoder_callback.GetLastEncodedFrame(&encoded_frame); 762 encoder_callback.GetLastEncodedFrame(&encoded_frame);
771 decoder_->Decode(encoded_frame, false, NULL); 763 decoder_->Decode(encoded_frame, false, NULL);
772 EXPECT_EQ(2, decoder_callback.DecodedFrames()); 764 EXPECT_EQ(2, decoder_callback.DecodedFrames());
773 } 765 }
774 766
775 // Test the layer pattern and sync flag for various spatial-temporal patterns. 767 // Test the layer pattern and sync flag for various spatial-temporal patterns.
776 // 3-3-3 pattern: 3 temporal layers for all spatial streams, so same 768 // 3-3-3 pattern: 3 temporal layers for all spatial streams, so same
777 // temporal_layer id and layer_sync is expected for all streams. 769 // temporal_layer id and layer_sync is expected for all streams.
778 void TestSaptioTemporalLayers333PatternEncoder() { 770 void TestSaptioTemporalLayers333PatternEncoder() {
779 Vp8TestEncodedImageCallback encoder_callback; 771 Vp8TestEncodedImageCallback encoder_callback;
780 encoder_->RegisterEncodeCompleteCallback(&encoder_callback); 772 encoder_->RegisterEncodeCompleteCallback(&encoder_callback);
781 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams. 773 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams.
782 774
783 int expected_temporal_idx[3] = {-1, -1, -1}; 775 int expected_temporal_idx[3] = {-1, -1, -1};
784 bool expected_layer_sync[3] = {false, false, false}; 776 bool expected_layer_sync[3] = {false, false, false};
785 777
786 // First frame: #0. 778 // First frame: #0.
787 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 779 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
788 SetExpectedValues3<int>(0, 0, 0, expected_temporal_idx); 780 SetExpectedValues3<int>(0, 0, 0, expected_temporal_idx);
789 SetExpectedValues3<bool>(true, true, true, expected_layer_sync); 781 SetExpectedValues3<bool>(true, true, true, expected_layer_sync);
790 VerifyTemporalIdxAndSyncForAllSpatialLayers( 782 VerifyTemporalIdxAndSyncForAllSpatialLayers(
791 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 783 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
792 784
793 // Next frame: #1. 785 // Next frame: #1.
794 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 786 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
795 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 787 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
796 SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx); 788 SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx);
797 SetExpectedValues3<bool>(true, true, true, expected_layer_sync); 789 SetExpectedValues3<bool>(true, true, true, expected_layer_sync);
798 VerifyTemporalIdxAndSyncForAllSpatialLayers( 790 VerifyTemporalIdxAndSyncForAllSpatialLayers(
799 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 791 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
800 792
801 // Next frame: #2. 793 // Next frame: #2.
802 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 794 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
803 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 795 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
804 SetExpectedValues3<int>(1, 1, 1, expected_temporal_idx); 796 SetExpectedValues3<int>(1, 1, 1, expected_temporal_idx);
805 SetExpectedValues3<bool>(true, true, true, expected_layer_sync); 797 SetExpectedValues3<bool>(true, true, true, expected_layer_sync);
806 VerifyTemporalIdxAndSyncForAllSpatialLayers( 798 VerifyTemporalIdxAndSyncForAllSpatialLayers(
807 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 799 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
808 800
809 // Next frame: #3. 801 // Next frame: #3.
810 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 802 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
811 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 803 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
812 SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx); 804 SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx);
813 SetExpectedValues3<bool>(false, false, false, expected_layer_sync); 805 SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
814 VerifyTemporalIdxAndSyncForAllSpatialLayers( 806 VerifyTemporalIdxAndSyncForAllSpatialLayers(
815 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 807 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
816 808
817 // Next frame: #4. 809 // Next frame: #4.
818 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 810 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
819 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 811 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
820 SetExpectedValues3<int>(0, 0, 0, expected_temporal_idx); 812 SetExpectedValues3<int>(0, 0, 0, expected_temporal_idx);
821 SetExpectedValues3<bool>(false, false, false, expected_layer_sync); 813 SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
822 VerifyTemporalIdxAndSyncForAllSpatialLayers( 814 VerifyTemporalIdxAndSyncForAllSpatialLayers(
823 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 815 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
824 816
825 // Next frame: #5. 817 // Next frame: #5.
826 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 818 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
827 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 819 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
828 SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx); 820 SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx);
829 SetExpectedValues3<bool>(false, false, false, expected_layer_sync); 821 SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
830 VerifyTemporalIdxAndSyncForAllSpatialLayers( 822 VerifyTemporalIdxAndSyncForAllSpatialLayers(
831 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 823 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
832 } 824 }
833 825
834 // Test the layer pattern and sync flag for various spatial-temporal patterns. 826 // Test the layer pattern and sync flag for various spatial-temporal patterns.
835 // 3-2-1 pattern: 3 temporal layers for lowest resolution, 2 for middle, and 827 // 3-2-1 pattern: 3 temporal layers for lowest resolution, 2 for middle, and
836 // 1 temporal layer for highest resolution. 828 // 1 temporal layer for highest resolution.
837 // For this profile, we expect the temporal index pattern to be: 829 // For this profile, we expect the temporal index pattern to be:
838 // 1st stream: 0, 2, 1, 2, .... 830 // 1st stream: 0, 2, 1, 2, ....
839 // 2nd stream: 0, 1, 0, 1, ... 831 // 2nd stream: 0, 1, 0, 1, ...
840 // 3rd stream: -1, -1, -1, -1, .... 832 // 3rd stream: -1, -1, -1, -1, ....
841 // Regarding the 3rd stream, note that a stream/encoder with 1 temporal layer 833 // Regarding the 3rd stream, note that a stream/encoder with 1 temporal layer
842 // should always have temporal layer idx set to kNoTemporalIdx = -1. 834 // should always have temporal layer idx set to kNoTemporalIdx = -1.
843 // Since CodecSpecificInfoVP8.temporalIdx is uint8_t, this will wrap to 255. 835 // Since CodecSpecificInfoVP8.temporalIdx is uint8_t, this will wrap to 255.
844 // TODO(marpan): Although this seems safe for now, we should fix this. 836 // TODO(marpan): Although this seems safe for now, we should fix this.
845 void TestSpatioTemporalLayers321PatternEncoder() { 837 void TestSpatioTemporalLayers321PatternEncoder() {
846 int temporal_layer_profile[3] = {3, 2, 1}; 838 int temporal_layer_profile[3] = {3, 2, 1};
847 SetUpCodec(temporal_layer_profile); 839 SetUpCodec(temporal_layer_profile);
848 Vp8TestEncodedImageCallback encoder_callback; 840 Vp8TestEncodedImageCallback encoder_callback;
849 encoder_->RegisterEncodeCompleteCallback(&encoder_callback); 841 encoder_->RegisterEncodeCompleteCallback(&encoder_callback);
850 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams. 842 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams.
851 843
852 int expected_temporal_idx[3] = {-1, -1, -1}; 844 int expected_temporal_idx[3] = {-1, -1, -1};
853 bool expected_layer_sync[3] = {false, false, false}; 845 bool expected_layer_sync[3] = {false, false, false};
854 846
855 // First frame: #0. 847 // First frame: #0.
856 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 848 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
857 SetExpectedValues3<int>(0, 0, 255, expected_temporal_idx); 849 SetExpectedValues3<int>(0, 0, 255, expected_temporal_idx);
858 SetExpectedValues3<bool>(true, true, false, expected_layer_sync); 850 SetExpectedValues3<bool>(true, true, false, expected_layer_sync);
859 VerifyTemporalIdxAndSyncForAllSpatialLayers( 851 VerifyTemporalIdxAndSyncForAllSpatialLayers(
860 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 852 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
861 853
862 // Next frame: #1. 854 // Next frame: #1.
863 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 855 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
864 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 856 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
865 SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx); 857 SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx);
866 SetExpectedValues3<bool>(true, true, false, expected_layer_sync); 858 SetExpectedValues3<bool>(true, true, false, expected_layer_sync);
867 VerifyTemporalIdxAndSyncForAllSpatialLayers( 859 VerifyTemporalIdxAndSyncForAllSpatialLayers(
868 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 860 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
869 861
870 // Next frame: #2. 862 // Next frame: #2.
871 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 863 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
872 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 864 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
873 SetExpectedValues3<int>(1, 0, 255, expected_temporal_idx); 865 SetExpectedValues3<int>(1, 0, 255, expected_temporal_idx);
874 SetExpectedValues3<bool>(true, false, false, expected_layer_sync); 866 SetExpectedValues3<bool>(true, false, false, expected_layer_sync);
875 VerifyTemporalIdxAndSyncForAllSpatialLayers( 867 VerifyTemporalIdxAndSyncForAllSpatialLayers(
876 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 868 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
877 869
878 // Next frame: #3. 870 // Next frame: #3.
879 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 871 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
880 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 872 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
881 SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx); 873 SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx);
882 SetExpectedValues3<bool>(false, false, false, expected_layer_sync); 874 SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
883 VerifyTemporalIdxAndSyncForAllSpatialLayers( 875 VerifyTemporalIdxAndSyncForAllSpatialLayers(
884 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 876 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
885 877
886 // Next frame: #4. 878 // Next frame: #4.
887 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 879 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
888 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 880 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
889 SetExpectedValues3<int>(0, 0, 255, expected_temporal_idx); 881 SetExpectedValues3<int>(0, 0, 255, expected_temporal_idx);
890 SetExpectedValues3<bool>(false, false, false, expected_layer_sync); 882 SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
891 VerifyTemporalIdxAndSyncForAllSpatialLayers( 883 VerifyTemporalIdxAndSyncForAllSpatialLayers(
892 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 884 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
893 885
894 // Next frame: #5. 886 // Next frame: #5.
895 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 887 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
896 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 888 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
897 SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx); 889 SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx);
898 SetExpectedValues3<bool>(false, false, false, expected_layer_sync); 890 SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
899 VerifyTemporalIdxAndSyncForAllSpatialLayers( 891 VerifyTemporalIdxAndSyncForAllSpatialLayers(
900 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3); 892 &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
901 } 893 }
902 894
903 void TestStrideEncodeDecode() { 895 void TestStrideEncodeDecode() {
904 Vp8TestEncodedImageCallback encoder_callback; 896 Vp8TestEncodedImageCallback encoder_callback;
905 Vp8TestDecodedImageCallback decoder_callback; 897 Vp8TestDecodedImageCallback decoder_callback;
906 encoder_->RegisterEncodeCompleteCallback(&encoder_callback); 898 encoder_->RegisterEncodeCompleteCallback(&encoder_callback);
907 decoder_->RegisterDecodeCompleteCallback(&decoder_callback); 899 decoder_->RegisterDecodeCompleteCallback(&decoder_callback);
908 900
909 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams. 901 encoder_->SetRates(kMaxBitrates[2], 30); // To get all three streams.
910 // Setting two (possibly) problematic use cases for stride: 902 // Setting two (possibly) problematic use cases for stride:
911 // 1. stride > width 2. stride_y != stride_uv/2 903 // 1. stride > width 2. stride_y != stride_uv/2
912 int stride_y = kDefaultWidth + 20; 904 int stride_y = kDefaultWidth + 20;
913 int stride_uv = ((kDefaultWidth + 1) / 2) + 5; 905 int stride_uv = ((kDefaultWidth + 1) / 2) + 5;
914 input_frame_.CreateEmptyFrame(kDefaultWidth, kDefaultHeight, stride_y, 906 input_buffer_ = I420Buffer::Create(kDefaultWidth, kDefaultHeight, stride_y,
915 stride_uv, stride_uv); 907 stride_uv, stride_uv);
908 input_frame_.reset(
909 new VideoFrame(input_buffer_, 0, 0, webrtc::kVideoRotation_0));
910
916 // Set color. 911 // Set color.
917 int plane_offset[kNumOfPlanes]; 912 int plane_offset[kNumOfPlanes];
918 plane_offset[kYPlane] = kColorY; 913 plane_offset[kYPlane] = kColorY;
919 plane_offset[kUPlane] = kColorU; 914 plane_offset[kUPlane] = kColorU;
920 plane_offset[kVPlane] = kColorV; 915 plane_offset[kVPlane] = kColorV;
921 CreateImage(input_frame_.video_frame_buffer(), plane_offset); 916 CreateImage(input_buffer_, plane_offset);
922 917
923 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 918 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
924 919
925 // Change color. 920 // Change color.
926 plane_offset[kYPlane] += 1; 921 plane_offset[kYPlane] += 1;
927 plane_offset[kUPlane] += 1; 922 plane_offset[kUPlane] += 1;
928 plane_offset[kVPlane] += 1; 923 plane_offset[kVPlane] += 1;
929 CreateImage(input_frame_.video_frame_buffer(), plane_offset); 924 CreateImage(input_buffer_, plane_offset);
930 input_frame_.set_timestamp(input_frame_.timestamp() + 3000); 925 input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
931 EXPECT_EQ(0, encoder_->Encode(input_frame_, NULL, NULL)); 926 EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
932 927
933 EncodedImage encoded_frame; 928 EncodedImage encoded_frame;
934 // Only encoding one frame - so will be a key frame. 929 // Only encoding one frame - so will be a key frame.
935 encoder_callback.GetLastEncodedKeyFrame(&encoded_frame); 930 encoder_callback.GetLastEncodedKeyFrame(&encoded_frame);
936 EXPECT_EQ(0, decoder_->Decode(encoded_frame, false, NULL)); 931 EXPECT_EQ(0, decoder_->Decode(encoded_frame, false, NULL));
937 encoder_callback.GetLastEncodedFrame(&encoded_frame); 932 encoder_callback.GetLastEncodedFrame(&encoded_frame);
938 decoder_->Decode(encoded_frame, false, NULL); 933 decoder_->Decode(encoded_frame, false, NULL);
939 EXPECT_EQ(2, decoder_callback.DecodedFrames()); 934 EXPECT_EQ(2, decoder_callback.DecodedFrames());
940 } 935 }
941 936
(...skipping 19 matching lines...) Expand all
961 } 956 }
962 ++stream; 957 ++stream;
963 } 958 }
964 } 959 }
965 960
966 std::unique_ptr<VP8Encoder> encoder_; 961 std::unique_ptr<VP8Encoder> encoder_;
967 MockEncodedImageCallback encoder_callback_; 962 MockEncodedImageCallback encoder_callback_;
968 std::unique_ptr<VP8Decoder> decoder_; 963 std::unique_ptr<VP8Decoder> decoder_;
969 MockDecodedImageCallback decoder_callback_; 964 MockDecodedImageCallback decoder_callback_;
970 VideoCodec settings_; 965 VideoCodec settings_;
971 VideoFrame input_frame_; 966 rtc::scoped_refptr<I420Buffer> input_buffer_;
967 std::unique_ptr<VideoFrame> input_frame_;
972 }; 968 };
973 969
974 } // namespace testing 970 } // namespace testing
975 } // namespace webrtc 971 } // namespace webrtc
976 972
977 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_UNITTEST_H_ 973 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_UNITTEST_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698