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 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 EXPECT_TRUE( | 595 EXPECT_TRUE( |
596 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); | 596 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs))); |
597 EXPECT_TRUE(channel->SetSend(true)); | 597 EXPECT_TRUE(channel->SetSend(true)); |
598 | 598 |
599 cricket::FakeVideoCapturer capturer; | 599 cricket::FakeVideoCapturer capturer; |
600 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer)); | 600 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer)); |
601 EXPECT_EQ(cricket::CS_RUNNING, | 601 EXPECT_EQ(cricket::CS_RUNNING, |
602 capturer.Start(capturer.GetSupportedFormats()->front())); | 602 capturer.Start(capturer.GetSupportedFormats()->front())); |
603 EXPECT_TRUE(capturer.CaptureFrame()); | 603 EXPECT_TRUE(capturer.CaptureFrame()); |
604 | 604 |
605 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); | 605 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(3)); |
606 | 606 |
607 // Verify that encoders are configured for simulcast through adapter | 607 // Verify that encoders are configured for simulcast through adapter |
608 // (increasing resolution and only configured to send one stream each). | 608 // (increasing resolution and only configured to send one stream each). |
609 int prev_width = -1; | 609 int prev_width = -1; |
610 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) { | 610 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) { |
611 ASSERT_TRUE(encoder_factory.encoders()[i]->WaitForInitEncode()); | 611 ASSERT_TRUE(encoder_factory.encoders()[i]->WaitForInitEncode()); |
612 webrtc::VideoCodec codec_settings = | 612 webrtc::VideoCodec codec_settings = |
613 encoder_factory.encoders()[i]->GetCodecSettings(); | 613 encoder_factory.encoders()[i]->GetCodecSettings(); |
614 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams); | 614 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams); |
615 EXPECT_GT(codec_settings.width, prev_width); | 615 EXPECT_GT(codec_settings.width, prev_width); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 | 682 |
683 // Send a fake frame, or else the media engine will configure the simulcast | 683 // Send a fake frame, or else the media engine will configure the simulcast |
684 // encoder adapter at a low-enough size that it'll only create a single | 684 // encoder adapter at a low-enough size that it'll only create a single |
685 // encoder layer. | 685 // encoder layer. |
686 cricket::FakeVideoCapturer capturer; | 686 cricket::FakeVideoCapturer capturer; |
687 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer)); | 687 EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer)); |
688 EXPECT_EQ(cricket::CS_RUNNING, | 688 EXPECT_EQ(cricket::CS_RUNNING, |
689 capturer.Start(capturer.GetSupportedFormats()->front())); | 689 capturer.Start(capturer.GetSupportedFormats()->front())); |
690 EXPECT_TRUE(capturer.CaptureFrame()); | 690 EXPECT_TRUE(capturer.CaptureFrame()); |
691 | 691 |
692 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); | 692 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(3)); |
693 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); | 693 ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); |
694 EXPECT_EQ(webrtc::kVideoCodecVP8, | 694 EXPECT_EQ(webrtc::kVideoCodecVP8, |
695 encoder_factory.encoders()[0]->GetCodecSettings().codecType); | 695 encoder_factory.encoders()[0]->GetCodecSettings().codecType); |
696 | 696 |
697 channel.reset(); | 697 channel.reset(); |
698 // Make sure DestroyVideoEncoder was called on the factory. | 698 // Make sure DestroyVideoEncoder was called on the factory. |
699 EXPECT_EQ(0u, encoder_factory.encoders().size()); | 699 EXPECT_EQ(0u, encoder_factory.encoders().size()); |
700 } | 700 } |
701 | 701 |
702 TEST_F(WebRtcVideoEngine2Test, | 702 TEST_F(WebRtcVideoEngine2Test, |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
899 StreamParams sp = cricket::StreamParams::CreateLegacy(kSsrc); | 899 StreamParams sp = cricket::StreamParams::CreateLegacy(kSsrc); |
900 sp.id = "FakeStreamParamsId"; | 900 sp.id = "FakeStreamParamsId"; |
901 EXPECT_TRUE(channel->AddRecvStream(sp)); | 901 EXPECT_TRUE(channel->AddRecvStream(sp)); |
902 EXPECT_EQ(1u, decoder_factory.decoders().size()); | 902 EXPECT_EQ(1u, decoder_factory.decoders().size()); |
903 | 903 |
904 std::vector<cricket::VideoDecoderParams> params = decoder_factory.params(); | 904 std::vector<cricket::VideoDecoderParams> params = decoder_factory.params(); |
905 ASSERT_EQ(1u, params.size()); | 905 ASSERT_EQ(1u, params.size()); |
906 EXPECT_EQ(sp.id, params[0].receive_stream_id); | 906 EXPECT_EQ(sp.id, params[0].receive_stream_id); |
907 } | 907 } |
908 | 908 |
909 TEST_F(WebRtcVideoEngine2Test, DISABLED_RecreatesEncoderOnContentTypeChange) { | 909 TEST_F(WebRtcVideoEngine2Test, ReconfiguresEncoderOnContentTypeChange) { |
| 910 // This test uses actual webrtc streams, and verifies end-to-end that the |
| 911 // encoder is updated with the new content type. |
| 912 // The RecreatesEncoderOnContentTypeChange test below is similar but uses |
| 913 // fake streams and verifies that new encoder instances are actually |
| 914 // created. |
910 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; | 915 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; |
911 encoder_factory.AddSupportedVideoCodecType("VP8"); | 916 encoder_factory.AddSupportedVideoCodecType("VP8"); |
912 std::unique_ptr<FakeCall> fake_call( | |
913 new FakeCall(webrtc::Call::Config(&event_log_))); | |
914 std::unique_ptr<VideoMediaChannel> channel( | 917 std::unique_ptr<VideoMediaChannel> channel( |
915 SetUpForExternalEncoderFactory(&encoder_factory)); | 918 SetUpForExternalEncoderFactory(&encoder_factory)); |
916 ASSERT_TRUE( | 919 ASSERT_TRUE( |
917 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); | 920 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); |
918 cricket::VideoCodec codec = GetEngineCodec("VP8"); | 921 cricket::VideoCodec codec = GetEngineCodec("VP8"); |
919 cricket::VideoSendParameters parameters; | 922 cricket::VideoSendParameters parameters; |
920 parameters.codecs.push_back(codec); | 923 parameters.codecs.push_back(codec); |
921 channel->OnReadyToSend(true); | 924 channel->OnReadyToSend(true); |
922 channel->SetSend(true); | 925 channel->SetSend(true); |
923 ASSERT_TRUE(channel->SetSendParameters(parameters)); | 926 ASSERT_TRUE(channel->SetSendParameters(parameters)); |
924 | 927 |
925 cricket::FakeVideoCapturer capturer; | 928 cricket::FakeVideoCapturer capturer; |
926 VideoOptions options; | 929 VideoOptions options; |
927 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); | 930 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); |
928 | 931 |
929 EXPECT_EQ(cricket::CS_RUNNING, | 932 EXPECT_EQ(cricket::CS_RUNNING, |
930 capturer.Start(capturer.GetSupportedFormats()->front())); | 933 capturer.Start(capturer.GetSupportedFormats()->front())); |
931 EXPECT_TRUE(capturer.CaptureFrame()); | 934 EXPECT_TRUE(capturer.CaptureFrame()); |
932 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1)); | 935 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1)); |
| 936 EXPECT_TRUE(encoder_factory.encoders().back()->WaitForInitEncode()); |
933 EXPECT_EQ(webrtc::kRealtimeVideo, | 937 EXPECT_EQ(webrtc::kRealtimeVideo, |
934 encoder_factory.encoders().back()->GetCodecSettings().mode); | 938 encoder_factory.encoders().back()->GetCodecSettings().mode); |
935 | 939 |
936 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); | |
937 EXPECT_TRUE(capturer.CaptureFrame()); | |
938 // No change in content type, keep current encoder. | |
939 EXPECT_EQ(1, encoder_factory.GetNumCreatedEncoders()); | |
940 | |
941 options.is_screencast.emplace(true); | 940 options.is_screencast.emplace(true); |
942 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); | 941 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); |
943 EXPECT_TRUE(capturer.CaptureFrame()); | 942 EXPECT_TRUE(capturer.CaptureFrame()); |
944 // Change to screen content, recreate encoder. For the simulcast encoder | 943 // Change to screen content, recreate encoder. |
945 // adapter case, this will result in two calls since InitEncode triggers a | |
946 // a new instance. | |
947 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); | 944 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); |
| 945 EXPECT_TRUE(encoder_factory.encoders().back()->WaitForInitEncode()); |
948 EXPECT_EQ(webrtc::kScreensharing, | 946 EXPECT_EQ(webrtc::kScreensharing, |
949 encoder_factory.encoders().back()->GetCodecSettings().mode); | 947 encoder_factory.encoders().back()->GetCodecSettings().mode); |
950 | 948 |
951 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); | |
952 EXPECT_TRUE(capturer.CaptureFrame()); | |
953 // Still screen content, no need to update encoder. | |
954 EXPECT_EQ(2, encoder_factory.GetNumCreatedEncoders()); | |
955 | |
956 options.is_screencast.emplace(false); | 949 options.is_screencast.emplace(false); |
957 options.video_noise_reduction.emplace(false); | 950 options.video_noise_reduction.emplace(false); |
958 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); | 951 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); |
959 // Change back to regular video content, update encoder. Also change | 952 // Change back to regular video content, update encoder. Also change |
960 // a non |is_screencast| option just to verify it doesn't affect recreation. | 953 // a non |is_screencast| option just to verify it doesn't affect recreation. |
961 EXPECT_TRUE(capturer.CaptureFrame()); | 954 EXPECT_TRUE(capturer.CaptureFrame()); |
962 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(3)); | 955 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(3)); |
| 956 EXPECT_TRUE(encoder_factory.encoders().back()->WaitForInitEncode()); |
963 EXPECT_EQ(webrtc::kRealtimeVideo, | 957 EXPECT_EQ(webrtc::kRealtimeVideo, |
964 encoder_factory.encoders().back()->GetCodecSettings().mode); | 958 encoder_factory.encoders().back()->GetCodecSettings().mode); |
965 | 959 |
966 // Remove stream previously added to free the external encoder instance. | 960 // Remove stream previously added to free the external encoder instance. |
967 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); | 961 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); |
968 EXPECT_EQ(0u, encoder_factory.encoders().size()); | 962 EXPECT_EQ(0u, encoder_factory.encoders().size()); |
969 } | 963 } |
970 | 964 |
| 965 TEST_F(WebRtcVideoEngine2Test, RecreatesEncoderOnContentTypeChange) { |
| 966 cricket::FakeWebRtcVideoEncoderFactory encoder_factory; |
| 967 // Set another codec than VP8, so that the encoder factory won't be wrapped |
| 968 // in a WebRtcSimulcastEncoderFactory, which prevents us from properly |
| 969 // detecting the codec be recreated (encoder_factory won't be called until |
| 970 // InitEncode in that case, and will be indistinguishable from just calling |
| 971 // ReconfigureEncoder). |
| 972 encoder_factory.AddSupportedVideoCodecType("VP9"); |
| 973 FakeCall fake_call((webrtc::Call::Config(&event_log_))); |
| 974 call_.reset(&fake_call); |
| 975 std::unique_ptr<VideoMediaChannel> channel( |
| 976 SetUpForExternalEncoderFactory(&encoder_factory)); |
| 977 ASSERT_TRUE( |
| 978 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); |
| 979 cricket::VideoCodec codec = GetEngineCodec("VP9"); |
| 980 cricket::VideoSendParameters parameters; |
| 981 parameters.codecs.push_back(codec); |
| 982 channel->OnReadyToSend(true); |
| 983 channel->SetSend(true); |
| 984 ASSERT_TRUE(channel->SetSendParameters(parameters)); |
| 985 |
| 986 cricket::FakeVideoCapturer capturer; |
| 987 VideoOptions options; |
| 988 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); |
| 989 EXPECT_EQ(cricket::CS_RUNNING, |
| 990 capturer.Start(capturer.GetSupportedFormats()->front())); |
| 991 EXPECT_TRUE(capturer.CaptureFrame()); |
| 992 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1)); |
| 993 ASSERT_EQ(1, fake_call.GetNumCreatedSendStreams()); |
| 994 EXPECT_EQ( |
| 995 1, |
| 996 fake_call.GetVideoSendStreams().back()->num_encoder_reconfigurations()); |
| 997 EXPECT_EQ( |
| 998 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo, |
| 999 fake_call.GetVideoSendStreams().back()->GetEncoderConfig().content_type); |
| 1000 webrtc::VideoCodecVP9 vp9_settings; |
| 1001 EXPECT_TRUE( |
| 1002 fake_call.GetVideoSendStreams().back()->GetVp9Settings(&vp9_settings)); |
| 1003 EXPECT_FALSE(vp9_settings.denoisingOn); |
| 1004 |
| 1005 // No change in content type, keep current encoder, but reinitialize it |
| 1006 // because of option change. |
| 1007 options.video_noise_reduction.emplace(true); |
| 1008 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); |
| 1009 EXPECT_TRUE(capturer.CaptureFrame()); |
| 1010 EXPECT_EQ(1, encoder_factory.GetNumCreatedEncoders()); |
| 1011 ASSERT_EQ(1, fake_call.GetNumCreatedSendStreams()); |
| 1012 EXPECT_EQ( |
| 1013 2, |
| 1014 fake_call.GetVideoSendStreams().back()->num_encoder_reconfigurations()); |
| 1015 EXPECT_EQ( |
| 1016 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo, |
| 1017 fake_call.GetVideoSendStreams().back()->GetEncoderConfig().content_type); |
| 1018 EXPECT_TRUE( |
| 1019 fake_call.GetVideoSendStreams().back()->GetVp9Settings(&vp9_settings)); |
| 1020 EXPECT_TRUE(vp9_settings.denoisingOn); |
| 1021 |
| 1022 // Change to screen content, recreate encoder, and update denoiser option. |
| 1023 options.is_screencast.emplace(true); |
| 1024 options.video_noise_reduction.emplace(false); |
| 1025 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); |
| 1026 EXPECT_TRUE(capturer.CaptureFrame()); |
| 1027 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); |
| 1028 EXPECT_EQ(2, encoder_factory.GetNumCreatedEncoders()); |
| 1029 ASSERT_EQ(2, fake_call.GetNumCreatedSendStreams()); |
| 1030 // Encoder will get configured twice, once when recreating, and again when |
| 1031 // applying the changed options (video_noise_reduction). |
| 1032 EXPECT_EQ( |
| 1033 2, |
| 1034 fake_call.GetVideoSendStreams().back()->num_encoder_reconfigurations()); |
| 1035 EXPECT_EQ( |
| 1036 webrtc::VideoEncoderConfig::ContentType::kScreen, |
| 1037 fake_call.GetVideoSendStreams().back()->GetEncoderConfig().content_type); |
| 1038 EXPECT_TRUE( |
| 1039 fake_call.GetVideoSendStreams().back()->GetVp9Settings(&vp9_settings)); |
| 1040 EXPECT_FALSE(vp9_settings.denoisingOn); |
| 1041 |
| 1042 // Change back to regular video content, update encoder. Don't change |
| 1043 // denoiser option. |
| 1044 options.is_screencast.emplace(false); |
| 1045 EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); |
| 1046 EXPECT_TRUE(capturer.CaptureFrame()); |
| 1047 ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(3)); |
| 1048 EXPECT_EQ(3, encoder_factory.GetNumCreatedEncoders()); |
| 1049 ASSERT_EQ(3, fake_call.GetNumCreatedSendStreams()); |
| 1050 EXPECT_EQ( |
| 1051 1, |
| 1052 fake_call.GetVideoSendStreams().back()->num_encoder_reconfigurations()); |
| 1053 EXPECT_EQ( |
| 1054 webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo, |
| 1055 fake_call.GetVideoSendStreams().back()->GetEncoderConfig().content_type); |
| 1056 EXPECT_TRUE( |
| 1057 fake_call.GetVideoSendStreams().back()->GetVp9Settings(&vp9_settings)); |
| 1058 EXPECT_FALSE(vp9_settings.denoisingOn); |
| 1059 |
| 1060 // Remove stream previously added to free the external encoder instance. |
| 1061 EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); |
| 1062 EXPECT_EQ(0u, encoder_factory.encoders().size()); |
| 1063 call_.release(); |
| 1064 } |
| 1065 |
971 #define WEBRTC_BASE_TEST(test) \ | 1066 #define WEBRTC_BASE_TEST(test) \ |
972 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); } | 1067 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); } |
973 | 1068 |
974 #define WEBRTC_DISABLED_BASE_TEST(test) \ | 1069 #define WEBRTC_DISABLED_BASE_TEST(test) \ |
975 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); } | 1070 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); } |
976 | 1071 |
977 WEBRTC_BASE_TEST(SetSend); | 1072 WEBRTC_BASE_TEST(SetSend); |
978 WEBRTC_BASE_TEST(SetSendWithoutCodecs); | 1073 WEBRTC_BASE_TEST(SetSendWithoutCodecs); |
979 WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes); | 1074 WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes); |
980 | 1075 |
(...skipping 3385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4366 } | 4461 } |
4367 | 4462 |
4368 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsForSimulcastScreenshare) { | 4463 TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsForSimulcastScreenshare) { |
4369 webrtc::test::ScopedFieldTrials override_field_trials_( | 4464 webrtc::test::ScopedFieldTrials override_field_trials_( |
4370 "WebRTC-SimulcastScreenshare/Enabled/"); | 4465 "WebRTC-SimulcastScreenshare/Enabled/"); |
4371 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 2, true, | 4466 VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 2, true, |
4372 true); | 4467 true); |
4373 } | 4468 } |
4374 | 4469 |
4375 } // namespace cricket | 4470 } // namespace cricket |
OLD | NEW |