| 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 fdee6df86762160adb9a9122668b85e4b94694c7..6b73864037469791a323f32e966fecf4a17eac47 100644
|
| --- a/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc
|
| +++ b/webrtc/modules/remote_bitrate_estimator/aimd_rate_control.cc
|
| @@ -133,7 +133,8 @@ void AimdRateControl::Update(const RateControlInput* input, int64_t now_ms) {
|
| void AimdRateControl::SetEstimate(int bitrate_bps, int64_t now_ms) {
|
| updated_ = true;
|
| bitrate_is_initialized_ = true;
|
| - current_bitrate_bps_ = ChangeBitrate(bitrate_bps, bitrate_bps, now_ms);
|
| + current_bitrate_bps_ = ClampBitrate(bitrate_bps, bitrate_bps);
|
| + time_last_bitrate_change_ = now_ms;
|
| }
|
|
|
| int AimdRateControl::GetNearMaxIncreaseRateBps() const {
|
| @@ -153,7 +154,7 @@ rtc::Optional<int> AimdRateControl::GetLastBitrateDecreaseBps() const {
|
| return last_decrease_;
|
| }
|
|
|
| -uint32_t AimdRateControl::ChangeBitrate(uint32_t current_bitrate_bps,
|
| +uint32_t AimdRateControl::ChangeBitrate(uint32_t new_bitrate_bps,
|
| uint32_t incoming_bitrate_bps,
|
| int64_t now_ms) {
|
| if (!updated_) {
|
| @@ -186,11 +187,11 @@ uint32_t AimdRateControl::ChangeBitrate(uint32_t current_bitrate_bps,
|
| if (rate_control_region_ == kRcNearMax) {
|
| uint32_t additive_increase_bps =
|
| AdditiveRateIncrease(now_ms, time_last_bitrate_change_);
|
| - current_bitrate_bps += additive_increase_bps;
|
| + new_bitrate_bps += additive_increase_bps;
|
| } else {
|
| uint32_t multiplicative_increase_bps = MultiplicativeRateIncrease(
|
| - now_ms, time_last_bitrate_change_, current_bitrate_bps);
|
| - current_bitrate_bps += multiplicative_increase_bps;
|
| + now_ms, time_last_bitrate_change_, new_bitrate_bps);
|
| + new_bitrate_bps += multiplicative_increase_bps;
|
| }
|
|
|
| time_last_bitrate_change_ = now_ms;
|
| @@ -198,35 +199,30 @@ uint32_t AimdRateControl::ChangeBitrate(uint32_t current_bitrate_bps,
|
|
|
| case kRcDecrease:
|
| bitrate_is_initialized_ = true;
|
| - if (incoming_bitrate_bps < min_configured_bitrate_bps_) {
|
| - current_bitrate_bps = min_configured_bitrate_bps_;
|
| - } else {
|
| - // Set bit rate to something slightly lower than max
|
| - // to get rid of any self-induced delay.
|
| - current_bitrate_bps = static_cast<uint32_t>(beta_ *
|
| - incoming_bitrate_bps + 0.5);
|
| - if (current_bitrate_bps > current_bitrate_bps_) {
|
| - // Avoid increasing the rate when over-using.
|
| - if (rate_control_region_ != kRcMaxUnknown) {
|
| - current_bitrate_bps = static_cast<uint32_t>(
|
| - beta_ * avg_max_bitrate_kbps_ * 1000 + 0.5f);
|
| - }
|
| - current_bitrate_bps = std::min(current_bitrate_bps,
|
| - current_bitrate_bps_);
|
| - }
|
| - ChangeRegion(kRcNearMax);
|
| -
|
| - if (incoming_bitrate_bps < current_bitrate_bps_) {
|
| - last_decrease_ =
|
| - rtc::Optional<int>(current_bitrate_bps_ - current_bitrate_bps);
|
| - }
|
| - if (incoming_bitrate_kbps < avg_max_bitrate_kbps_ -
|
| - 3 * std_max_bit_rate) {
|
| - avg_max_bitrate_kbps_ = -1.0f;
|
| + // Set bit rate to something slightly lower than max
|
| + // to get rid of any self-induced delay.
|
| + new_bitrate_bps =
|
| + static_cast<uint32_t>(beta_ * incoming_bitrate_bps + 0.5);
|
| + if (new_bitrate_bps > current_bitrate_bps_) {
|
| + // Avoid increasing the rate when over-using.
|
| + if (rate_control_region_ != kRcMaxUnknown) {
|
| + new_bitrate_bps = static_cast<uint32_t>(
|
| + beta_ * avg_max_bitrate_kbps_ * 1000 + 0.5f);
|
| }
|
| + new_bitrate_bps = std::min(new_bitrate_bps, current_bitrate_bps_);
|
| + }
|
| + ChangeRegion(kRcNearMax);
|
|
|
| - UpdateMaxBitRateEstimate(incoming_bitrate_kbps);
|
| + if (incoming_bitrate_bps < current_bitrate_bps_) {
|
| + last_decrease_ =
|
| + rtc::Optional<int>(current_bitrate_bps_ - new_bitrate_bps);
|
| }
|
| + if (incoming_bitrate_kbps <
|
| + avg_max_bitrate_kbps_ - 3 * std_max_bit_rate) {
|
| + avg_max_bitrate_kbps_ = -1.0f;
|
| + }
|
| +
|
| + UpdateMaxBitRateEstimate(incoming_bitrate_kbps);
|
| // Stay on hold until the pipes are cleared.
|
| ChangeState(kRcHold);
|
| time_last_bitrate_change_ = now_ms;
|
| @@ -235,17 +231,22 @@ uint32_t AimdRateControl::ChangeBitrate(uint32_t current_bitrate_bps,
|
| default:
|
| assert(false);
|
| }
|
| + return ClampBitrate(new_bitrate_bps, incoming_bitrate_bps);
|
| +}
|
| +
|
| +uint32_t AimdRateControl::ClampBitrate(uint32_t new_bitrate_bps,
|
| + uint32_t incoming_bitrate_bps) const {
|
| // Don't change the bit rate if the send side is too far off.
|
| // We allow a bit more lag at very low rates to not too easily get stuck if
|
| // the encoder produces uneven outputs.
|
| const uint32_t max_bitrate_bps =
|
| static_cast<uint32_t>(1.5f * incoming_bitrate_bps) + 10000;
|
| - if (current_bitrate_bps > current_bitrate_bps_ &&
|
| - current_bitrate_bps > max_bitrate_bps) {
|
| - current_bitrate_bps = std::max(current_bitrate_bps_, max_bitrate_bps);
|
| - time_last_bitrate_change_ = now_ms;
|
| + if (new_bitrate_bps > current_bitrate_bps_ &&
|
| + new_bitrate_bps > max_bitrate_bps) {
|
| + new_bitrate_bps = std::max(current_bitrate_bps_, max_bitrate_bps);
|
| }
|
| - return current_bitrate_bps;
|
| + new_bitrate_bps = std::max(new_bitrate_bps, min_configured_bitrate_bps_);
|
| + return new_bitrate_bps;
|
| }
|
|
|
| uint32_t AimdRateControl::MultiplicativeRateIncrease(
|
|
|