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_VIE_REMB_H_
12#define WEBRTC_VIDEO_VIE_REMB_H_
13
14#include <list>
15#include <utility>
16#include <vector>
17
18#include "webrtc/base/scoped_ptr.h"
19#include "webrtc/modules/include/module.h"
20#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
21#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
22
23namespace webrtc {
24
25class CriticalSectionWrapper;
26class ProcessThread;
27class RtpRtcp;
28
29class VieRemb : public RemoteBitrateObserver {
30 public:
31  explicit VieRemb(Clock* clock);
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  Clock* const clock_;
61  rtc::scoped_ptr<CriticalSectionWrapper> list_crit_;
62
63  // The last time a REMB was sent.
64  int64_t last_remb_time_;
65  unsigned int last_send_bitrate_;
66
67  // All RtpRtcp modules to include in the REMB packet.
68  RtpModules receive_modules_;
69
70  // All modules that can send REMB RTCP.
71  RtpModules rtcp_sender_;
72
73  // The last bitrate update.
74  unsigned int bitrate_;
75};
76
77}  // namespace webrtc
78
79#endif  // WEBRTC_VIDEO_VIE_REMB_H_
80