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

Unified Diff: webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc

Issue 1151603008: Make the BWE threshold adaptive. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Experiment simplified - removed Var2 prefix. Created 5 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/remote_bitrate_estimator/aimd_rate_control.cc
diff --git a/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc b/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc
index a1a9baf352038d29de47caba122cc98c2d73935f..ceea21e41b196f3c43f54eda2dc488c0d74d1646 100644
--- a/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc
+++ b/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc
@@ -26,20 +26,19 @@ AimdRateControl::AimdRateControl(uint32_t min_bitrate_bps)
: min_configured_bitrate_bps_(min_bitrate_bps),
max_configured_bitrate_bps_(30000000),
current_bitrate_bps_(max_configured_bitrate_bps_),
- max_hold_rate_bps_(0),
avg_max_bitrate_kbps_(-1.0f),
var_max_bitrate_kbps_(0.4f),
rate_control_state_(kRcHold),
- came_from_state_(kRcDecrease),
rate_control_region_(kRcMaxUnknown),
time_last_bitrate_change_(-1),
current_input_(kBwNormal, 0, 1.0),
updated_(false),
time_first_incoming_estimate_(-1),
bitrate_is_initialized_(false),
- beta_(0.9f),
+ beta_(0.85f),
rtt_(kDefaultRttMs),
- time_of_last_log_(-1) {}
+ time_of_last_log_(-1) {
+}
RateControlType AimdRateControl::GetControlType() const {
return kAimdControl;
@@ -98,8 +97,7 @@ void AimdRateControl::SetRtt(int64_t rtt) {
rtt_ = rtt;
}
-RateControlRegion AimdRateControl::Update(const RateControlInput* input,
- int64_t now_ms) {
+void AimdRateControl::Update(const RateControlInput* input, int64_t now_ms) {
assert(input);
// Set the initial bit rate value to what we're receiving the first half
@@ -125,7 +123,6 @@ RateControlRegion AimdRateControl::Update(const RateControlInput* input,
updated_ = true;
current_input_ = *input;
}
- return rate_control_region_;
}
void AimdRateControl::SetEstimate(int bitrate_bps, int64_t now_ms) {
@@ -148,22 +145,16 @@ uint32_t AimdRateControl::ChangeBitrate(uint32_t current_bitrate_bps,
// variance and the current incoming bit rate.
const float std_max_bit_rate = sqrt(var_max_bitrate_kbps_ *
avg_max_bitrate_kbps_);
- bool fast_recovery_after_hold = false;
switch (rate_control_state_) {
- case kRcHold: {
- max_hold_rate_bps_ = std::max(max_hold_rate_bps_, incoming_bitrate_bps);
+ case kRcHold:
break;
- }
- case kRcIncrease: {
- if (avg_max_bitrate_kbps_ >= 0) {
- if (incoming_bitrate_kbps > avg_max_bitrate_kbps_ +
+
+ case kRcIncrease:
+ if (avg_max_bitrate_kbps_ >= 0 &&
+ incoming_bitrate_kbps > avg_max_bitrate_kbps_ +
3 * std_max_bit_rate) {
- ChangeRegion(kRcMaxUnknown);
- avg_max_bitrate_kbps_ = -1.0;
- } else if (incoming_bitrate_kbps > avg_max_bitrate_kbps_ +
- 2.5 * std_max_bit_rate) {
- ChangeRegion(kRcAboveMax);
- }
+ ChangeRegion(kRcMaxUnknown);
+ avg_max_bitrate_kbps_ = -1.0;
}
mflodman 2015/07/03 08:29:55 Why was the kRcAboveMax removed?
Gaetano Carlucci 2015/07/03 10:54:28 kRcNearMax, kRcAboveMax and kRcMaxUnknown were int
stefan-webrtc 2015/07/03 13:45:10 We decided to simplify back-off and have the back-
if (rate_control_region_ == kRcNearMax) {
// Approximate the over-use estimator delay to 100 ms.
@@ -178,18 +169,10 @@ uint32_t AimdRateControl::ChangeBitrate(uint32_t current_bitrate_bps,
current_bitrate_bps += multiplicative_increase_bps;
}
- if (max_hold_rate_bps_ > 0 &&
- beta_ * max_hold_rate_bps_ > current_bitrate_bps) {
- current_bitrate_bps = static_cast<uint32_t>(beta_ * max_hold_rate_bps_);
- avg_max_bitrate_kbps_ = beta_ * max_hold_rate_bps_ / 1000.0f;
- ChangeRegion(kRcNearMax);
- fast_recovery_after_hold = true;
- }
- max_hold_rate_bps_ = 0;
time_last_bitrate_change_ = now_ms;
break;
- }
- case kRcDecrease: {
+
+ case kRcDecrease:
if (incoming_bitrate_bps < min_configured_bitrate_bps_) {
current_bitrate_bps = min_configured_bitrate_bps_;
} else {
@@ -219,12 +202,11 @@ uint32_t AimdRateControl::ChangeBitrate(uint32_t current_bitrate_bps,
ChangeState(kRcHold);
time_last_bitrate_change_ = now_ms;
break;
- }
+
default:
assert(false);
}
- if (!fast_recovery_after_hold && (incoming_bitrate_bps > 100000 ||
- current_bitrate_bps > 150000) &&
+ if ((incoming_bitrate_bps > 100000 || current_bitrate_bps > 150000) &&
current_bitrate_bps > 1.5 * incoming_bitrate_bps) {
// Allow changing the bit rate if we are operating at very low rates
// Don't change the bit rate if the send side is too far off
@@ -252,8 +234,9 @@ uint32_t AimdRateControl::AdditiveRateIncrease(
assert(response_time_ms > 0);
double beta = 0.0;
if (last_ms > 0) {
- beta = std::min((now_ms - last_ms) /
- static_cast<double>(response_time_ms), 1.0);
+ beta = 0.5 *
+ std::min((now_ms - last_ms) / static_cast<double>(response_time_ms),
+ 1.0);
}
double bits_per_frame = static_cast<double>(current_bitrate_bps_) / 30.0;
double packets_per_frame = std::ceil(bits_per_frame / (8.0 * 1200.0));
@@ -311,21 +294,9 @@ void AimdRateControl::ChangeState(const RateControlInput& input,
void AimdRateControl::ChangeRegion(RateControlRegion region) {
rate_control_region_ = region;
- switch (rate_control_region_) {
- case kRcAboveMax:
- case kRcMaxUnknown:
- beta_ = 0.9f;
- break;
- case kRcNearMax:
- beta_ = 0.95f;
- break;
- default:
- assert(false);
- }
}
void AimdRateControl::ChangeState(RateControlState new_state) {
- came_from_state_ = rate_control_state_;
rate_control_state_ = new_state;
}
} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698