| /* |
| * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #ifndef MODULES_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_ |
| #define MODULES_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_ |
| |
| #include "modules/remote_bitrate_estimator/include/bwe_defines.h" |
| #include "rtc_base/constructormagic.h" |
| |
| namespace webrtc { |
| |
| // A rate control implementation based on additive increases of |
| // bitrate when no over-use is detected and multiplicative decreases when |
| // over-uses are detected. When we think the available bandwidth has changes or |
| // is unknown, we will switch to a "slow-start mode" where we increase |
| // multiplicatively. |
| class AimdRateControl { |
| public: |
| AimdRateControl(); |
| ~AimdRateControl(); |
| |
| // Returns true if there is a valid estimate of the incoming bitrate, false |
| // otherwise. |
| bool ValidEstimate() const; |
| void SetStartBitrate(int start_bitrate_bps); |
| void SetMinBitrate(int min_bitrate_bps); |
| int64_t GetFeedbackInterval() const; |
| // Returns true if the bitrate estimate hasn't been changed for more than |
| // an RTT, or if the incoming_bitrate is less than half of the current |
| // estimate. Should be used to decide if we should reduce the rate further |
| // when over-using. |
| bool TimeToReduceFurther(int64_t time_now, |
| uint32_t incoming_bitrate_bps) const; |
| uint32_t LatestEstimate() const; |
| void SetRtt(int64_t rtt); |
| uint32_t Update(const RateControlInput* input, int64_t now_ms); |
| void SetEstimate(int bitrate_bps, int64_t now_ms); |
| |
| // Returns the increase rate when used bandwidth is near the link capacity. |
| int GetNearMaxIncreaseRateBps() const; |
| // Returns the expected time between overuse signals (assuming steady state). |
| int GetExpectedBandwidthPeriodMs() const; |
| |
| private: |
| // Update the target bitrate according based on, among other things, |
| // the current rate control state, the current target bitrate and the incoming |
| // bitrate. When in the "increase" state the bitrate will be increased either |
| // additively or multiplicatively depending on the rate control region. When |
| // in the "decrease" state the bitrate will be decreased to slightly below the |
| // incoming bitrate. When in the "hold" state the bitrate will be kept |
| // constant to allow built up queues to drain. |
| uint32_t ChangeBitrate(uint32_t current_bitrate, |
| const RateControlInput& input, |
| int64_t now_ms); |
| // Clamps new_bitrate_bps to within the configured min bitrate and a linear |
| // function of the incoming bitrate, so that the new bitrate can't grow too |
| // large compared to the bitrate actually being received by the other end. |
| uint32_t ClampBitrate(uint32_t new_bitrate_bps, |
| uint32_t incoming_bitrate_bps) const; |
| uint32_t MultiplicativeRateIncrease(int64_t now_ms, |
| int64_t last_ms, |
| uint32_t current_bitrate_bps) const; |
| uint32_t AdditiveRateIncrease(int64_t now_ms, int64_t last_ms) const; |
| void UpdateChangePeriod(int64_t now_ms); |
| void UpdateMaxBitRateEstimate(float incoming_bit_rate_kbps); |
| void ChangeState(const RateControlInput& input, int64_t now_ms); |
| void ChangeRegion(RateControlRegion region); |
| |
| uint32_t min_configured_bitrate_bps_; |
| uint32_t max_configured_bitrate_bps_; |
| uint32_t current_bitrate_bps_; |
| uint32_t latest_incoming_bitrate_bps_; |
| float avg_max_bitrate_kbps_; |
| float var_max_bitrate_kbps_; |
| RateControlState rate_control_state_; |
| RateControlRegion rate_control_region_; |
| int64_t time_last_bitrate_change_; |
| int64_t time_first_incoming_estimate_; |
| bool bitrate_is_initialized_; |
| float beta_; |
| int64_t rtt_; |
| bool in_experiment_; |
| bool smoothing_experiment_; |
| absl::optional<int> last_decrease_; |
| }; |
| } // namespace webrtc |
| |
| #endif // MODULES_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_ |