Home | History | Annotate | Download | only in video_engine
      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 
     11 #ifndef WEBRTC_VIDEO_ENGINE_VIE_REMB_H_
     12 #define WEBRTC_VIDEO_ENGINE_VIE_REMB_H_
     13 
     14 #include <list>
     15 #include <utility>
     16 #include <vector>
     17 
     18 #include "webrtc/modules/interface/module.h"
     19 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
     20 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
     21 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     22 
     23 namespace webrtc {
     24 
     25 class CriticalSectionWrapper;
     26 class ProcessThread;
     27 class RtpRtcp;
     28 
     29 class VieRemb : public RemoteBitrateObserver {
     30  public:
     31   VieRemb();
     32   ~VieRemb();
     33 
     34   // Called to add a receive channel to include in the REMB packet.
     35   void AddReceiveChannel(RtpRtcp* rtp_rtcp);
     36 
     37   // Removes the specified channel from REMB estimate.
     38   void RemoveReceiveChannel(RtpRtcp* rtp_rtcp);
     39 
     40   // Called to add a module that can generate and send REMB RTCP.
     41   void AddRembSender(RtpRtcp* rtp_rtcp);
     42 
     43   // Removes a REMB RTCP sender.
     44   void RemoveRembSender(RtpRtcp* rtp_rtcp);
     45 
     46   // Returns true if the instance is in use, false otherwise.
     47   bool InUse() const;
     48 
     49   // Called every time there is a new bitrate estimate for a receive channel
     50   // group. This call will trigger a new RTCP REMB packet if the bitrate
     51   // estimate has decreased or if no RTCP REMB packet has been sent for
     52   // a certain time interval.
     53   // Implements RtpReceiveBitrateUpdate.
     54   virtual void OnReceiveBitrateChanged(const std::vector<unsigned int>& ssrcs,
     55                                        unsigned int bitrate);
     56 
     57  private:
     58   typedef std::list<RtpRtcp*> RtpModules;
     59 
     60   scoped_ptr<CriticalSectionWrapper> list_crit_;
     61 
     62   // The last time a REMB was sent.
     63   int64_t last_remb_time_;
     64   unsigned int last_send_bitrate_;
     65 
     66   // All RtpRtcp modules to include in the REMB packet.
     67   RtpModules receive_modules_;
     68 
     69   // All modules that can send REMB RTCP.
     70   RtpModules rtcp_sender_;
     71 
     72   // The last bitrate update.
     73   unsigned int bitrate_;
     74 };
     75 
     76 }  // namespace webrtc
     77 
     78 #endif  // WEBRTC_VIDEO_ENGINE_VIE_REMB_H_
     79