LCOV - code coverage report
Current view: top level - media/webrtc/trunk/webrtc/call - bitrate_allocator.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 7 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 7 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  *  Copyright (c) 2015 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             : 
      11             : #ifndef WEBRTC_CALL_BITRATE_ALLOCATOR_H_
      12             : #define WEBRTC_CALL_BITRATE_ALLOCATOR_H_
      13             : 
      14             : #include <stdint.h>
      15             : 
      16             : #include <map>
      17             : #include <utility>
      18             : #include <vector>
      19             : 
      20             : #include "webrtc/base/sequenced_task_checker.h"
      21             : 
      22             : namespace webrtc {
      23             : 
      24             : class Clock;
      25             : 
      26             : // Used by all send streams with adaptive bitrate, to get the currently
      27             : // allocated bitrate for the send stream. The current network properties are
      28             : // given at the same time, to let the send stream decide about possible loss
      29             : // protection.
      30           0 : class BitrateAllocatorObserver {
      31             :  public:
      32             :   // Returns the amount of protection used by the BitrateAllocatorObserver
      33             :   // implementation, as bitrate in bps.
      34             :   virtual uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
      35             :                                     uint8_t fraction_loss,
      36             :                                     int64_t rtt,
      37             :                                     int64_t probing_interval_ms) = 0;
      38             : 
      39             :  protected:
      40           0 :   virtual ~BitrateAllocatorObserver() {}
      41             : };
      42             : 
      43             : // Usage: this class will register multiple RtcpBitrateObserver's one at each
      44             : // RTCP module. It will aggregate the results and run one bandwidth estimation
      45             : // and push the result to the encoders via BitrateAllocatorObserver(s).
      46             : class BitrateAllocator {
      47             :  public:
      48             :   // Used to get notified when send stream limits such as the minimum send
      49             :   // bitrate and max padding bitrate is changed.
      50           0 :   class LimitObserver {
      51             :    public:
      52             :     virtual void OnAllocationLimitsChanged(
      53             :         uint32_t min_send_bitrate_bps,
      54             :         uint32_t max_padding_bitrate_bps) = 0;
      55             : 
      56             :    protected:
      57           0 :     virtual ~LimitObserver() {}
      58             :   };
      59             : 
      60             :   explicit BitrateAllocator(LimitObserver* limit_observer);
      61             :   ~BitrateAllocator();
      62             : 
      63             :   // Allocate target_bitrate across the registered BitrateAllocatorObservers.
      64             :   void OnNetworkChanged(uint32_t target_bitrate_bps,
      65             :                         uint8_t fraction_loss,
      66             :                         int64_t rtt,
      67             :                         int64_t probing_interval_ms);
      68             : 
      69             :   // Set the start and max send bitrate used by the bandwidth management.
      70             :   //
      71             :   // |observer| updates bitrates if already in use.
      72             :   // |min_bitrate_bps| = 0 equals no min bitrate.
      73             :   // |max_bitrate_bps| = 0 equals no max bitrate.
      74             :   // |enforce_min_bitrate| = 'true' will allocate at least |min_bitrate_bps| for
      75             :   //    this observer, even if the BWE is too low, 'false' will allocate 0 to
      76             :   //    the observer if BWE doesn't allow |min_bitrate_bps|.
      77             :   // Note that |observer|->OnBitrateUpdated() will be called within the scope of
      78             :   // this method with the current rtt, fraction_loss and available bitrate and
      79             :   // that the bitrate in OnBitrateUpdated will be zero if the |observer| is
      80             :   // currently not allowed to send data.
      81             :   void AddObserver(BitrateAllocatorObserver* observer,
      82             :                    uint32_t min_bitrate_bps,
      83             :                    uint32_t max_bitrate_bps,
      84             :                    uint32_t pad_up_bitrate_bps,
      85             :                    bool enforce_min_bitrate);
      86             : 
      87             :   // Removes a previously added observer, but will not trigger a new bitrate
      88             :   // allocation.
      89             :   void RemoveObserver(BitrateAllocatorObserver* observer);
      90             : 
      91             :   // Returns initial bitrate allocated for |observer|. If |observer| is not in
      92             :   // the list of added observers, a best guess is returned.
      93             :   int GetStartBitrate(BitrateAllocatorObserver* observer);
      94             : 
      95             :  private:
      96             :   // Note: All bitrates for member variables and methods are in bps.
      97             :   struct ObserverConfig {
      98           0 :     ObserverConfig(BitrateAllocatorObserver* observer,
      99             :                    uint32_t min_bitrate_bps,
     100             :                    uint32_t max_bitrate_bps,
     101             :                    uint32_t pad_up_bitrate_bps,
     102             :                    bool enforce_min_bitrate)
     103           0 :         : observer(observer),
     104             :           min_bitrate_bps(min_bitrate_bps),
     105             :           max_bitrate_bps(max_bitrate_bps),
     106             :           pad_up_bitrate_bps(pad_up_bitrate_bps),
     107             :           enforce_min_bitrate(enforce_min_bitrate),
     108             :           allocated_bitrate_bps(-1),
     109           0 :           media_ratio(1.0) {}
     110             : 
     111             :     BitrateAllocatorObserver* observer;
     112             :     uint32_t min_bitrate_bps;
     113             :     uint32_t max_bitrate_bps;
     114             :     uint32_t pad_up_bitrate_bps;
     115             :     bool enforce_min_bitrate;
     116             :     int64_t allocated_bitrate_bps;
     117             :     double media_ratio;  // Part of the total bitrate used for media [0.0, 1.0].
     118             :   };
     119             : 
     120             :   // Calculates the minimum requested send bitrate and max padding bitrate and
     121             :   // calls LimitObserver::OnAllocationLimitsChanged.
     122             :   void UpdateAllocationLimits();
     123             : 
     124             :   typedef std::vector<ObserverConfig> ObserverConfigs;
     125             :   ObserverConfigs::iterator FindObserverConfig(
     126             :       const BitrateAllocatorObserver* observer);
     127             : 
     128             :   typedef std::multimap<uint32_t, const ObserverConfig*> ObserverSortingMap;
     129             :   typedef std::map<BitrateAllocatorObserver*, int> ObserverAllocation;
     130             : 
     131             :   ObserverAllocation AllocateBitrates(uint32_t bitrate);
     132             : 
     133             :   ObserverAllocation ZeroRateAllocation();
     134             :   ObserverAllocation LowRateAllocation(uint32_t bitrate);
     135             :   ObserverAllocation NormalRateAllocation(uint32_t bitrate,
     136             :                                           uint32_t sum_min_bitrates);
     137             :   ObserverAllocation MaxRateAllocation(uint32_t bitrate,
     138             :                                        uint32_t sum_max_bitrates);
     139             : 
     140             :   uint32_t LastAllocatedBitrate(const ObserverConfig& observer_config);
     141             :   // The minimum bitrate required by this observer, including enable-hysteresis
     142             :   // if the observer is in a paused state.
     143             :   uint32_t MinBitrateWithHysteresis(const ObserverConfig& observer_config);
     144             :   // Splits |bitrate| evenly to observers already in |allocation|.
     145             :   // |include_zero_allocations| decides if zero allocations should be part of
     146             :   // the distribution or not. The allowed max bitrate is |max_multiplier| x
     147             :   // observer max bitrate.
     148             :   void DistributeBitrateEvenly(uint32_t bitrate,
     149             :                                bool include_zero_allocations,
     150             :                                int max_multiplier,
     151             :                                ObserverAllocation* allocation);
     152             :   bool EnoughBitrateForAllObservers(uint32_t bitrate,
     153             :                                     uint32_t sum_min_bitrates);
     154             : 
     155             :   rtc::SequencedTaskChecker sequenced_checker_;
     156             :   LimitObserver* const limit_observer_ GUARDED_BY(&sequenced_checker_);
     157             :   // Stored in a list to keep track of the insertion order.
     158             :   ObserverConfigs bitrate_observer_configs_ GUARDED_BY(&sequenced_checker_);
     159             :   uint32_t last_bitrate_bps_ GUARDED_BY(&sequenced_checker_);
     160             :   uint32_t last_non_zero_bitrate_bps_ GUARDED_BY(&sequenced_checker_);
     161             :   uint8_t last_fraction_loss_ GUARDED_BY(&sequenced_checker_);
     162             :   int64_t last_rtt_ GUARDED_BY(&sequenced_checker_);
     163             :   int64_t last_probing_interval_ms_ GUARDED_BY(&sequenced_checker_);
     164             :   // Number of mute events based on too low BWE, not network up/down.
     165             :   int num_pause_events_ GUARDED_BY(&sequenced_checker_);
     166             :   Clock* const clock_ GUARDED_BY(&sequenced_checker_);
     167             :   int64_t last_bwe_log_time_ GUARDED_BY(&sequenced_checker_);
     168             : };
     169             : }  // namespace webrtc
     170             : #endif  // WEBRTC_CALL_BITRATE_ALLOCATOR_H_

Generated by: LCOV version 1.13