diff --git a/rtc_base/experiments/balanced_degradation_settings.cc b/rtc_base/experiments/balanced_degradation_settings.cc index 8306027af3..40c9e87a69 100644 --- a/rtc_base/experiments/balanced_degradation_settings.cc +++ b/rtc_base/experiments/balanced_degradation_settings.cc @@ -317,6 +317,16 @@ absl::optional BalancedDegradationSettings::NextHigherBitrateKbps( return absl::nullopt; } +bool BalancedDegradationSettings::CanAdaptUp(int pixels, + uint32_t bitrate_bps) const { + absl::optional next_layer_min_kbps = NextHigherBitrateKbps(pixels); + if (!next_layer_min_kbps.has_value() || bitrate_bps == 0) { + return true; // No limit configured or bitrate provided. + } + return bitrate_bps >= + static_cast(next_layer_min_kbps.value() * 1000); +} + absl::optional BalancedDegradationSettings::MinFpsDiff(int pixels) const { for (const auto& config : configs_) { if (pixels <= config.pixels) { diff --git a/rtc_base/experiments/balanced_degradation_settings.h b/rtc_base/experiments/balanced_degradation_settings.h index 494102e5b0..05e23640e1 100644 --- a/rtc_base/experiments/balanced_degradation_settings.h +++ b/rtc_base/experiments/balanced_degradation_settings.h @@ -82,6 +82,9 @@ class BalancedDegradationSettings { // Gets the bitrate for the first resolution above |pixels|. absl::optional NextHigherBitrateKbps(int pixels) const; + // Checks if quality can be increased based on |pixels| and |bitrate_bps|. + bool CanAdaptUp(int pixels, uint32_t bitrate_bps) const; + // Gets the min framerate diff from |configs_| based on |pixels|. absl::optional MinFpsDiff(int pixels) const; diff --git a/rtc_base/experiments/balanced_degradation_settings_unittest.cc b/rtc_base/experiments/balanced_degradation_settings_unittest.cc index 4c719d7428..b8ddf9a03a 100644 --- a/rtc_base/experiments/balanced_degradation_settings_unittest.cc +++ b/rtc_base/experiments/balanced_degradation_settings_unittest.cc @@ -359,6 +359,20 @@ TEST(BalancedDegradationSettings, GetsNextHigherBitrateWithUnsetValue) { EXPECT_FALSE(settings.NextHigherBitrateKbps(2001)); } +TEST(BalancedDegradationSettings, CanAdaptUpIfBitrateGeNextHigherKbpsLimit) { + webrtc::test::ScopedFieldTrials field_trials( + "WebRTC-Video-BalancedDegradationSettings/" + "pixels:1000|2000|3000|4000,fps:5|15|25|30,kbps:0|80|0|90/"); + BalancedDegradationSettings settings; + EXPECT_TRUE(settings.CanAdaptUp(1000, 0)); // No bitrate provided. + EXPECT_FALSE(settings.CanAdaptUp(1000, 79000)); + EXPECT_TRUE(settings.CanAdaptUp(1000, 80000)); + EXPECT_TRUE(settings.CanAdaptUp(1001, 1)); // No limit configured. + EXPECT_FALSE(settings.CanAdaptUp(3000, 89000)); + EXPECT_TRUE(settings.CanAdaptUp(3000, 90000)); + EXPECT_TRUE(settings.CanAdaptUp(3001, 1)); // No limit. +} + TEST(BalancedDegradationSettings, GetsFpsDiff) { webrtc::test::ScopedFieldTrials field_trials( "WebRTC-Video-BalancedDegradationSettings/" diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc index de807db68b..7dfffb0a42 100644 --- a/video/video_stream_encoder.cc +++ b/video/video_stream_encoder.cc @@ -1912,14 +1912,10 @@ void VideoStreamEncoder::AdaptUp(AdaptReason reason) { switch (degradation_preference_) { case DegradationPreference::BALANCED: { - // Do not adapt up if bwe is less than min bitrate for next resolution. - absl::optional next_layer_min_kbps = - balanced_settings_.NextHigherBitrateKbps( - last_frame_info_->pixel_count()); - if (next_layer_min_kbps && encoder_start_bitrate_bps_ > 0 && - reason == kQuality && - encoder_start_bitrate_bps_ < - static_cast(next_layer_min_kbps.value() * 1000)) { + // Check if quality should be increased based on bitrate. + if (reason == kQuality && + !balanced_settings_.CanAdaptUp(last_frame_info_->pixel_count(), + encoder_start_bitrate_bps_)) { return; } // Try scale up framerate, if higher.