Add min pushback target bitrate as a parameter that can be set in field trial string.

Bug: None
Change-Id: I9922abadba8164d19e06026fe363efdd337f068e
Reviewed-on: https://webrtc-review.googlesource.com/80122
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Commit-Queue: Ying Wang <yinwa@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23484}
diff --git a/modules/congestion_controller/rtp/send_side_congestion_controller.cc b/modules/congestion_controller/rtp/send_side_congestion_controller.cc
index 0a8b796..a75c1bc 100644
--- a/modules/congestion_controller/rtp/send_side_congestion_controller.cc
+++ b/modules/congestion_controller/rtp/send_side_congestion_controller.cc
@@ -47,7 +47,22 @@
 // the congestion window and/or data spikes reduces encoder allocations.
 const char kPacerPushbackExperiment[] = "WebRTC-PacerPushbackExperiment";
 const int64_t PacerQueueUpdateIntervalMs = 25;
-const uint32_t MinPushbackTargetBitrateBps = 30000;
+const uint32_t kDefaultMinPushbackTargetBitrateBps = 30000;
+
+bool ReadCongestionWindowPushbackExperimentParameter(
+    uint32_t* min_pushback_target_bitrate_bps) {
+  RTC_DCHECK(min_pushback_target_bitrate_bps);
+  std::string experiment_string =
+      webrtc::field_trial::FindFullName(kCongestionPushbackExperiment);
+  int parsed_values = sscanf(experiment_string.c_str(), "Enabled-%" PRIu32,
+                             min_pushback_target_bitrate_bps);
+  if (parsed_values == 1) {
+    RTC_CHECK_GE(*min_pushback_target_bitrate_bps, 0)
+        << "Min pushback target bitrate must be greater than or equal to 0.";
+    return true;
+  }
+  return false;
+}
 
 bool IsPacerPushbackExperimentEnabled() {
   return webrtc::field_trial::IsEnabled(kPacerPushbackExperiment) ||
@@ -193,6 +208,7 @@
   int64_t last_reported_rtt_ms_ = 0;
   const bool pacer_pushback_experiment_ = false;
   const bool congestion_window_pushback_experiment_ = false;
+  uint32_t min_pushback_target_bitrate_bps_;
   int64_t pacer_expected_queue_ms_ = 0;
   double encoding_rate_ratio_ = 1.0;
 
@@ -209,6 +225,11 @@
       congestion_window_pushback_experiment_(
           IsCongestionWindowExperimentEnabled()) {
   sequenced_checker_.Detach();
+  if (congestion_window_pushback_experiment_ &&
+      !ReadCongestionWindowPushbackExperimentParameter(
+          &min_pushback_target_bitrate_bps_)) {
+    min_pushback_target_bitrate_bps_ = kDefaultMinPushbackTargetBitrateBps;
+  }
 }
 
 void ControlHandler::PostUpdates(NetworkControlUpdate update) {
@@ -286,8 +307,8 @@
     // If adjusted target bitrate is lower than minimum target bitrate,
     // does not reduce target bitrate lower than minimum target bitrate.
     target_bitrate_bps =
-        adjusted_target_bitrate_bps < MinPushbackTargetBitrateBps
-            ? std::min(target_bitrate_bps, MinPushbackTargetBitrateBps)
+        adjusted_target_bitrate_bps < min_pushback_target_bitrate_bps_
+            ? std::min(target_bitrate_bps, min_pushback_target_bitrate_bps_)
             : adjusted_target_bitrate_bps;
   } else if (!pacer_pushback_experiment_) {
     target_bitrate_bps = IsSendQueueFull() ? 0 : target_bitrate_bps;