1 /* 2 * Copyright (c) 2012 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 * Usage: this class will register multiple RtcpBitrateObserver's one at each 11 * RTCP module. It will aggregate the results and run one bandwidth estimation 12 * and push the result to the encoder via VideoEncoderCallback. 13 */ 14 15 #ifndef WEBRTC_MODULES_BITRATE_CONTROLLER_BITRATE_CONTROLLER_IMPL_H_ 16 #define WEBRTC_MODULES_BITRATE_CONTROLLER_BITRATE_CONTROLLER_IMPL_H_ 17 18 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" 19 20 #include <list> 21 #include <map> 22 #include <utility> 23 24 #include "webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h" 25 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" 26 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 27 28 namespace webrtc { 29 30 class BitrateControllerImpl : public BitrateController { 31 public: 32 BitrateControllerImpl(Clock* clock, bool enforce_min_bitrate); 33 virtual ~BitrateControllerImpl(); 34 35 virtual bool AvailableBandwidth(uint32_t* bandwidth) const OVERRIDE; 36 37 virtual RtcpBandwidthObserver* CreateRtcpBandwidthObserver() OVERRIDE; 38 39 virtual void SetBitrateObserver(BitrateObserver* observer, 40 const uint32_t start_bitrate, 41 const uint32_t min_bitrate, 42 const uint32_t max_bitrate) OVERRIDE; 43 44 virtual void RemoveBitrateObserver(BitrateObserver* observer) OVERRIDE; 45 46 virtual void EnforceMinBitrate(bool enforce_min_bitrate) OVERRIDE; 47 virtual void SetReservedBitrate(uint32_t reserved_bitrate_bps) OVERRIDE; 48 49 virtual int32_t TimeUntilNextProcess() OVERRIDE; 50 virtual int32_t Process() OVERRIDE; 51 52 private: 53 class RtcpBandwidthObserverImpl; 54 55 struct BitrateConfiguration { 56 BitrateConfiguration(uint32_t start_bitrate, 57 uint32_t min_bitrate, 58 uint32_t max_bitrate) 59 : start_bitrate_(start_bitrate), 60 min_bitrate_(min_bitrate), 61 max_bitrate_(max_bitrate) { 62 } 63 uint32_t start_bitrate_; 64 uint32_t min_bitrate_; 65 uint32_t max_bitrate_; 66 }; 67 struct ObserverConfiguration { 68 ObserverConfiguration(BitrateObserver* observer, 69 uint32_t bitrate) 70 : observer_(observer), 71 min_bitrate_(bitrate) { 72 } 73 BitrateObserver* observer_; 74 uint32_t min_bitrate_; 75 }; 76 typedef std::pair<BitrateObserver*, BitrateConfiguration*> 77 BitrateObserverConfiguration; 78 typedef std::list<BitrateObserverConfiguration> BitrateObserverConfList; 79 80 void UpdateMinMaxBitrate() EXCLUSIVE_LOCKS_REQUIRED(*critsect_); 81 82 // Called by BitrateObserver's direct from the RTCP module. 83 void OnReceivedEstimatedBitrate(const uint32_t bitrate); 84 85 void OnReceivedRtcpReceiverReport(const uint8_t fraction_loss, 86 const uint32_t rtt, 87 const int number_of_packets, 88 const uint32_t now_ms); 89 90 void MaybeTriggerOnNetworkChanged() EXCLUSIVE_LOCKS_REQUIRED(*critsect_); 91 92 void OnNetworkChanged(const uint32_t bitrate, 93 const uint8_t fraction_loss, // 0 - 255. 94 const uint32_t rtt) 95 EXCLUSIVE_LOCKS_REQUIRED(*critsect_); 96 97 void NormalRateAllocation(uint32_t bitrate, 98 uint8_t fraction_loss, 99 uint32_t rtt, 100 uint32_t sum_min_bitrates) 101 EXCLUSIVE_LOCKS_REQUIRED(*critsect_); 102 103 void LowRateAllocation(uint32_t bitrate, 104 uint8_t fraction_loss, 105 uint32_t rtt, 106 uint32_t sum_min_bitrates) 107 EXCLUSIVE_LOCKS_REQUIRED(*critsect_); 108 109 typedef std::multimap<uint32_t, ObserverConfiguration*> ObserverSortingMap; 110 111 BitrateObserverConfList::iterator FindObserverConfigurationPair( 112 const BitrateObserver* observer) EXCLUSIVE_LOCKS_REQUIRED(*critsect_); 113 114 // Used by process thread. 115 Clock* clock_; 116 uint32_t last_bitrate_update_ms_; 117 118 CriticalSectionWrapper* critsect_; 119 SendSideBandwidthEstimation bandwidth_estimation_ GUARDED_BY(*critsect_); 120 BitrateObserverConfList bitrate_observers_ GUARDED_BY(*critsect_); 121 bool enforce_min_bitrate_ GUARDED_BY(*critsect_); 122 uint32_t reserved_bitrate_bps_ GUARDED_BY(*critsect_); 123 124 uint32_t last_bitrate_bps_ GUARDED_BY(*critsect_); 125 uint8_t last_fraction_loss_ GUARDED_BY(*critsect_); 126 uint32_t last_rtt_ms_ GUARDED_BY(*critsect_); 127 bool last_enforce_min_bitrate_ GUARDED_BY(*critsect_); 128 bool bitrate_observers_modified_ GUARDED_BY(*critsect_); 129 uint32_t last_reserved_bitrate_bps_ GUARDED_BY(*critsect_); 130 131 DISALLOW_IMPLICIT_CONSTRUCTORS(BitrateControllerImpl); 132 }; 133 } // namespace webrtc 134 #endif // WEBRTC_MODULES_BITRATE_CONTROLLER_BITRATE_CONTROLLER_IMPL_H_ 135