Add field trials to configure the backoff factor and the trendline window of the BWE.

These field trials can be set with a string similar to:
WebRTC-BweWindowSizeInPackets/Enabled-150/WebRTC-BweBackOffFactor/Enabled-0.95/

BweWindowSizeInPackets
Number of packets which the delay-based BWE window is based on. A larger value means lower delay-sensitivity.
Default in WebRTC: 20
Reasonable values for streaming: 50-150

BweBackOffFactor
How far the BWE will back off when the delay increases. A value closer to 1.0 means smaller back-off.
Range: > 0.0, < 1.0
Default in WebRTC: 0.85
Reasonable values for streaming: 0.85-0.95

Bug: webrtc:8212
Change-Id: I61f0883788b689847a43273b63cef663042f4d42
Reviewed-on: https://webrtc-review.googlesource.com/6764
Commit-Queue: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20172}
diff --git a/modules/congestion_controller/delay_based_bwe.cc b/modules/congestion_controller/delay_based_bwe.cc
index fbe8dcc..af6af76 100644
--- a/modules/congestion_controller/delay_based_bwe.cc
+++ b/modules/congestion_controller/delay_based_bwe.cc
@@ -48,11 +48,23 @@
 constexpr int kMaxConsecutiveFailedLookups = 5;
 
 const char kBweSparseUpdateExperiment[] = "WebRTC-BweSparseUpdateExperiment";
+const char kBweWindowSizeInPacketsExperiment[] =
+    "WebRTC-BweWindowSizeInPackets";
 
-bool BweSparseUpdateExperimentIsEnabled() {
+size_t ReadTrendlineFilterWindowSize() {
   std::string experiment_string =
-      webrtc::field_trial::FindFullName(kBweSparseUpdateExperiment);
-  return experiment_string == "Enabled";
+      webrtc::field_trial::FindFullName(kBweWindowSizeInPacketsExperiment);
+  size_t window_size;
+  int parsed_values =
+      sscanf(experiment_string.c_str(), "Enabled-%zu", &window_size);
+  if (parsed_values == 1) {
+    if (window_size > 1)
+      return window_size;
+    LOG(WARNING) << "Window size must be greater than 1.";
+  }
+  LOG(LS_WARNING) << "Failed to parse parameters for BweTrendlineFilter "
+                     "experiment from field trial string. Using default.";
+  return kDefaultTrendlineWindowSize;
 }
 }  // namespace
 
@@ -81,14 +93,20 @@
       last_seen_packet_ms_(-1),
       uma_recorded_(false),
       probe_bitrate_estimator_(event_log),
-      trendline_window_size_(kDefaultTrendlineWindowSize),
+      trendline_window_size_(
+          webrtc::field_trial::IsEnabled(kBweWindowSizeInPacketsExperiment)
+              ? ReadTrendlineFilterWindowSize()
+              : kDefaultTrendlineWindowSize),
       trendline_smoothing_coeff_(kDefaultTrendlineSmoothingCoeff),
       trendline_threshold_gain_(kDefaultTrendlineThresholdGain),
       consecutive_delayed_feedbacks_(0),
       prev_bitrate_(0),
       prev_state_(BandwidthUsage::kBwNormal),
