Index: webrtc/modules/congestion_controller/probe_bitrate_estimator.cc |
diff --git a/webrtc/modules/congestion_controller/probe_bitrate_estimator.cc b/webrtc/modules/congestion_controller/probe_bitrate_estimator.cc |
index 722b01811462074de888e255032ce94c823404b4..6a6ce2c0d80f41ac9901ee99bef32b5c06de4dab 100644 |
--- a/webrtc/modules/congestion_controller/probe_bitrate_estimator.cc |
+++ b/webrtc/modules/congestion_controller/probe_bitrate_estimator.cc |
@@ -25,8 +25,18 @@ constexpr int kMinReceivedProbesPercent = 80; |
// in order to have a valid estimate. |
constexpr int kMinReceivedBytesPercent = 80; |
-// The maximum (receive rate)/(send rate) ratio for a valid estimate. |
-constexpr float kValidRatio = 2.0f; |
+// The maximum |receive rate| / |send rate| ratio for a valid estimate. |
+constexpr float kMaxValidRatio = 2.0f; |
+ |
+// The minimum |receive rate| / |send rate| ratio assuming that the link is |
+// not saturated, i.e. we assume that we will receive at least |
+// kMinRatioForUnsaturatedLink * |send rate| if |send rate| is less than the |
+// link capacity. |
+constexpr float kMinRatioForUnsaturatedLink = 0.9f; |
+ |
+// The target utilization of the link. If we know true link capacity |
+// we'd like to send at 95% of that rate. |
+constexpr float kTargetUtilizationFraction = 0.95f; |
// The maximum time period over which the cluster history is retained. |
// This is also the maximum time period beyond which a probing burst is not |
@@ -113,7 +123,7 @@ int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate( |
float receive_bps = receive_size / receive_interval_ms * 1000; |
float ratio = receive_bps / send_bps; |
- if (ratio > kValidRatio) { |
+ if (ratio > kMaxValidRatio) { |
LOG(LS_INFO) << "Probing unsuccessful, receive/send ratio too high" |
<< " [cluster id: " << cluster_id << "] [send: " << send_size |
<< " bytes / " << send_interval_ms |
@@ -122,8 +132,8 @@ int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate( |
<< receive_interval_ms << " ms = " << receive_bps / 1000 |
<< " kb/s]" |
<< " [ratio: " << receive_bps / 1000 << " / " |
- << send_bps / 1000 << " = " << ratio << " > kValidRatio (" |
- << kValidRatio << ")]"; |
+ << send_bps / 1000 << " = " << ratio << " > kMaxValidRatio (" |
+ << kMaxValidRatio << ")]"; |
if (event_log_) |
event_log_->LogProbeResultFailure(cluster_id, kInvalidSendReceiveRatio); |
return -1; |
@@ -137,6 +147,13 @@ int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate( |
<< " kb/s]"; |
float res = std::min(send_bps, receive_bps); |
+ // If we're receiving at significantly lower bitrate than we were sending at, |
+ // it suggests that we've found the true capacity of the link. In this case, |
+ // set the target bitrate slightly lower to not immediately overuse. |
+ if (receive_bps < kMinRatioForUnsaturatedLink * send_bps) { |
+ RTC_DCHECK_GT(send_bps, receive_bps); |
+ res = kTargetUtilizationFraction * receive_bps; |
+ } |
if (event_log_) |
event_log_->LogProbeResultSuccess(cluster_id, res); |
estimated_bitrate_bps_ = rtc::Optional<int>(res); |