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

Side by Side Diff: talk/media/webrtc/webrtcvideoengine2_unittest.cc

Issue 1600973002: Initialize VideoEncoder objects asynchronously. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 11 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 * libjingle 2 * libjingle
3 * Copyright 2004 Google Inc. 3 * Copyright 2004 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 365 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
366 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8"); 366 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
367 cricket::VideoSendParameters parameters; 367 cricket::VideoSendParameters parameters;
368 parameters.codecs.push_back(kVp8Codec); 368 parameters.codecs.push_back(kVp8Codec);
369 369
370 rtc::scoped_ptr<VideoMediaChannel> channel( 370 rtc::scoped_ptr<VideoMediaChannel> channel(
371 SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs)); 371 SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
372 372
373 EXPECT_TRUE( 373 EXPECT_TRUE(
374 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 374 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
375 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoder());
375 ASSERT_EQ(1u, encoder_factory.encoders().size()); 376 ASSERT_EQ(1u, encoder_factory.encoders().size());
376 EXPECT_TRUE(channel->SetSend(true)); 377 EXPECT_TRUE(channel->SetSend(true));
377 378
378 cricket::FakeVideoCapturer capturer; 379 cricket::FakeVideoCapturer capturer;
379 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer)); 380 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
380 EXPECT_EQ(cricket::CS_RUNNING, 381 EXPECT_EQ(cricket::CS_RUNNING,
381 capturer.Start(capturer.GetSupportedFormats()->front())); 382 capturer.Start(capturer.GetSupportedFormats()->front()));
382 EXPECT_TRUE(capturer.CaptureFrame()); 383 EXPECT_TRUE(capturer.CaptureFrame());
384
385 // Sending one frame will have reallocated the encoder since input size
386 // changes from a small default to the actual frame width/height. Wait for
387 // that to happen then for the frame to be sent.
388 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoder());
stefan-webrtc 2016/01/19 12:02:09 Any chance that the encoder has already been recre
pbos-webrtc 2016/01/19 15:27:58 No, Set() remains set until Wait() catches it.
stefan-webrtc 2016/01/20 12:22:47 Thanks!
383 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0, 389 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
384 kTimeout); 390 kTimeout);
385 391
386 // Sending one frame will have reallocated the encoder since input size
387 // changes from a small default to the actual frame width/height.
388 int num_created_encoders = encoder_factory.GetNumCreatedEncoders(); 392 int num_created_encoders = encoder_factory.GetNumCreatedEncoders();
389 EXPECT_EQ(num_created_encoders, 2); 393 EXPECT_EQ(num_created_encoders, 2);
390 394
391 // Setting codecs of the same type should not reallocate any encoders 395 // Setting codecs of the same type should not reallocate any encoders
392 // (expecting a no-op). 396 // (expecting a no-op).
393 EXPECT_TRUE(channel->SetSendParameters(parameters)); 397 EXPECT_TRUE(channel->SetSendParameters(parameters));
394 EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders()); 398 EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders());
395 399
396 // Remove stream previously added to free the external encoder instance. 400 // Remove stream previously added to free the external encoder instance.
397 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); 401 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 EXPECT_TRUE( 575 EXPECT_TRUE(
572 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); 576 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
573 EXPECT_TRUE(channel->SetSend(true)); 577 EXPECT_TRUE(channel->SetSend(true));
574 578
575 cricket::FakeVideoCapturer capturer; 579 cricket::FakeVideoCapturer capturer;
576 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer)); 580 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer));
577 EXPECT_EQ(cricket::CS_RUNNING, 581 EXPECT_EQ(cricket::CS_RUNNING,
578 capturer.Start(capturer.GetSupportedFormats()->front())); 582 capturer.Start(capturer.GetSupportedFormats()->front()));
579 EXPECT_TRUE(capturer.CaptureFrame()); 583 EXPECT_TRUE(capturer.CaptureFrame());
580 584
581 EXPECT_GT(encoder_factory.encoders().size(), 1u); 585 while (encoder_factory.encoders().size() <= 1)
586 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoder());
582 587
583 // Verify that encoders are configured for simulcast through adapter 588 // Verify that encoders are configured for simulcast through adapter
584 // (increasing resolution and only configured to send one stream each). 589 // (increasing resolution and only configured to send one stream each).
585 int prev_width = -1; 590 int prev_width = -1;
586 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) { 591 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) {
592 ASSERT_TRUE(encoder_factory.encoders()[i]->WaitForInitEncode());
587 webrtc::VideoCodec codec_settings = 593 webrtc::VideoCodec codec_settings =
588 encoder_factory.encoders()[i]->GetCodecSettings(); 594 encoder_factory.encoders()[i]->GetCodecSettings();
589 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams); 595 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
590 EXPECT_GT(codec_settings.width, prev_width); 596 EXPECT_GT(codec_settings.width, prev_width);
591 prev_width = codec_settings.width; 597 prev_width = codec_settings.width;
592 } 598 }
593 599
594 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), NULL)); 600 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), NULL));
595 601
596 channel.reset(); 602 channel.reset();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 658
653 // Send a fake frame, or else the media engine will configure the simulcast 659 // Send a fake frame, or else the media engine will configure the simulcast
654 // encoder adapter at a low-enough size that it'll only create a single 660 // encoder adapter at a low-enough size that it'll only create a single
655 // encoder layer. 661 // encoder layer.
656 cricket::FakeVideoCapturer capturer; 662 cricket::FakeVideoCapturer capturer;
657 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer)); 663 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer));
658 EXPECT_EQ(cricket::CS_RUNNING, 664 EXPECT_EQ(cricket::CS_RUNNING,
659 capturer.Start(capturer.GetSupportedFormats()->front())); 665 capturer.Start(capturer.GetSupportedFormats()->front()));
660 EXPECT_TRUE(capturer.CaptureFrame()); 666 EXPECT_TRUE(capturer.CaptureFrame());
661 667
662 ASSERT_GT(encoder_factory.encoders().size(), 1u); 668 while (encoder_factory.encoders().size() <= 1)
669 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoder());
670
671 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode());
663 EXPECT_EQ(webrtc::kVideoCodecVP8, 672 EXPECT_EQ(webrtc::kVideoCodecVP8,
664 encoder_factory.encoders()[0]->GetCodecSettings().codecType); 673 encoder_factory.encoders()[0]->GetCodecSettings().codecType);
665 674
666 channel.reset(); 675 channel.reset();
667 // Make sure DestroyVideoEncoder was called on the factory. 676 // Make sure DestroyVideoEncoder was called on the factory.
668 EXPECT_EQ(0u, encoder_factory.encoders().size()); 677 EXPECT_EQ(0u, encoder_factory.encoders().size());
669 } 678 }
670 679
671 TEST_F(WebRtcVideoEngine2Test, 680 TEST_F(WebRtcVideoEngine2Test,
672 DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) { 681 DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) {
673 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 682 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
674 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8"); 683 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
675 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264"); 684 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
676 685
677 std::vector<cricket::VideoCodec> codecs; 686 std::vector<cricket::VideoCodec> codecs;
678 codecs.push_back(kH264Codec); 687 codecs.push_back(kH264Codec);
679 688
680 rtc::scoped_ptr<VideoMediaChannel> channel( 689 rtc::scoped_ptr<VideoMediaChannel> channel(
681 SetUpForExternalEncoderFactory(&encoder_factory, codecs)); 690 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
682 691
683 EXPECT_TRUE( 692 EXPECT_TRUE(
684 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); 693 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
685 ASSERT_EQ(1u, encoder_factory.encoders().size()); 694 ASSERT_EQ(1u, encoder_factory.encoders().size());
695 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode());
686 EXPECT_EQ(webrtc::kVideoCodecH264, 696 EXPECT_EQ(webrtc::kVideoCodecH264,
687 encoder_factory.encoders()[0]->GetCodecSettings().codecType); 697 encoder_factory.encoders()[0]->GetCodecSettings().codecType);
688 698
689 channel.reset(); 699 channel.reset();
690 // Make sure DestroyVideoEncoder was called on the factory. 700 // Make sure DestroyVideoEncoder was called on the factory.
691 ASSERT_EQ(0u, encoder_factory.encoders().size()); 701 ASSERT_EQ(0u, encoder_factory.encoders().size());
692 } 702 }
693 703
694 TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) { 704 TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) {
695 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 705 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
696 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264"); 706 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
697 std::vector<cricket::VideoCodec> codecs; 707 std::vector<cricket::VideoCodec> codecs;
698 codecs.push_back(kH264Codec); 708 codecs.push_back(kH264Codec);
699 709
700 rtc::scoped_ptr<VideoMediaChannel> channel( 710 rtc::scoped_ptr<VideoMediaChannel> channel(
701 SetUpForExternalEncoderFactory(&encoder_factory, codecs)); 711 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
702 712
703 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3); 713 const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
704 EXPECT_TRUE( 714 EXPECT_TRUE(
705 channel->AddSendStream(cricket::CreateSimStreamParams("cname", ssrcs))); 715 channel->AddSendStream(cricket::CreateSimStreamParams("cname", ssrcs)));
706 // Set the stream to 720p. This should trigger a "real" encoder 716 // Set the stream to 720p. This should trigger a "real" encoder
707 // initialization. 717 // initialization.
708 cricket::VideoFormat format( 718 cricket::VideoFormat format(
709 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); 719 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420);
710 EXPECT_TRUE(channel->SetSendStreamFormat(ssrcs[0], format)); 720 EXPECT_TRUE(channel->SetSendStreamFormat(ssrcs[0], format));
711 ASSERT_EQ(1u, encoder_factory.encoders().size()); 721 ASSERT_EQ(1u, encoder_factory.encoders().size());
712 FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0]; 722 FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0];
723 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode());
713 EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType); 724 EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType);
714 EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams); 725 EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams);
715 } 726 }
716 727
717 // Test external codec with be added to the end of the supported codec list. 728 // Test external codec with be added to the end of the supported codec list.
718 TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) { 729 TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
719 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; 730 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
720 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264"); 731 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
721 engine_.SetExternalEncoderFactory(&encoder_factory); 732 engine_.SetExternalEncoderFactory(&encoder_factory);
722 engine_.Init(); 733 engine_.Init();
(...skipping 2682 matching lines...) Expand 10 before | Expand all | Expand 10 after
3405 // Ensures that the correct settings are applied to the codec when two temporal 3416 // Ensures that the correct settings are applied to the codec when two temporal
3406 // layer screencasting is enabled, and that the correct simulcast settings are 3417 // layer screencasting is enabled, and that the correct simulcast settings are
3407 // reapplied when disabling screencasting. 3418 // reapplied when disabling screencasting.
3408 TEST_F(WebRtcVideoChannel2SimulcastTest, 3419 TEST_F(WebRtcVideoChannel2SimulcastTest,
3409 DISABLED_TwoTemporalLayerScreencastSettings) { 3420 DISABLED_TwoTemporalLayerScreencastSettings) {
3410 // TODO(pbos): Implement. 3421 // TODO(pbos): Implement.
3411 FAIL() << "Not implemented."; 3422 FAIL() << "Not implemented.";
3412 } 3423 }
3413 3424
3414 } // namespace cricket 3425 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698