Add more options for tuning the RobustThroughputEstimator through field trial.

Bug: webrtc:10274
Change-Id: I94a8c200947c66277d67812bc1d0acc9e1f40e7a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168045
Commit-Queue: Björn Terelius <terelius@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30432}
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.cc b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.cc
index e86ab63..8abe6d6 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.cc
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.cc
@@ -10,6 +10,8 @@
 
 #include "modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h"
 
+#include <algorithm>
+
 #include "modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h"
 #include "modules/congestion_controller/goog_cc/robust_throughput_estimator.h"
 #include "rtc_base/logging.h"
@@ -27,21 +29,34 @@
                         << " packets";
     min_packets = 20;
   }
+  if (initial_packets < 10 || kMaxPackets < initial_packets) {
+    RTC_LOG(LS_WARNING) << "Initial size must be between 10 and " << kMaxPackets
+                        << " packets";
+    initial_packets = 20;
+  }
+  initial_packets = std::min(initial_packets, min_packets);
   if (window_duration < TimeDelta::ms(100) ||
       TimeDelta::ms(2000) < window_duration) {
     RTC_LOG(LS_WARNING) << "Window duration must be between 100 and 2000 ms";
     window_duration = TimeDelta::ms(500);
   }
+  if (unacked_weight < 0.0 || 1.0 < unacked_weight) {
+    RTC_LOG(LS_WARNING)
+        << "Weight for prior unacked size must be between 0 and 1.";
+    unacked_weight = 1.0;
+  }
 }
 
 std::unique_ptr<StructParametersParser>
 RobustThroughputEstimatorSettings::Parser() {
-  return StructParametersParser::Create("enabled", &enabled,          //
-                                        "reduce_bias", &reduce_bias,  //
-                                        "assume_shared_link",
-                                        &assume_shared_link,          //
-                                        "min_packets", &min_packets,  //
-                                        "window_duration", &window_duration);
+  return StructParametersParser::Create("enabled", &enabled,                  //
+                                        "reduce_bias", &reduce_bias,          //
+                                        "assume_shared_link",                 //
+                                        &assume_shared_link,                  //
+                                        "min_packets", &min_packets,          //
+                                        "window_duration", &window_duration,  //
+                                        "initial_packets", &initial_packets,  //
+                                        "unacked_weight", &unacked_weight);
 }
 
 AcknowledgedBitrateEstimatorInterface::
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h
index 0b29a2c..fb257cf 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h
@@ -49,6 +49,15 @@
   unsigned min_packets = 20;
   TimeDelta window_duration = TimeDelta::ms(500);
 
+  // The estimator window requires at least |initial_packets| packets received
+  // over at least |initial_duration|.
+  unsigned initial_packets = 20;
+
+  // If audio packets are included in allocation, but not in bandwidth
+  // estimation and the sent audio packets get double counted,
+  // then it might be useful to reduce the weight to 0.5.
+  double unacked_weight = 1.0;
+
   std::unique_ptr<StructParametersParser> Parser();
 };
 
diff --git a/modules/congestion_controller/goog_cc/robust_throughput_estimator.cc b/modules/congestion_controller/goog_cc/robust_throughput_estimator.cc
index 5966bc0..8c77e8f 100644
--- a/modules/congestion_controller/goog_cc/robust_throughput_estimator.cc
+++ b/modules/congestion_controller/goog_cc/robust_throughput_estimator.cc
@@ -53,7 +53,7 @@
 }
 
 absl::optional<DataRate> RobustThroughputEstimator::bitrate() const {
-  if (window_.size() < settings_.min_packets)
+  if (window_.size() < settings_.initial_packets)
     return absl::nullopt;
 
   TimeDelta largest_recv_gap(TimeDelta::ms(0));
@@ -80,7 +80,8 @@
     min_recv_time = std::min(min_recv_time, packet.receive_time);
     max_recv_time = std::max(max_recv_time, packet.receive_time);
     data_size += packet.sent_packet.size;
-    data_size += packet.sent_packet.prior_unacked_data;
+    data_size +=
+        packet.sent_packet.prior_unacked_data * settings_.unacked_weight;
   }
 
   // Suppose a packet of size S is sent every T milliseconds.