In AimdRateControl, add  trial to use current bitrate as min upper limit

This is to ensure that a bad NetworkState estimate can not decrease BWE
unless an delay BW overuse has been detected.

Bug: webrtc:10489
Change-Id: Ic3a516345999eeba814200c2e295a19b347b2eb6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/317800
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Diep Bui <diepbp@google.com>
Auto-Submit: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#40628}
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.cc b/modules/remote_bitrate_estimator/aimd_rate_control.cc
index b9abb78..686ebcf 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control.cc
+++ b/modules/remote_bitrate_estimator/aimd_rate_control.cc
@@ -83,7 +83,8 @@
       initial_backoff_interval_("initial_backoff_interval"),
       link_capacity_fix_("link_capacity_fix") {
   ParseFieldTrial(
-      {&disable_estimate_bounded_increase_},
+      {&disable_estimate_bounded_increase_,
+       &use_current_estimate_as_min_upper_bound_},
       key_value_config.Lookup("WebRTC-Bwe-EstimateBoundedIncrease"));
   // E.g
   // WebRTC-BweAimdRateControlConfig/initial_backoff_interval:100ms/
@@ -350,7 +351,10 @@
 DataRate AimdRateControl::ClampBitrate(DataRate new_bitrate) const {
   if (!disable_estimate_bounded_increase_ && network_estimate_ &&
       network_estimate_->link_capacity_upper.IsFinite()) {
-    DataRate upper_bound = network_estimate_->link_capacity_upper;
+    DataRate upper_bound =
+        use_current_estimate_as_min_upper_bound_
+            ? std::max(network_estimate_->link_capacity_upper, current_bitrate_)
+            : network_estimate_->link_capacity_upper;
     new_bitrate = std::min(upper_bound, new_bitrate);
   }
   if (network_estimate_ && network_estimate_->link_capacity_lower.IsFinite() &&
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.h b/modules/remote_bitrate_estimator/aimd_rate_control.h
index 91d5a3e..95459e3 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control.h
+++ b/modules/remote_bitrate_estimator/aimd_rate_control.h
@@ -105,6 +105,8 @@
   const bool no_bitrate_increase_in_alr_;
   // If "Disabled",  estimated link capacity is not used as upper bound.
   FieldTrialFlag disable_estimate_bounded_increase_{"Disabled"};
+  FieldTrialParameter<bool> use_current_estimate_as_min_upper_bound_{"c_upper",
+                                                                     false};
   absl::optional<DataRate> last_decrease_;
   FieldTrialOptional<TimeDelta> initial_backoff_interval_;
   FieldTrialFlag link_capacity_fix_;
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control_unittest.cc b/modules/remote_bitrate_estimator/aimd_rate_control_unittest.cc
index 8a5ac84..5b8b0ca 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control_unittest.cc
+++ b/modules/remote_bitrate_estimator/aimd_rate_control_unittest.cc
@@ -212,6 +212,36 @@
             network_estimate.link_capacity_upper);
 }
 
+TEST(AimdRateControlTest,
+     SetEstimateUpperLimitedByCurrentBitrateIfNetworkEstimateIsLow) {
+  AimdRateControl aimd_rate_control(
+      ExplicitKeyValueConfig(
+          "WebRTC-Bwe-EstimateBoundedIncrease/c_upper:true/"),
+      /*send_side=*/true);
+  aimd_rate_control.SetEstimate(DataRate::BitsPerSec(500'000), kInitialTime);
+  ASSERT_EQ(aimd_rate_control.LatestEstimate(), DataRate::BitsPerSec(500'000));
+
+  NetworkStateEstimate network_estimate;
+  network_estimate.link_capacity_upper = DataRate::BitsPerSec(300'000);
+  aimd_rate_control.SetNetworkStateEstimate(network_estimate);
+  aimd_rate_control.SetEstimate(DataRate::BitsPerSec(700'000), kInitialTime);
+  EXPECT_EQ(aimd_rate_control.LatestEstimate(), DataRate::BitsPerSec(500'000));
+}
+
+TEST(AimdRateControlTest,
+     SetEstimateDefaultNotUpperLimitedByCurrentBitrateIfNetworkEstimateIsLow) {
+  AimdRateControl aimd_rate_control(ExplicitKeyValueConfig(""),
+                                    /*send_side=*/true);
+  aimd_rate_control.SetEstimate(DataRate::BitsPerSec(500'000), kInitialTime);
+  ASSERT_EQ(aimd_rate_control.LatestEstimate(), DataRate::BitsPerSec(500'000));
+
+  NetworkStateEstimate network_estimate;
+  network_estimate.link_capacity_upper = DataRate::BitsPerSec(300'000);
+  aimd_rate_control.SetNetworkStateEstimate(network_estimate);
+  aimd_rate_control.SetEstimate(DataRate::BitsPerSec(700'000), kInitialTime);
+  EXPECT_EQ(aimd_rate_control.LatestEstimate(), DataRate::BitsPerSec(300'000));
+}
+
 TEST(AimdRateControlTest, SetEstimateLowerLimitedByNetworkEstimate) {
   AimdRateControl aimd_rate_control(ExplicitKeyValueConfig(""),
                                     /*send_side=*/true);