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

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

Issue 2721333003: Fix race in WebRtcVideoEngine2Tests, improve coverage. (Closed)
Patch Set: Created 3 years, 9 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
« no previous file with comments | « webrtc/media/engine/fakewebrtcvideoengine.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
Taylor Brandstetter 2017/03/02 04:53:07 I think I'm confused about the various encoder obj
sprang_webrtc 2017/03/02 14:45:08 Yes, this does not test the simulcast encoder adap
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_EQ(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_EQ(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 one recreating, and again when
Taylor Brandstetter 2017/03/02 04:53:07 Did you mean to say "once when"? Also, does the en
sprang_webrtc 2017/03/02 14:45:07 "once when", yes. It doesn't technically need to.
Taylor Brandstetter 2017/03/02 19:36:19 That sounds good.
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_EQ(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_EQ(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
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
OLDNEW
« no previous file with comments | « webrtc/media/engine/fakewebrtcvideoengine.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698