Chromium Code Reviews| 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..15371438c8949b3378a8e640a4b3b47677b24a47 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 { |
| @@ -198,35 +199,31 @@ 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. |
| + current_bitrate_bps = |
|
terelius
2017/02/10 15:21:12
Maybe rename current_bitrate_bps to new_bitrate_bp
stefan-webrtc
2017/02/13 08:22:48
Yes, great suggestion
|
| + 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); |
| - UpdateMaxBitRateEstimate(incoming_bitrate_kbps); |
| + 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; |
| + } |
| + |
| + UpdateMaxBitRateEstimate(incoming_bitrate_kbps); |
| // Stay on hold until the pipes are cleared. |
| ChangeState(kRcHold); |
| time_last_bitrate_change_ = now_ms; |
| @@ -235,17 +232,22 @@ uint32_t AimdRateControl::ChangeBitrate(uint32_t current_bitrate_bps, |
| default: |
| assert(false); |
| } |
| + return ClampBitrate(current_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( |