diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc index 9324723cc3..005e6f24df 100644 --- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc +++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc @@ -1198,6 +1198,10 @@ VideoEncoder::EncoderInfo LibvpxVp8Encoder::GetEncoderInfo() const { ? VideoEncoder::ScalingSettings( kLowVp8QpThreshold, kHighVp8QpThreshold) : VideoEncoder::ScalingSettings::kOff; + if (rate_control_settings_.LibvpxVp8MinPixels()) { + info.scaling_settings.min_pixels_per_frame = + rate_control_settings_.LibvpxVp8MinPixels().value(); + } // |encoder_idx| is libvpx index where 0 is highest resolution. // |si| is simulcast index, where 0 is lowest resolution. for (size_t si = 0, encoder_idx = encoders_.size() - 1; si < encoders_.size(); diff --git a/rtc_base/experiments/rate_control_settings.cc b/rtc_base/experiments/rate_control_settings.cc index eeb2f4957b..69e685acfd 100644 --- a/rtc_base/experiments/rate_control_settings.cc +++ b/rtc_base/experiments/rate_control_settings.cc @@ -67,6 +67,7 @@ RateControlSettings::RateControlSettings( pacing_factor_("pacing_factor"), alr_probing_("alr_probing", false), vp8_qp_max_("vp8_qp_max"), + vp8_min_pixels_("vp8_min_pixels"), trust_vp8_( "trust_vp8", IsEnabled(key_value_config, kVp8TrustedRateControllerFieldTrialName)), @@ -91,10 +92,10 @@ RateControlSettings::RateControlSettings( ParseFieldTrial({&congestion_window_, &congestion_window_pushback_}, key_value_config->Lookup("WebRTC-CongestionWindow")); ParseFieldTrial( - {&pacing_factor_, &alr_probing_, &vp8_qp_max_, &trust_vp8_, &trust_vp9_, - &video_hysteresis_, &screenshare_hysteresis_, &probe_max_allocation_, - &bitrate_adjuster_, &adjuster_use_headroom_, &vp8_s0_boost_, - &vp8_dynamic_rate_, &vp9_dynamic_rate_}, + {&pacing_factor_, &alr_probing_, &vp8_qp_max_, &vp8_min_pixels_, + &trust_vp8_, &trust_vp9_, &video_hysteresis_, &screenshare_hysteresis_, + &probe_max_allocation_, &bitrate_adjuster_, &adjuster_use_headroom_, + &vp8_s0_boost_, &vp8_dynamic_rate_, &vp9_dynamic_rate_}, key_value_config->Lookup("WebRTC-VideoRateControl")); } @@ -147,6 +148,13 @@ absl::optional RateControlSettings::LibvpxVp8QpMax() const { return vp8_qp_max_.GetOptional(); } +absl::optional RateControlSettings::LibvpxVp8MinPixels() const { + if (vp8_min_pixels_ && vp8_min_pixels_.Value() < 1) { + return absl::nullopt; + } + return vp8_min_pixels_.GetOptional(); +} + bool RateControlSettings::LibvpxVp8TrustedRateController() const { return trust_vp8_.Get(); } diff --git a/rtc_base/experiments/rate_control_settings.h b/rtc_base/experiments/rate_control_settings.h index 70acc25c6a..b003bee726 100644 --- a/rtc_base/experiments/rate_control_settings.h +++ b/rtc_base/experiments/rate_control_settings.h @@ -41,6 +41,7 @@ class RateControlSettings final { bool UseAlrProbing() const; absl::optional LibvpxVp8QpMax() const; + absl::optional LibvpxVp8MinPixels() const; bool LibvpxVp8TrustedRateController() const; bool Vp8BoostBaseLayerQuality() const; bool Vp8DynamicRateSettings() const; @@ -69,6 +70,7 @@ class RateControlSettings final { FieldTrialOptional pacing_factor_; FieldTrialParameter alr_probing_; FieldTrialOptional vp8_qp_max_; + FieldTrialOptional vp8_min_pixels_; FieldTrialParameter trust_vp8_; FieldTrialParameter trust_vp9_; FieldTrialParameter video_hysteresis_; diff --git a/rtc_base/experiments/rate_control_settings_unittest.cc b/rtc_base/experiments/rate_control_settings_unittest.cc index 89319e9088..dfdd7deb89 100644 --- a/rtc_base/experiments/rate_control_settings_unittest.cc +++ b/rtc_base/experiments/rate_control_settings_unittest.cc @@ -79,6 +79,23 @@ TEST(RateControlSettingsTest, DoesNotGetTooLargeLibvpxVp8QpMaxValue) { EXPECT_FALSE(RateControlSettings::ParseFromFieldTrials().LibvpxVp8QpMax()); } +TEST(RateControlSettingsTest, LibvpxVp8MinPixels) { + EXPECT_FALSE( + RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels()); + + test::ScopedFieldTrials field_trials( + "WebRTC-VideoRateControl/vp8_min_pixels:50000/"); + EXPECT_EQ(RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels(), + 50000); +} + +TEST(RateControlSettingsTest, DoesNotGetTooSmallLibvpxVp8MinPixelValue) { + test::ScopedFieldTrials field_trials( + "WebRTC-VideoRateControl/vp8_min_pixels:0/"); + EXPECT_FALSE( + RateControlSettings::ParseFromFieldTrials().LibvpxVp8MinPixels()); +} + TEST(RateControlSettingsTest, LibvpxTrustedRateController) { const RateControlSettings settings_before = RateControlSettings::ParseFromFieldTrials();