1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_REMOTE_RATE_CONTROL_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_RTP_RTCP_SOURCE_REMOTE_RATE_CONTROL_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14d5d709e492b5592114ecc197516a453acfee46dfpbos@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
185f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.orgclass RemoteRateControl {
195f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org public:
20c49a3fafdc740b3790caac63b9dc267fa3393931henrik.lundin@webrtc.org  explicit RemoteRateControl(uint32_t min_bitrate_bps);
215f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  ~RemoteRateControl() {}
225f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org
235f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  void Reset();
245f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org
255f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  // Returns true if there is a valid estimate of the incoming bitrate, false
265f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  // otherwise.
275f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  bool ValidEstimate() const;
285f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org
295f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  // Returns true if the bitrate estimate hasn't been changed for more than
305f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  // an RTT, or if the incoming_bitrate is more than 5% above the current
315f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  // estimate. Should be used to decide if we should reduce the rate further
325f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  // when over-using.
335f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  bool TimeToReduceFurther(int64_t time_now,
345f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org                           unsigned int incoming_bitrate) const;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
365f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  int32_t SetConfiguredBitRates(uint32_t min_bit_rate, uint32_t max_bit_rate);
375f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  uint32_t LatestEstimate() const;
385f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  uint32_t UpdateBandwidthEstimate(int64_t now_ms);
395f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  void SetRtt(unsigned int rtt);
405f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  RateControlRegion Update(const RateControlInput* input, int64_t now_ms);
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
425f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org private:
435f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  uint32_t ChangeBitRate(uint32_t current_bit_rate,
445f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org                         uint32_t incoming_bit_rate,
455f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org                         double delay_factor,
465f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org                         int64_t now_ms);
475f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  double RateIncreaseFactor(int64_t now_ms,
485f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org                            int64_t last_ms,
495f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org                            uint32_t reaction_time_ms,
505f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org                            double noise_var) const;
515f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  void UpdateChangePeriod(int64_t now_ms);
525f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  void UpdateMaxBitRateEstimate(float incoming_bit_rate_kbps);
535f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  void ChangeState(const RateControlInput& input, int64_t now_ms);
545f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  void ChangeState(RateControlState new_state);
555f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  void ChangeRegion(RateControlRegion region);
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
575f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  uint32_t min_configured_bit_rate_;
585f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  uint32_t max_configured_bit_rate_;
595f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  uint32_t current_bit_rate_;
605f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  uint32_t max_hold_rate_;
615f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  float avg_max_bit_rate_;
625f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  float var_max_bit_rate_;
635f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  RateControlState rate_control_state_;
645f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  RateControlState came_from_state_;
655f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  RateControlRegion rate_control_region_;
665f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  int64_t last_bit_rate_change_;
675f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  RateControlInput current_input_;
685f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  bool updated_;
695f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  int64_t time_first_incoming_estimate_;
705f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  bool initialized_bit_rate_;
715f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  float avg_change_period_;
725f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  int64_t last_change_ms_;
735f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  float beta_;
745f09bcca21a6077d146ec20655311acc033de803solenberg@webrtc.org  unsigned int rtt_;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
763b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_REMOTE_RATE_CONTROL_H_
79