From 1e49ab2d40eba7a3a15d00db998f3f5a6703a167 Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Tue, 30 Jul 2019 13:17:25 +0200 Subject: [PATCH] Migrate part of Vp9 SVC tests on PC framework. Add temporal layers support. Bug: webrtc:10138 Change-Id: I3f0fc38cbe8c31a2aea2f231fed4428b39e3125a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/147260 Reviewed-by: Karl Wiberg Reviewed-by: Florent Castelli Reviewed-by: Mirko Bonadei Commit-Queue: Artem Titov Cr-Commit-Position: refs/heads/master@{#28782} --- .../peerconnection_quality_test_fixture.h | 4 + test/pc/e2e/peer_connection_e2e_smoke_test.cc | 1 + test/pc/e2e/peer_connection_quality_test.cc | 13 +- video/pc_full_stack_tests.cc | 134 ++++++++++++------ 4 files changed, 110 insertions(+), 42 deletions(-) diff --git a/api/test/peerconnection_quality_test_fixture.h b/api/test/peerconnection_quality_test_fixture.h index 94e2bf209b..12907bc9ae 100644 --- a/api/test/peerconnection_quality_test_fixture.h +++ b/api/test/peerconnection_quality_test_fixture.h @@ -182,6 +182,10 @@ class PeerConnectionE2EQualityTestFixture { // but only on non-lossy networks. See more in documentation to // VideoSimulcastConfig. absl::optional simulcast_config; + // Count of temporal layers for video stream. This value will be set into + // each RtpEncodingParameters of RtpParameters of corresponding + // RtpSenderInterface for this video stream. + absl::optional temporal_layers_count; // If specified the input stream will be also copied to specified file. // It is actually one of the test's output file, which contains copy of what // was captured during the test for this video stream on sender side. diff --git a/test/pc/e2e/peer_connection_e2e_smoke_test.cc b/test/pc/e2e/peer_connection_e2e_smoke_test.cc index 8f2d142421..a6f4b5e52c 100644 --- a/test/pc/e2e/peer_connection_e2e_smoke_test.cc +++ b/test/pc/e2e/peer_connection_e2e_smoke_test.cc @@ -154,6 +154,7 @@ TEST_F(PeerConnectionE2EQualityTestSmokeTest, MAYBE_Smoke) { [](PeerConfigurer* bob) { VideoConfig video(640, 360, 30); video.stream_label = "bob-video"; + video.temporal_layers_count = 2; bob->AddVideoConfig(std::move(video)); VideoConfig screenshare(640, 360, 30); diff --git a/test/pc/e2e/peer_connection_quality_test.cc b/test/pc/e2e/peer_connection_quality_test.cc index f43ef3a9ae..697c6cec12 100644 --- a/test/pc/e2e/peer_connection_quality_test.cc +++ b/test/pc/e2e/peer_connection_quality_test.cc @@ -697,7 +697,18 @@ PeerConnectionE2EQualityTest::MaybeAddVideo(TestPeer* peer) { if (video_config.screen_share_config) { track->set_content_hint(VideoTrackInterface::ContentHint::kText); } - peer->AddTrack(track, {video_config.stream_label.value()}); + RTCErrorOr> sender = + peer->AddTrack(track, {video_config.stream_label.value()}); + RTC_CHECK(sender.ok()); + if (video_config.temporal_layers_count) { + RtpParameters rtp_parameters = sender.value()->GetParameters(); + for (auto& encoding_parameters : rtp_parameters.encodings) { + encoding_parameters.num_temporal_layers = + video_config.temporal_layers_count; + } + RTCError res = sender.value()->SetParameters(rtp_parameters); + RTC_CHECK(res.ok()) << "Failed to set RTP parameters"; + } } return out; } diff --git a/video/pc_full_stack_tests.cc b/video/pc_full_stack_tests.cc index afe1da0f5a..717c2f3f6c 100644 --- a/video/pc_full_stack_tests.cc +++ b/video/pc_full_stack_tests.cc @@ -1382,6 +1382,9 @@ ParamsWithLogging::Video SimulcastVp8VideoLow() { #if defined(RTC_ENABLE_VP9) TEST(PCFullStackTest, ScreenshareSlidesVP9_3SL_High_Fps) { + webrtc::test::ScopedFieldTrials override_trials( + AppendFieldTrials("WebRTC-Vp9InterLayerPred/" + "Enabled,inter_layer_pred_mode:on/")); std::unique_ptr network_emulation_manager = CreateNetworkEmulationManager(); auto fixture = CreateTestFixture( @@ -1409,7 +1412,9 @@ TEST(PCFullStackTest, ScreenshareSlidesVP9_3SL_Variable_Fps) { webrtc::test::ScopedFieldTrials override_trials( AppendFieldTrials("WebRTC-VP9VariableFramerateScreenshare/" "Enabled,min_qp:32,min_fps:5.0,undershoot:30,frames_" - "before_steady_state:5/")); + "before_steady_state:5/" + "WebRTC-Vp9InterLayerPred/" + "Enabled,inter_layer_pred_mode:on/")); std::unique_ptr network_emulation_manager = CreateNetworkEmulationManager(); auto fixture = CreateTestFixture( @@ -1433,49 +1438,96 @@ TEST(PCFullStackTest, ScreenshareSlidesVP9_3SL_Variable_Fps) { fixture->Run(std::move(run_params)); } +TEST(PCFullStackTest, VP9SVC_3SL_High) { + webrtc::test::ScopedFieldTrials override_trials( + AppendFieldTrials("WebRTC-Vp9InterLayerPred/" + "Enabled,inter_layer_pred_mode:on/")); + std::unique_ptr network_emulation_manager = + CreateNetworkEmulationManager(); + auto fixture = CreateTestFixture( + "pc_vp9svc_3sl_high", + CreateTwoNetworkLinks(network_emulation_manager.get(), + BuiltInNetworkBehaviorConfig()), + [](PeerConfigurer* alice) { + VideoConfig video(1280, 720, 30); + video.stream_label = "alice-video"; + video.input_file_name = + ClipNameToClipPath("ConferenceMotion_1280_720_50"); + video.simulcast_config = VideoSimulcastConfig(3, 2); + video.temporal_layers_count = 3; + alice->AddVideoConfig(std::move(video)); + }, + [](PeerConfigurer* bob) {}); + RunParams run_params(TimeDelta::seconds(kTestDurationSec)); + run_params.video_codec_name = cricket::kVp9CodecName; + run_params.video_codec_required_params = { + {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}}; + run_params.use_flex_fec = false; + run_params.use_ulp_fec = false; + fixture->Run(std::move(run_params)); +} + +TEST(PCFullStackTest, VP9SVC_3SL_Medium) { + webrtc::test::ScopedFieldTrials override_trials( + AppendFieldTrials("WebRTC-Vp9InterLayerPred/" + "Enabled,inter_layer_pred_mode:on/")); + std::unique_ptr network_emulation_manager = + CreateNetworkEmulationManager(); + auto fixture = CreateTestFixture( + "pc_vp9svc_3sl_medium", + CreateTwoNetworkLinks(network_emulation_manager.get(), + BuiltInNetworkBehaviorConfig()), + [](PeerConfigurer* alice) { + VideoConfig video(1280, 720, 30); + video.stream_label = "alice-video"; + video.input_file_name = + ClipNameToClipPath("ConferenceMotion_1280_720_50"); + video.simulcast_config = VideoSimulcastConfig(3, 1); + video.temporal_layers_count = 3; + alice->AddVideoConfig(std::move(video)); + }, + [](PeerConfigurer* bob) {}); + RunParams run_params(TimeDelta::seconds(kTestDurationSec)); + run_params.video_codec_name = cricket::kVp9CodecName; + run_params.video_codec_required_params = { + {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}}; + run_params.use_flex_fec = false; + run_params.use_ulp_fec = false; + fixture->Run(std::move(run_params)); +} + +TEST(PCFullStackTest, VP9SVC_3SL_Low) { + webrtc::test::ScopedFieldTrials override_trials( + AppendFieldTrials("WebRTC-Vp9InterLayerPred/" + "Enabled,inter_layer_pred_mode:on/")); + std::unique_ptr network_emulation_manager = + CreateNetworkEmulationManager(); + auto fixture = CreateTestFixture( + "pc_vp9svc_3sl_low", + CreateTwoNetworkLinks(network_emulation_manager.get(), + BuiltInNetworkBehaviorConfig()), + [](PeerConfigurer* alice) { + VideoConfig video(1280, 720, 30); + video.stream_label = "alice-video"; + video.input_file_name = + ClipNameToClipPath("ConferenceMotion_1280_720_50"); + video.simulcast_config = VideoSimulcastConfig(3, 0); + video.temporal_layers_count = 3; + alice->AddVideoConfig(std::move(video)); + }, + [](PeerConfigurer* bob) {}); + RunParams run_params(TimeDelta::seconds(kTestDurationSec)); + run_params.video_codec_name = cricket::kVp9CodecName; + run_params.video_codec_required_params = { + {kVP9FmtpProfileId, VP9ProfileToString(VP9Profile::kProfile0)}}; + run_params.use_flex_fec = false; + run_params.use_ulp_fec = false; + fixture->Run(std::move(run_params)); +} + #endif // defined(RTC_ENABLE_VP9) /* -// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework -TEST(PCFullStackTest, VP9SVC_3SL_High) { - auto fixture = CreateVideoQualityTestFixture(); - ParamsWithLogging simulcast; - simulcast.call.send_side_bwe = true; - simulcast.video[0] = SvcVp9Video(); - simulcast.analyzer = {"vp9svc_3sl_high", 0.0, 0.0, kTestDurationSec}; - - simulcast.ss[0] = { - std::vector(), 0, 3, 2, InterLayerPredMode::kOn, - std::vector(), false}; - fixture->RunWithAnalyzer(simulcast); -} - -// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework -TEST(PCFullStackTest, VP9SVC_3SL_Medium) { - auto fixture = CreateVideoQualityTestFixture(); - ParamsWithLogging simulcast; - simulcast.call.send_side_bwe = true; - simulcast.video[0] = SvcVp9Video(); - simulcast.analyzer = {"vp9svc_3sl_medium", 0.0, 0.0, kTestDurationSec}; - simulcast.ss[0] = { - std::vector(), 0, 3, 1, InterLayerPredMode::kOn, - std::vector(), false}; - fixture->RunWithAnalyzer(simulcast); -} - -// TODO(bugs.webrtc.org/10639) requires simulcast/SVC support in PC framework -TEST(PCFullStackTest, VP9SVC_3SL_Low) { - auto fixture = CreateVideoQualityTestFixture(); - ParamsWithLogging simulcast; - simulcast.call.send_side_bwe = true; - simulcast.video[0] = SvcVp9Video(); - simulcast.analyzer = {"vp9svc_3sl_low", 0.0, 0.0, kTestDurationSec}; - simulcast.ss[0] = { - std::vector(), 0, 3, 0, InterLayerPredMode::kOn, - std::vector(), false}; - fixture->RunWithAnalyzer(simulcast); -} - // bugs.webrtc.org/9506 #if !defined(WEBRTC_MAC)