aboutsummaryrefslogtreecommitdiff
path: root/webrtc/call/congestion_controller.h
blob: b77c46faa3b48ab06d01c575ae98d05e8a206389 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_CALL_CONGESTION_CONTROLLER_H_
#define WEBRTC_CALL_CONGESTION_CONTROLLER_H_

#include <vector>

#include "webrtc/base/criticalsection.h"
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/base/socket.h"
#include "webrtc/stream.h"

namespace webrtc {

class BitrateController;
class BitrateObserver;
class CallStats;
class Config;
class PacedSender;
class PacketRouter;
class ProcessThread;
class RemoteBitrateEstimator;
class RemoteEstimatorProxy;
class RtpRtcp;
class SendStatisticsProxy;
class TransportFeedbackAdapter;
class TransportFeedbackObserver;
class ViEEncoder;
class VieRemb;

class CongestionController {
 public:
  CongestionController(ProcessThread* process_thread, CallStats* call_stats,
                       BitrateObserver* bitrate_observer);
  virtual ~CongestionController();
  virtual void AddEncoder(ViEEncoder* encoder);
  virtual void RemoveEncoder(ViEEncoder* encoder);
  virtual void SetBweBitrates(int min_bitrate_bps,
                              int start_bitrate_bps,
                              int max_bitrate_bps);

  virtual void SetChannelRembStatus(bool sender,
                                    bool receiver,
                                    RtpRtcp* rtp_module);

  virtual void SignalNetworkState(NetworkState state);

  virtual BitrateController* GetBitrateController() const;
  virtual RemoteBitrateEstimator* GetRemoteBitrateEstimator(
      bool send_side_bwe) const;
  virtual int64_t GetPacerQueuingDelayMs() const;
  virtual PacedSender* pacer() const { return pacer_.get(); }
  virtual PacketRouter* packet_router() const { return packet_router_.get(); }
  virtual TransportFeedbackObserver* GetTransportFeedbackObserver();

  virtual void UpdatePacerBitrate(int bitrate_kbps,
                                  int max_bitrate_kbps,
                                  int min_bitrate_kbps);

  virtual void OnSentPacket(const rtc::SentPacket& sent_packet);

 private:
  rtc::scoped_ptr<VieRemb> remb_;
  rtc::scoped_ptr<PacketRouter> packet_router_;
  rtc::scoped_ptr<PacedSender> pacer_;
  rtc::scoped_ptr<RemoteBitrateEstimator> remote_bitrate_estimator_;
  rtc::scoped_ptr<RemoteEstimatorProxy> remote_estimator_proxy_;

  mutable rtc::CriticalSection encoder_crit_;
  std::vector<ViEEncoder*> encoders_ GUARDED_BY(encoder_crit_);

  // Registered at construct time and assumed to outlive this class.
  ProcessThread* const process_thread_;
  CallStats* const call_stats_;

  rtc::scoped_ptr<ProcessThread> pacer_thread_;

  rtc::scoped_ptr<BitrateController> bitrate_controller_;
  rtc::scoped_ptr<TransportFeedbackAdapter> transport_feedback_adapter_;
  int min_bitrate_bps_;

  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(CongestionController);
};

}  // namespace webrtc

#endif  // WEBRTC_CALL_CONGESTION_CONTROLLER_H_