• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
BitrateConfigurationBitrateConfiguration56     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 {
ObserverConfigurationObserverConfiguration68     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