Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1039)

Unified Diff: webrtc/modules/congestion_controller/probe_bitrate_estimator.cc

Issue 2949203002: Only use 95% of the link capacity if the true link capacity is found by probing. (Closed)
Patch Set: Nit Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698