• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_
12 #define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_
13 
14 #include "webrtc/base/constructormagic.h"
15 #include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
16 
17 namespace webrtc {
18 
19 // A rate control implementation based on additive increases of
20 // bitrate when no over-use is detected and multiplicative decreases when
21 // over-uses are detected. When we think the available bandwidth has changes or
22 // is unknown, we will switch to a "slow-start mode" where we increase
23 // multiplicatively.
24 class AimdRateControl {
25  public:
26   AimdRateControl();
~AimdRateControl()27   virtual ~AimdRateControl() {}
28 
29   // Returns true if there is a valid estimate of the incoming bitrate, false
30   // otherwise.
31   bool ValidEstimate() const;
32   void SetMinBitrate(int min_bitrate_bps);
33   int64_t GetFeedbackInterval() const;
34   // Returns true if the bitrate estimate hasn't been changed for more than
35   // an RTT, or if the incoming_bitrate is more than 5% above the current
36   // estimate. Should be used to decide if we should reduce the rate further
37   // when over-using.
38   bool TimeToReduceFurther(int64_t time_now,
39                            uint32_t incoming_bitrate_bps) const;
40   uint32_t LatestEstimate() const;
41   uint32_t UpdateBandwidthEstimate(int64_t now_ms);
42   void SetRtt(int64_t rtt);
43   void Update(const RateControlInput* input, int64_t now_ms);
44   void SetEstimate(int bitrate_bps, int64_t now_ms);
45 
46  private:
47   // Update the target bitrate according based on, among other things,
48   // the current rate control state, the current target bitrate and the incoming
49   // bitrate. When in the "increase" state the bitrate will be increased either
50   // additively or multiplicatively depending on the rate control region. When
51   // in the "decrease" state the bitrate will be decreased to slightly below the
52   // incoming bitrate. When in the "hold" state the bitrate will be kept
53   // constant to allow built up queues to drain.
54   uint32_t ChangeBitrate(uint32_t current_bit_rate,
55                          uint32_t incoming_bit_rate,
56                          int64_t now_ms);
57   uint32_t MultiplicativeRateIncrease(int64_t now_ms, int64_t last_ms,
58                                       uint32_t current_bitrate_bps) const;
59   uint32_t AdditiveRateIncrease(int64_t now_ms, int64_t last_ms,
60                                 int64_t response_time_ms) const;
61   void UpdateChangePeriod(int64_t now_ms);
62   void UpdateMaxBitRateEstimate(float incoming_bit_rate_kbps);
63   void ChangeState(const RateControlInput& input, int64_t now_ms);
64   void ChangeState(RateControlState new_state);
65   void ChangeRegion(RateControlRegion region);
66 
67   uint32_t min_configured_bitrate_bps_;
68   uint32_t max_configured_bitrate_bps_;
69   uint32_t current_bitrate_bps_;
70   uint32_t max_hold_rate_bps_;
71   float avg_max_bitrate_kbps_;
72   float var_max_bitrate_kbps_;
73   RateControlState rate_control_state_;
74   RateControlRegion rate_control_region_;
75   int64_t time_last_bitrate_change_;
76   RateControlInput current_input_;
77   bool updated_;
78   int64_t time_first_incoming_estimate_;
79   bool bitrate_is_initialized_;
80   float beta_;
81   int64_t rtt_;
82   int64_t time_of_last_log_;
83   bool in_experiment_;
84 };
85 }  // namespace webrtc
86 
87 #endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_
88