From ac2dd12d841242133da6e05b5b1f92d9ba8df023 Mon Sep 17 00:00:00 2001 From: Peter Hanspers Date: Fri, 25 Mar 2022 14:16:27 +0100 Subject: [PATCH] Don't override resolution bitrate limits in singlecast mode if they're already set. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:13872 Change-Id: I966c744a13cf74336d62d96c72eb37ebf96de71f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256803 Reviewed-by: Sergey Silkin Reviewed-by: Erik Språng Commit-Queue: Peter Hanspers Cr-Commit-Position: refs/heads/main@{#36342} --- media/engine/simulcast_encoder_adapter.cc | 4 +- .../simulcast_encoder_adapter_unittest.cc | 43 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc index 704c2d6a0b..eeabff2c88 100644 --- a/media/engine/simulcast_encoder_adapter.cc +++ b/media/engine/simulcast_encoder_adapter.cc @@ -824,7 +824,9 @@ void SimulcastEncoderAdapter::OverrideFromFieldTrial( info->apply_alignment_to_all_simulcast_layers || encoder_info_override_.apply_alignment_to_all_simulcast_layers(); } - if (!encoder_info_override_.resolution_bitrate_limits().empty()) { + // Override resolution bitrate limits unless they're set already. + if (info->resolution_bitrate_limits.empty() && + !encoder_info_override_.resolution_bitrate_limits().empty()) { info->resolution_bitrate_limits = encoder_info_override_.resolution_bitrate_limits(); } diff --git a/media/engine/simulcast_encoder_adapter_unittest.cc b/media/engine/simulcast_encoder_adapter_unittest.cc index 5025656ae0..c18df46632 100644 --- a/media/engine/simulcast_encoder_adapter_unittest.cc +++ b/media/engine/simulcast_encoder_adapter_unittest.cc @@ -182,6 +182,10 @@ class MockVideoEncoderFactory : public VideoEncoderFactory { void set_supports_simulcast(bool supports_simulcast) { supports_simulcast_ = supports_simulcast; } + void set_resolution_bitrate_limits( + std::vector limits) { + resolution_bitrate_limits_ = limits; + } void DestroyVideoEncoder(VideoEncoder* encoder); @@ -193,6 +197,7 @@ class MockVideoEncoderFactory : public VideoEncoderFactory { // Keep number of entries in sync with `kMaxSimulcastStreams`. std::vector requested_resolution_alignments_ = {1, 1, 1}; bool supports_simulcast_ = false; + std::vector resolution_bitrate_limits_; }; class MockVideoEncoder : public VideoEncoder { @@ -245,6 +250,7 @@ class MockVideoEncoder : public VideoEncoder { info.fps_allocation[0] = fps_allocation_; info.supports_simulcast = supports_simulcast_; info.is_qp_trusted = is_qp_trusted_; + info.resolution_bitrate_limits = resolution_bitrate_limits; return info; } @@ -312,6 +318,11 @@ class MockVideoEncoder : public VideoEncoder { is_qp_trusted_ = is_qp_trusted; } + void set_resolution_bitrate_limits( + std::vector limits) { + resolution_bitrate_limits = limits; + } + bool supports_simulcast() const { return supports_simulcast_; } SdpVideoFormat video_format() const { return video_format_; } @@ -331,6 +342,7 @@ class MockVideoEncoder : public VideoEncoder { bool supports_simulcast_ = false; absl::optional is_qp_trusted_; SdpVideoFormat video_format_; + std::vector resolution_bitrate_limits; VideoCodec codec_; EncodedImageCallback* callback_; @@ -359,6 +371,7 @@ std::unique_ptr MockVideoEncoderFactory::CreateVideoEncoder( requested_resolution_alignments_[encoders_.size()]); encoder->set_supports_simulcast(supports_simulcast_); encoder->set_video_format(format); + encoder->set_resolution_bitrate_limits(resolution_bitrate_limits_); encoders_.push_back(encoder.get()); return encoder; } @@ -1329,6 +1342,36 @@ TEST_F(TestSimulcastEncoderAdapterFake, adapter_->GetEncoderInfo().apply_alignment_to_all_simulcast_layers); } +TEST_F( + TestSimulcastEncoderAdapterFake, + EncoderInfoFromFieldTrialDoesNotOverrideExistingBitrateLimitsInSinglecast) { + test::ScopedFieldTrials field_trials( + "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" + "frame_size_pixels:123|456|789," + "min_start_bitrate_bps:11000|22000|33000," + "min_bitrate_bps:44000|55000|66000," + "max_bitrate_bps:77000|88000|99000/"); + + std::vector bitrate_limits; + bitrate_limits.push_back( + VideoEncoder::ResolutionBitrateLimits(111, 11100, 44400, 77700)); + bitrate_limits.push_back( + VideoEncoder::ResolutionBitrateLimits(444, 22200, 55500, 88700)); + bitrate_limits.push_back( + VideoEncoder::ResolutionBitrateLimits(777, 33300, 66600, 99900)); + SetUp(); + helper_->factory()->set_resolution_bitrate_limits(bitrate_limits); + + SimulcastTestFixtureImpl::DefaultSettings( + &codec_, static_cast(kTestTemporalLayerProfile), + kVideoCodecVP8); + codec_.numberOfSimulcastStreams = 1; + EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings)); + ASSERT_EQ(1u, helper_->factory()->encoders().size()); + EXPECT_EQ(adapter_->GetEncoderInfo().resolution_bitrate_limits, + bitrate_limits); +} + TEST_F(TestSimulcastEncoderAdapterFake, EncoderInfoFromFieldTrial) { test::ScopedFieldTrials field_trials( "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"