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