Add field trial to configure averaging window for BitrateEstimator.

Bug: webrtc:10274
Change-Id: Ida699c8e0cdc91d55f91e7f685d0ab7e880703a0
Reviewed-on: https://webrtc-review.googlesource.com/c/120809
Reviewed-by: Christoffer Rodbro <crodbro@webrtc.org>
Commit-Queue: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26498}
diff --git a/modules/congestion_controller/goog_cc/bitrate_estimator.cc b/modules/congestion_controller/goog_cc/bitrate_estimator.cc
index b30ed42..b68498e 100644
--- a/modules/congestion_controller/goog_cc/bitrate_estimator.cc
+++ b/modules/congestion_controller/goog_cc/bitrate_estimator.cc
@@ -22,56 +22,40 @@
 namespace {
 constexpr int kInitialRateWindowMs = 500;
 constexpr int kRateWindowMs = 150;
+constexpr int kMinRateWindowMs = 150;
+constexpr int kMaxRateWindowMs = 1000;
 
-const char kBweInitialThroughputWindowExperiment[] =
-    "WebRTC-BweInitialThroughputWindowExperiment";
-
-int ReadInitialThroughputWindowSizeMs(
-    const WebRtcKeyValueConfig* key_value_config) {
-  std::string experiment_string =
-      key_value_config->Lookup(kBweInitialThroughputWindowExperiment);
-  int initial_window_ms = kInitialRateWindowMs;
-  int parsed_values =
-      sscanf(experiment_string.c_str(), "Enabled-%d", &initial_window_ms);
-  if (parsed_values != 1) {
-    RTC_LOG(LS_ERROR) << "Incorrectly formatted field trial string for "
-                      << kBweInitialThroughputWindowExperiment;
-    return kInitialRateWindowMs;
-  }
-  if (kRateWindowMs <= initial_window_ms && initial_window_ms <= 1000) {
-    RTC_LOG(LS_INFO) << kBweInitialThroughputWindowExperiment
-                     << " enabled with " << initial_window_ms << " ms window.";
-    return initial_window_ms;
-  }
-  RTC_LOG(LS_ERROR)
-      << "Initial window for throughput estimation must be between "
-      << kRateWindowMs << " and 1000 ms.";
-  return kInitialRateWindowMs;
-}
+const char kBweThroughputWindowConfig[] = "WebRTC-BweThroughputWindowConfig";
 
 }  // namespace
 
 BitrateEstimator::BitrateEstimator(const WebRtcKeyValueConfig* key_value_config)
     : sum_(0),
-      initial_window_ms_(kInitialRateWindowMs),
+      initial_window_ms_("initial_window_ms",
+                         kInitialRateWindowMs,
+                         kMinRateWindowMs,
+                         kMaxRateWindowMs),
+      noninitial_window_ms_("window_ms",
+                            kRateWindowMs,
+                            kMinRateWindowMs,
+                            kMaxRateWindowMs),
       current_window_ms_(0),
       prev_time_ms_(-1),
       bitrate_estimate_(-1.0f),
       bitrate_estimate_var_(50.0f) {
-  if (key_value_config->Lookup(kBweInitialThroughputWindowExperiment)
-          .find("Enabled") == 0) {
-    initial_window_ms_ = ReadInitialThroughputWindowSizeMs(key_value_config);
-  }
+  // E.g WebRTC-BweThroughputWindowConfig/initial_window_ms:350,window_ms:250/
+  ParseFieldTrial({&initial_window_ms_, &noninitial_window_ms_},
+                  key_value_config->Lookup(kBweThroughputWindowConfig));
 }
 
 BitrateEstimator::~BitrateEstimator() = default;
 
 void BitrateEstimator::Update(int64_t now_ms, int bytes) {
-  int rate_window_ms = kRateWindowMs;
+  int rate_window_ms = noninitial_window_ms_.Get();
   // We use a larger window at the beginning to get a more stable sample that
   // we can use to initialize the estimate.
   if (bitrate_estimate_ < 0.f)
-    rate_window_ms = initial_window_ms_;
+    rate_window_ms = initial_window_ms_.Get();
   float bitrate_sample = UpdateWindow(now_ms, bytes, rate_window_ms);
   if (bitrate_sample < 0.0f)
     return;
diff --git a/modules/congestion_controller/goog_cc/bitrate_estimator.h b/modules/congestion_controller/goog_cc/bitrate_estimator.h
index b921492..ceac42e 100644
--- a/modules/congestion_controller/goog_cc/bitrate_estimator.h
+++ b/modules/congestion_controller/goog_cc/bitrate_estimator.h
@@ -15,6 +15,7 @@
 
 #include "absl/types/optional.h"
 #include "api/transport/webrtc_key_value_config.h"
+#include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
 
@@ -37,7 +38,8 @@
  private:
   float UpdateWindow(int64_t now_ms, int bytes, int rate_window_ms);
   int sum_;
-  int64_t initial_window_ms_;
+  FieldTrialConstrained<int> initial_window_ms_;
+  FieldTrialConstrained<int> noninitial_window_ms_;
   int64_t current_window_ms_;
   int64_t prev_time_ms_;
   float bitrate_estimate_;