OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2004 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 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; | 341 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; |
342 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8"); | 342 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8"); |
343 cricket::VideoSendParameters parameters; | 343 cricket::VideoSendParameters parameters; |
344 parameters.codecs.push_back(kVp8Codec); | 344 parameters.codecs.push_back(kVp8Codec); |
345 | 345 |
346 std::unique_ptr<VideoMediaChannel> channel( | 346 std::unique_ptr<VideoMediaChannel> channel( |
347 SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs)); | 347 SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs)); |
348 | 348 |
349 EXPECT_TRUE( | 349 EXPECT_TRUE( |
350 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); | 350 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); |
| 351 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1)); |
351 ASSERT_EQ(1u, encoder_factory.encoders().size()); | 352 ASSERT_EQ(1u, encoder_factory.encoders().size()); |
352 EXPECT_TRUE(channel->SetSend(true)); | 353 EXPECT_TRUE(channel->SetSend(true)); |
353 | 354 |
354 cricket::FakeVideoCapturer capturer; | 355 cricket::FakeVideoCapturer capturer; |
355 channel->SetSource(kSsrc, &capturer); | 356 channel->SetSource(kSsrc, &capturer); |
356 EXPECT_EQ(cricket::CS_RUNNING, | 357 EXPECT_EQ(cricket::CS_RUNNING, |
357 capturer.Start(capturer.GetSupportedFormats()->front())); | 358 capturer.Start(capturer.GetSupportedFormats()->front())); |
358 EXPECT_TRUE(capturer.CaptureFrame()); | 359 EXPECT_TRUE(capturer.CaptureFrame()); |
| 360 // Sending one frame will have reallocated the encoder since input size |
| 361 // changes from a small default to the actual frame width/height. Wait for |
| 362 // that to happen then for the frame to be sent. |
| 363 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); |
359 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0, | 364 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0, |
360 kTimeout); | 365 kTimeout); |
361 | 366 |
362 // Sending one frame will have reallocated the encoder since input size | |
363 // changes from a small default to the actual frame width/height. | |
364 int num_created_encoders = encoder_factory.GetNumCreatedEncoders(); | 367 int num_created_encoders = encoder_factory.GetNumCreatedEncoders(); |
365 EXPECT_EQ(num_created_encoders, 2); | 368 EXPECT_EQ(num_created_encoders, 2); |
366 | 369 |
367 // Setting codecs of the same type should not reallocate any encoders | 370 // Setting codecs of the same type should not reallocate any encoders |
368 // (expecting a no-op). | 371 // (expecting a no-op). |
369 EXPECT_TRUE(channel->SetSendParameters(parameters)); | 372 EXPECT_TRUE(channel->SetSendParameters(parameters)); |
370 EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders()); | 373 EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders()); |
371 | 374 |
372 // Remove stream previously added to free the external encoder instance. | 375 // Remove stream previously added to free the external encoder instance. |
373 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); | 376 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 EXPECT_TRUE( | 587 EXPECT_TRUE( |
585 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); | 588 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); |
586 EXPECT_TRUE(channel->SetSend(true)); | 589 EXPECT_TRUE(channel->SetSend(true)); |
587 | 590 |
588 cricket::FakeVideoCapturer capturer; | 591 cricket::FakeVideoCapturer capturer; |
589 channel->SetSource(ssrcs.front(), &capturer); | 592 channel->SetSource(ssrcs.front(), &capturer); |
590 EXPECT_EQ(cricket::CS_RUNNING, | 593 EXPECT_EQ(cricket::CS_RUNNING, |
591 capturer.Start(capturer.GetSupportedFormats()->front())); | 594 capturer.Start(capturer.GetSupportedFormats()->front())); |
592 EXPECT_TRUE(capturer.CaptureFrame()); | 595 EXPECT_TRUE(capturer.CaptureFrame()); |
593 | 596 |
594 EXPECT_GT(encoder_factory.encoders().size(), 1u); | 597 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); |
595 | 598 |
596 // Verify that encoders are configured for simulcast through adapter | 599 // Verify that encoders are configured for simulcast through adapter |
597 // (increasing resolution and only configured to send one stream each). | 600 // (increasing resolution and only configured to send one stream each). |
598 int prev_width = -1; | 601 int prev_width = -1; |
599 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) { | 602 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) { |
| 603 ASSERT_TRUE(encoder_factory.encoders()[i]->WaitForInitEncode()); |
600 webrtc::VideoCodec codec_settings = | 604 webrtc::VideoCodec codec_settings = |
601 encoder_factory.encoders()[i]->GetCodecSettings(); | 605 encoder_factory.encoders()[i]->GetCodecSettings(); |
602 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams); | 606 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams); |
603 EXPECT_GT(codec_settings.width, prev_width); | 607 EXPECT_GT(codec_settings.width, prev_width); |
604 prev_width = codec_settings.width; | 608 prev_width = codec_settings.width; |
605 } | 609 } |
606 | 610 |
607 channel->SetSource(ssrcs.front(), NULL); | 611 channel->SetSource(ssrcs.front(), NULL); |
608 | 612 |
609 channel.reset(); | 613 channel.reset(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 | 669 |
666 // Send a fake frame, or else the media engine will configure the simulcast | 670 // Send a fake frame, or else the media engine will configure the simulcast |
667 // encoder adapter at a low-enough size that it'll only create a single | 671 // encoder adapter at a low-enough size that it'll only create a single |
668 // encoder layer. | 672 // encoder layer. |
669 cricket::FakeVideoCapturer capturer; | 673 cricket::FakeVideoCapturer capturer; |
670 channel->SetSource(ssrcs.front(), &capturer); | 674 channel->SetSource(ssrcs.front(), &capturer); |
671 EXPECT_EQ(cricket::CS_RUNNING, | 675 EXPECT_EQ(cricket::CS_RUNNING, |
672 capturer.Start(capturer.GetSupportedFormats()->front())); | 676 capturer.Start(capturer.GetSupportedFormats()->front())); |
673 EXPECT_TRUE(capturer.CaptureFrame()); | 677 EXPECT_TRUE(capturer.CaptureFrame()); |
674 | 678 |
675 ASSERT_GT(encoder_factory.encoders().size(), 1u); | 679 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); |
| 680 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); |
676 EXPECT_EQ(webrtc::kVideoCodecVP8, | 681 EXPECT_EQ(webrtc::kVideoCodecVP8, |
677 encoder_factory.encoders()[0]->GetCodecSettings().codecType); | 682 encoder_factory.encoders()[0]->GetCodecSettings().codecType); |
678 | 683 |
679 channel.reset(); | 684 channel.reset(); |
680 // Make sure DestroyVideoEncoder was called on the factory. | 685 // Make sure DestroyVideoEncoder was called on the factory. |
681 EXPECT_EQ(0u, encoder_factory.encoders().size()); | 686 EXPECT_EQ(0u, encoder_factory.encoders().size()); |
682 } | 687 } |
683 | 688 |
684 TEST_F(WebRtcVideoEngine2Test, | 689 TEST_F(WebRtcVideoEngine2Test, |
685 DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) { | 690 DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) { |
686 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; | 691 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; |
687 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8"); | 692 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8"); |
688 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264"); | 693 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264"); |
689 | 694 |
690 std::vector<cricket::VideoCodec> codecs; | 695 std::vector<cricket::VideoCodec> codecs; |
691 codecs.push_back(kH264Codec); | 696 codecs.push_back(kH264Codec); |
692 | 697 |
693 std::unique_ptr<VideoMediaChannel> channel( | 698 std::unique_ptr<VideoMediaChannel> channel( |
694 SetUpForExternalEncoderFactory(&encoder_factory, codecs)); | 699 SetUpForExternalEncoderFactory(&encoder_factory, codecs)); |
695 | 700 |
696 EXPECT_TRUE( | 701 EXPECT_TRUE( |
697 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); | 702 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); |
698 ASSERT_EQ(1u, encoder_factory.encoders().size()); | 703 ASSERT_EQ(1u, encoder_factory.encoders().size()); |
| 704 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); |
699 EXPECT_EQ(webrtc::kVideoCodecH264, | 705 EXPECT_EQ(webrtc::kVideoCodecH264, |
700 encoder_factory.encoders()[0]->GetCodecSettings().codecType); | 706 encoder_factory.encoders()[0]->GetCodecSettings().codecType); |
701 | 707 |
702 channel.reset(); | 708 channel.reset(); |
703 // Make sure DestroyVideoEncoder was called on the factory. | 709 // Make sure DestroyVideoEncoder was called on the factory. |
704 ASSERT_EQ(0u, encoder_factory.encoders().size()); | 710 ASSERT_EQ(0u, encoder_factory.encoders().size()); |
705 } | 711 } |
706 | 712 |
707 TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) { | 713 TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) { |
708 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; | 714 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; |
(...skipping 11 matching lines...) Expand all Loading... |
720 // Send a frame of 720p. This should trigger a "real" encoder initialization. | 726 // Send a frame of 720p. This should trigger a "real" encoder initialization. |
721 cricket::VideoFormat format( | 727 cricket::VideoFormat format( |
722 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); | 728 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); |
723 cricket::FakeVideoCapturer capturer; | 729 cricket::FakeVideoCapturer capturer; |
724 channel->SetSource(ssrcs[0], &capturer); | 730 channel->SetSource(ssrcs[0], &capturer); |
725 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format)); | 731 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format)); |
726 EXPECT_TRUE(capturer.CaptureFrame()); | 732 EXPECT_TRUE(capturer.CaptureFrame()); |
727 | 733 |
728 ASSERT_EQ(1u, encoder_factory.encoders().size()); | 734 ASSERT_EQ(1u, encoder_factory.encoders().size()); |
729 FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0]; | 735 FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0]; |
| 736 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); |
730 EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType); | 737 EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType); |
731 EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams); | 738 EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams); |
732 channel->SetSource(ssrcs[0], nullptr); | 739 channel->SetSource(ssrcs[0], nullptr); |
733 } | 740 } |
734 | 741 |
735 // Test that external codecs are added to the end of the supported codec list. | 742 // Test that external codecs are added to the end of the supported codec list. |
736 TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) { | 743 TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) { |
737 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; | 744 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; |
738 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecUnknown, | 745 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecUnknown, |
739 "FakeExternalCodec"); | 746 "FakeExternalCodec"); |
(...skipping 2859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3599 } | 3606 } |
3600 | 3607 |
3601 // Test that we normalize send codec format size in simulcast. | 3608 // Test that we normalize send codec format size in simulcast. |
3602 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) { | 3609 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) { |
3603 cricket::VideoCodec codec(kVp8Codec270p); | 3610 cricket::VideoCodec codec(kVp8Codec270p); |
3604 codec.width += 1; | 3611 codec.width += 1; |
3605 codec.height += 1; | 3612 codec.height += 1; |
3606 VerifySimulcastSettings(codec, 2, 2); | 3613 VerifySimulcastSettings(codec, 2, 2); |
3607 } | 3614 } |
3608 } // namespace cricket | 3615 } // namespace cricket |
OLD | NEW |