-      in_sparse_update_experiment_(BweSparseUpdateExperimentIsEnabled()) {
-  LOG(LS_INFO) << "Using Trendline filter for delay change estimation.";
+      in_sparse_update_experiment_(
+          webrtc::field_trial::IsEnabled(kBweSparseUpdateExperiment)) {
+  LOG(LS_INFO)
+      << "Using Trendline filter for delay change estimation with window size "
+      << trendline_window_size_;
 }
 
 DelayBasedBwe::~DelayBasedBwe() {}
diff --git a/modules/remote_bitrate_estimator/BUILD.gn b/modules/remote_bitrate_estimator/BUILD.gn
index 4784a83..f6fe97d 100644
--- a/modules/remote_bitrate_estimator/BUILD.gn
+++ b/modules/remote_bitrate_estimator/BUILD.gn
@@ -170,6 +170,7 @@
       ":bwe_simulator_lib",
       ":remote_bitrate_estimator",
       "../../rtc_base:rtc_base_approved",
+      "../../test:field_trial",
       "../../test:test_support",
     ]
     if (!build_with_chromium && is_clang) {
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.cc b/modules/remote_bitrate_estimator/aimd_rate_control.cc
index 2daac01..96b0534 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control.cc
+++ b/modules/remote_bitrate_estimator/aimd_rate_control.cc
@@ -13,19 +13,45 @@
 #include <algorithm>
 #include <cassert>
 #include <cmath>
+#include <string>
 
 #include "rtc_base/checks.h"
 #include "rtc_base/safe_minmax.h"
 
-#include "modules/remote_bitrate_estimator/overuse_detector.h"
 #include "modules/remote_bitrate_estimator/include/bwe_defines.h"
 #include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
+#include "modules/remote_bitrate_estimator/overuse_detector.h"
 #include "modules/remote_bitrate_estimator/test/bwe_test_logging.h"
+#include "rtc_base/logging.h"
+#include "system_wrappers/include/field_trial.h"
 
 namespace webrtc {
 
 static const int64_t kDefaultRttMs = 200;
 static const int64_t kMaxFeedbackIntervalMs = 1000;
+static const float kDefaultBackoffFactor = 0.85f;
+
+const char kBweBackOffFactorExperiment[] = "WebRTC-BweBackOffFactor";
+
+float ReadTrendlineFilterWindowSize() {
+  std::string experiment_string =
+      webrtc::field_trial::FindFullName(kBweBackOffFactorExperiment);
+  float backoff_factor;
+  int parsed_values =
+      sscanf(experiment_string.c_str(), "Enabled-%f", &backoff_factor);
+  if (parsed_values == 1) {
+    if (backoff_factor < 1.0f) {
+      LOG(WARNING) << "Back-off factor must be less than 1.";
+    } else if (backoff_factor > 0.0f) {
+      LOG(WARNING) << "Back-off factor must be greater than 0.";
+    } else {
+      return backoff_factor;
+    }
+  }
+  LOG(LS_WARNING) << "Failed to parse parameters for AimdRateControl "
+                     "experiment from field trial string. Using default.";
+  return kDefaultBackoffFactor;
+}
 
 AimdRateControl::AimdRateControl()
     : min_configured_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
@@ -38,9 +64,13 @@
       time_last_bitrate_change_(-1),
       time_first_incoming_estimate_(-1),
       bitrate_is_initialized_(false),
-      beta_(0.85f),
+      beta_(webrtc::field_trial::IsEnabled(kBweBackOffFactorExperiment)
+                ? ReadTrendlineFilterWindowSize()
+                : kDefaultBackoffFactor),
       rtt_(kDefaultRttMs),
-      in_experiment_(!AdaptiveThresholdExperimentIsDisabled()) {}
+      in_experiment_(!AdaptiveThresholdExperimentIsDisabled()) {
+  LOG(LS_INFO) << "Using aimd rate control with back off factor " << beta_;
+}
 
 AimdRateControl::~AimdRateControl() {}
 
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc
index ee66c72..a623bf1 100644
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc
+++ b/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc
@@ -22,6 +22,7 @@
 #include "modules/remote_bitrate_estimator/test/packet_sender.h"
 #include "rtc_base/constructormagic.h"
 #include "rtc_base/random.h"
+#include "test/field_trial.h"
 #include "test/testsupport/fileutils.h"
 
 namespace webrtc {
@@ -142,6 +143,24 @@
                0, receiver.GetDelayStats(), counter2.GetBitrateStats());
 }
 
+TEST_P(BweFeedbackTest, GoogleWifiTrace3MbpsStreaming) {
+  test::ScopedFieldTrials override_field_trials(
+      "WebRTC-BweWindowSizeInPackets/Enabled-100/"
+      "WebRTC-BweBackOffFactor/Enabled-0.95/");
+  AdaptiveVideoSource source(0, 30, 300, 0, 0);
+  VideoSender sender(&uplink_, &source, GetParam());
+  RateCounterFilter counter1(&uplink_, 0, "sender_output",
+                             bwe_names[GetParam()]);
+  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
+  filter.set_max_delay_ms(500);
+  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
+  PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
+  ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
+  RunFor(300 * 1000);
+  PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
+               0, receiver.GetDelayStats(), counter2.GetBitrateStats());
+}
+
 TEST_P(BweFeedbackTest, PacedSelfFairness50msTest) {
   int64_t kRttMs = 100;
   int64_t kMaxJitterMs = 15;