RateControlSettings: add option to set min pixels per frame for libvpx vp8.

Bug: none
Change-Id: I09aa1bcea2f4a9cd65ffeef1df1d9656e4604def
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/144029
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28412}
diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
index 9324723..005e6f2 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::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 eeb2f49..69e685a 100644
--- a/rtc_base/experiments/rate_control_settings.cc
+++ b/rtc_base/experiments/rate_control_settings.cc
@@ -67,6 +67,7 @@
       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 @@
   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 @@
   return vp8_qp_max_.GetOptional();
 }
 
+absl::optional<int> 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 70acc25..b003bee 100644
--- a/rtc_base/experiments/rate_control_settings.h
+++ b/rtc_base/experiments/rate_control_settings.h
@@ -41,6 +41,7 @@
   bool UseAlrProbing() const;
 
   absl::optional<int> LibvpxVp8QpMax() const;
+  absl::optional<int> LibvpxVp8MinPixels() const;
   bool LibvpxVp8TrustedRateController() const;
   bool Vp8BoostBaseLayerQuality() const;
   bool Vp8DynamicRateSettings() const;
@@ -69,6 +70,7 @@
   FieldTrialOptional<double> pacing_factor_;
   FieldTrialParameter<bool> alr_probing_;
   FieldTrialOptional<int> vp8_qp_max_;
+  FieldTrialOptional<int> vp8_min_pixels_;
   FieldTrialParameter<bool> trust_vp8_;
   FieldTrialParameter<bool> trust_vp9_;
   FieldTrialParameter<double> video_hysteresis_;
diff --git a/rtc_base/experiments/rate_control_settings_unittest.cc b/rtc_base/experiments/rate_control_settings_unittest.cc
index 89319e9..dfdd7de 100644
--- a/rtc_base/experiments/rate_control_settings_unittest.cc
+++ b/rtc_base/experiments/rate_control_settings_unittest.cc
@@ -79,6 +79,23 @@
   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();