/*
 *  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 the target bitrate has been initialized. This happens
  // either if it has been explicitly set via SetStartBitrate/SetEstimate, or if
  // we have measured a throughput.
  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 estimated_throughput 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 estimated_throughput_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 based on, among other things, the current rate
  // control state, the current target bitrate and the estimated throughput.
  // 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
  // current throughput. 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 throughput, 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 estimated_throughput_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 UpdateMaxThroughputEstimate(float estimated_throughput_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_estimated_throughput_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_throughput_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_
