Adds improved estimate bounded backoff to AimdRateControl.
Bug: webrtc:10498
Change-Id: I4e006e437dfa667b738beb009a599bacc6778da5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/146215
Reviewed-by: Jonas Olsson <jonasolsson@webrtc.org>
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28632}
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.cc b/modules/remote_bitrate_estimator/aimd_rate_control.cc
index 0b52381..21ae26d 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control.cc
+++ b/modules/remote_bitrate_estimator/aimd_rate_control.cc
@@ -89,10 +89,13 @@
"WebRTC-DontIncreaseDelayBasedBweInAlr")),
smoothing_experiment_(
IsEnabled(*key_value_config, "WebRTC-Audio-BandwidthSmoothing")),
+ estimate_bounded_backoff_(
+ IsEnabled(*key_value_config, "WebRTC-Bwe-EstimateBoundedBackoff")),
+ estimate_bounded_increase_(
+ IsEnabled(*key_value_config, "WebRTC-Bwe-EstimateBoundedIncrease")),
initial_backoff_interval_("initial_backoff_interval"),
low_throughput_threshold_("low_throughput", DataRate::Zero()),
capacity_deviation_ratio_threshold_("cap_thr", 0.2),
- cross_traffic_factor_("cross", 1.0),
capacity_limit_deviation_factor_("cap_lim", 1) {
// E.g
// WebRTC-BweAimdRateControlConfig/initial_backoff_interval:100ms,
@@ -105,8 +108,7 @@
}
RTC_LOG(LS_INFO) << "Using aimd rate control with back off factor " << beta_;
ParseFieldTrial(
- {&capacity_deviation_ratio_threshold_, &cross_traffic_factor_,
- &capacity_limit_deviation_factor_},
+ {&capacity_deviation_ratio_threshold_, &capacity_limit_deviation_factor_},
key_value_config->Lookup("WebRTC-Bwe-AimdRateControl-NetworkState"));
}
@@ -304,26 +306,11 @@
break;
case kRcDecrease:
- if (network_estimate_ && capacity_deviation_ratio_threshold_) {
- DataRate lower_bound = network_estimate_->link_capacity_lower;
- // TODO(srte): Remove this when link_capacity_lower is available.
- if (lower_bound.IsInfinite()) {
- // If we have a low variance network estimate, we use it over the
- // acknowledged rate to avoid dropping the bitrate too far. This
- // avoids overcompensating when the send rate is lower than the
- // capacity.
- double deviation_ratio = network_estimate_->link_capacity_std_dev /
- network_estimate_->link_capacity;
- if (deviation_ratio < *capacity_deviation_ratio_threshold_) {
- double available_ratio =
- std::max(0.0, 1.0 - network_estimate_->cross_traffic_ratio *
- cross_traffic_factor_);
- lower_bound = network_estimate_->link_capacity * available_ratio;
- }
- }
- if (lower_bound > DataRate::Zero()) {
- estimated_throughput = std::max(lower_bound, estimated_throughput);
- }
+ // TODO(srte): Remove when |estimate_bounded_backoff_| has been validated.
+ if (network_estimate_ && capacity_deviation_ratio_threshold_ &&
+ !estimate_bounded_backoff_) {
+ estimated_throughput = std::max(estimated_throughput,
+ network_estimate_->link_capacity_lower);
}
if (estimated_throughput > low_throughput_threshold_) {
// Set bit rate to something slightly lower than the measured throughput
@@ -335,6 +322,10 @@
new_bitrate = beta_ * link_capacity_.estimate();
}
}
+ if (estimate_bounded_backoff_ && network_estimate_) {
+ new_bitrate = std::max(
+ new_bitrate, network_estimate_->link_capacity_lower * beta_);
+ }
} else {
new_bitrate = estimated_throughput;
if (link_capacity_.has_estimate()) {
@@ -393,14 +384,9 @@
}
}
- if (network_estimate_ && capacity_limit_deviation_factor_) {
+ if (network_estimate_ &&
+ (estimate_bounded_increase_ || capacity_limit_deviation_factor_)) {
DataRate upper_bound = network_estimate_->link_capacity_upper;
- // TODO(srte): Remove this when link_capacity_lower is available.
- if (upper_bound.IsMinusInfinity()) {
- upper_bound = network_estimate_->link_capacity +
- network_estimate_->link_capacity_std_dev *
- capacity_limit_deviation_factor_.Value();
- }
new_bitrate = std::min(new_bitrate, upper_bound);
}
new_bitrate = std::max(new_bitrate, min_configured_bitrate_);
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.h b/modules/remote_bitrate_estimator/aimd_rate_control.h
index d1a1caa..3b150bc 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control.h
+++ b/modules/remote_bitrate_estimator/aimd_rate_control.h
@@ -108,11 +108,18 @@
// limited region (alr) is not detected.
const bool no_bitrate_increase_in_alr_;
const bool smoothing_experiment_;
+ // Use estimated link capacity lower bound if it is higher than the
+ // acknowledged rate when backing off due to overuse.
+ const bool estimate_bounded_backoff_;
+ // Use estimated link capacity upper bound as upper limit for increasing
+ // bitrate over the acknowledged rate.
+ const bool estimate_bounded_increase_;
absl::optional<DataRate> last_decrease_;
FieldTrialOptional<TimeDelta> initial_backoff_interval_;
FieldTrialParameter<DataRate> low_throughput_threshold_;
+ // Deprecated, enable |estimate_bounded_backoff_| instead.
FieldTrialOptional<double> capacity_deviation_ratio_threshold_;
- FieldTrialParameter<double> cross_traffic_factor_;
+ // Deprecated, enable |estimate_bounded_increase_| instead.
FieldTrialOptional<double> capacity_limit_deviation_factor_;
};
} // namespace webrtc