19ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org/*
29ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
39ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org *
49ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org *  Use of this source code is governed by a BSD-style license
59ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org *  that can be found in the LICENSE file in the root of the source
69ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org *  tree. An additional intellectual property rights grant can be found
79ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org *  in the file PATENTS.  All contributing project authors may
89ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
99ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org */
109ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org
110c478b3d75be3c026e68f03a11cb558c3655c926mflodman#include "webrtc/call/congestion_controller.h"
129ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org
13a50e6f073deecfd9004e6e4946eabd8c34621608stefan@webrtc.org#include "webrtc/base/checks.h"
147c704b82893bbe7fc206b004fb9dfe6e69a986efPeter Boström#include "webrtc/base/logging.h"
1538344ed2806c8fed60d67d280ca44c32e36707c0pbos@webrtc.org#include "webrtc/base/thread_annotations.h"
1629b2219914a059fe5164c312e7cc6d1bf0b4e610andresp@webrtc.org#include "webrtc/common.h"
170e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
180b9e29c87da2d9c1a3792d2c87197b0688b68e4eHenrik Kjellander#include "webrtc/modules/pacing/paced_sender.h"
190b9e29c87da2d9c1a3792d2c87197b0688b68e4eHenrik Kjellander#include "webrtc/modules/pacing/packet_router.h"
20867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang#include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h"
21468e62a97426a8d001e9187f3ca1d1e43f80b970Erik Språng#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
22468e62a97426a8d001e9187f3ca1d1e43f80b970Erik Språng#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h"
236b8d3551681f40b880507cecc88f478a12383cc7Erik Språng#include "webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h"
245e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include "webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h"
25ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
26ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/utility/include/process_thread.h"
2798f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
287623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#include "webrtc/video/call_stats.h"
297623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#include "webrtc/video/payload_router.h"
307623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#include "webrtc/video/vie_encoder.h"
317623ce4aeb9130c937ba5836490cbb3a35679e79Peter Boström#include "webrtc/video/vie_remb.h"
32a50e6f073deecfd9004e6e4946eabd8c34621608stefan@webrtc.org#include "webrtc/voice_engine/include/voe_video_sync.h"
339ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org
349ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.orgnamespace webrtc {
35a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.orgnamespace {
36a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
375ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.orgstatic const uint32_t kTimeOffsetSwitchThreshold = 30;
385ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org
39a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.orgclass WrappingBitrateEstimator : public RemoteBitrateEstimator {
40a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org public:
41ef35f069e739feaae16fdfcc815d7af5cb05e9aepbos  WrappingBitrateEstimator(RemoteBitrateObserver* observer, Clock* clock)
42a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org      : observer_(observer),
43a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org        clock_(clock),
44a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org        crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
454fbd145dcefd23169a9b1612d5ca92dace8196d6stefan        rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)),
465ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org        using_absolute_send_time_(false),
474fbd145dcefd23169a9b1612d5ca92dace8196d6stefan        packets_since_absolute_send_time_(0),
484fbd145dcefd23169a9b1612d5ca92dace8196d6stefan        min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps) {}
49a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
501295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org  virtual ~WrappingBitrateEstimator() {}
511295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org
5214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void IncomingPacket(int64_t arrival_time_ms,
5314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                      size_t payload_size,
54ff4ea9310e981da6292fb044cff9eeefd986cf2bStefan Holmer                      const RTPHeader& header,
55ff4ea9310e981da6292fb044cff9eeefd986cf2bStefan Holmer                      bool was_paced) override {
56a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org    CriticalSectionScoped cs(crit_sect_.get());
57a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org    PickEstimatorFromHeader(header);
58ff4ea9310e981da6292fb044cff9eeefd986cf2bStefan Holmer    rbe_->IncomingPacket(arrival_time_ms, payload_size, header, was_paced);
59a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  }
60a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
6114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int32_t Process() override {
621295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org    CriticalSectionScoped cs(crit_sect_.get());
631295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org    return rbe_->Process();
64a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  }
65a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
6614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int64_t TimeUntilNextProcess() override {
671295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org    CriticalSectionScoped cs(crit_sect_.get());
681295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org    return rbe_->TimeUntilNextProcess();
69a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  }
70a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
712328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override {
72a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org    CriticalSectionScoped cs(crit_sect_.get());
732328a94ec7ee545a26e8220c5ae157e1b3b5144fstefan    rbe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
74a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  }
75a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
7614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void RemoveStream(unsigned int ssrc) override {
77a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org    CriticalSectionScoped cs(crit_sect_.get());
78a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org    rbe_->RemoveStream(ssrc);
79a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  }
80a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
8114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  bool LatestEstimate(std::vector<unsigned int>* ssrcs,
8214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                      unsigned int* bitrate_bps) const override {
83a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org    CriticalSectionScoped cs(crit_sect_.get());
84a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org    return rbe_->LatestEstimate(ssrcs, bitrate_bps);
85a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  }
86a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
8714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  bool GetStats(ReceiveBandwidthEstimatorStats* output) const override {
881f64f067840212b3e5b67a0d6a50bcd805b5bc1ajiayl@webrtc.org    CriticalSectionScoped cs(crit_sect_.get());
891f64f067840212b3e5b67a0d6a50bcd805b5bc1ajiayl@webrtc.org    return rbe_->GetStats(output);
901f64f067840212b3e5b67a0d6a50bcd805b5bc1ajiayl@webrtc.org  }
911f64f067840212b3e5b67a0d6a50bcd805b5bc1ajiayl@webrtc.org
924fbd145dcefd23169a9b1612d5ca92dace8196d6stefan  void SetMinBitrate(int min_bitrate_bps) {
934fbd145dcefd23169a9b1612d5ca92dace8196d6stefan    CriticalSectionScoped cs(crit_sect_.get());
944fbd145dcefd23169a9b1612d5ca92dace8196d6stefan    rbe_->SetMinBitrate(min_bitrate_bps);
954fbd145dcefd23169a9b1612d5ca92dace8196d6stefan    min_bitrate_bps_ = min_bitrate_bps;
964fbd145dcefd23169a9b1612d5ca92dace8196d6stefan  }
974fbd145dcefd23169a9b1612d5ca92dace8196d6stefan
98a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org private:
99a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org  void PickEstimatorFromHeader(const RTPHeader& header)
100a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org      EXCLUSIVE_LOCKS_REQUIRED(crit_sect_.get()) {
1015ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org    if (header.extension.hasAbsoluteSendTime) {
1025ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org      // If we see AST in header, switch RBE strategy immediately.
1035ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org      if (!using_absolute_send_time_) {
1045574dacd1f83d8ac83458d27e54be6507f3a06a4mflodman@webrtc.org        LOG(LS_INFO) <<
1055574dacd1f83d8ac83458d27e54be6507f3a06a4mflodman@webrtc.org            "WrappingBitrateEstimator: Switching to absolute send time RBE.";
1065ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org        using_absolute_send_time_ = true;
107a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org        PickEstimator();
1085ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org      }
1095ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org      packets_since_absolute_send_time_ = 0;
1105ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org    } else {
1115ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org      // When we don't see AST, wait for a few packets before going back to TOF.
1125ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org      if (using_absolute_send_time_) {
1135ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org        ++packets_since_absolute_send_time_;
1145ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org        if (packets_since_absolute_send_time_ >= kTimeOffsetSwitchThreshold) {
1155574dacd1f83d8ac83458d27e54be6507f3a06a4mflodman@webrtc.org          LOG(LS_INFO) << "WrappingBitrateEstimator: Switching to transmission "
1165574dacd1f83d8ac83458d27e54be6507f3a06a4mflodman@webrtc.org                       << "time offset RBE.";
1175ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org          using_absolute_send_time_ = false;
118a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org          PickEstimator();
1195ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org        }
1205ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org      }
1215ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org    }
1225ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org  }
1235ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org
124a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org  // Instantiate RBE for Time Offset or Absolute Send Time extensions.
125a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org  void PickEstimator() EXCLUSIVE_LOCKS_REQUIRED(crit_sect_.get()) {
126a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org    if (using_absolute_send_time_) {
1274fbd145dcefd23169a9b1612d5ca92dace8196d6stefan      rbe_.reset(new RemoteBitrateEstimatorAbsSendTime(observer_, clock_));
128a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org    } else {
1294fbd145dcefd23169a9b1612d5ca92dace8196d6stefan      rbe_.reset(new RemoteBitrateEstimatorSingleStream(observer_, clock_));
130a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org    }
1314fbd145dcefd23169a9b1612d5ca92dace8196d6stefan    rbe_->SetMinBitrate(min_bitrate_bps_);
132a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org  }
133a16147c03726e54b2ecb1e48c7171a33d83a5261stefan@webrtc.org
134a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  RemoteBitrateObserver* observer_;
135a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org  Clock* clock_;
13600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> crit_sect_;
13700b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RemoteBitrateEstimator> rbe_;
1385ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org  bool using_absolute_send_time_;
1395ab756703ea32f2c2ff9878d6eae628c7380bc14pbos@webrtc.org  uint32_t packets_since_absolute_send_time_;
1404fbd145dcefd23169a9b1612d5ca92dace8196d6stefan  int min_bitrate_bps_;
141a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org
1423c089d751ede283e21e186885eaf705c3257ccd2henrikg  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WrappingBitrateEstimator);
143a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org};
144867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang
145a6db54d4c9a2bfc703bc208eb5cbc19505e9cef3solenberg@webrtc.org}  // namespace
1469ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org
1470c478b3d75be3c026e68f03a11cb558c3655c926mflodmanCongestionController::CongestionController(ProcessThread* process_thread,
1480e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman                                           CallStats* call_stats,
1490e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman                                           BitrateObserver* bitrate_observer)
150d3c944755ec546f46d5bdd84bff359fe6c4639e9Peter Boström    : remb_(new VieRemb(Clock::GetRealTimeClock())),
151e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer      packet_router_(new PacketRouter()),
152e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer      pacer_(new PacedSender(Clock::GetRealTimeClock(),
153e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer                             packet_router_.get(),
154e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer                             BitrateController::kDefaultStartBitrateKbps,
155e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer                             PacedSender::kDefaultPaceMultiplier *
156e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer                                 BitrateController::kDefaultStartBitrateKbps,
157e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer                             0)),
1586b8d3551681f40b880507cecc88f478a12383cc7Erik Språng      remote_bitrate_estimator_(
1596b8d3551681f40b880507cecc88f478a12383cc7Erik Språng          new WrappingBitrateEstimator(remb_.get(), Clock::GetRealTimeClock())),
1606b8d3551681f40b880507cecc88f478a12383cc7Erik Språng      remote_estimator_proxy_(
1616b8d3551681f40b880507cecc88f478a12383cc7Erik Språng          new RemoteEstimatorProxy(Clock::GetRealTimeClock(),
1626b8d3551681f40b880507cecc88f478a12383cc7Erik Språng                                   packet_router_.get())),
163e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer      process_thread_(process_thread),
164e37870297fc45f1253dff4b1c59c85a50d2a8a97mflodman      call_stats_(call_stats),
165847855b865987524be768c7771959f927db25808stefan      pacer_thread_(ProcessThread::Create("PacerThread")),
166e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer      // Constructed last as this object calls the provided callback on
167e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer      // construction.
168e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer      bitrate_controller_(
169e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer          BitrateController::CreateBitrateController(Clock::GetRealTimeClock(),
1700e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman                                                     bitrate_observer)),
1714fbd145dcefd23169a9b1612d5ca92dace8196d6stefan      min_bitrate_bps_(RemoteBitrateEstimator::kDefaultMinBitrateBps) {
1721295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org  call_stats_->RegisterStatsObserver(remote_bitrate_estimator_.get());
17344caf01c34d4fddec039f917c83fed7e0ce977b2andresp@webrtc.org
174e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer  pacer_thread_->RegisterModule(pacer_.get());
175e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer  pacer_thread_->Start();
176e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer
1776b8d3551681f40b880507cecc88f478a12383cc7Erik Språng  process_thread->RegisterModule(remote_estimator_proxy_.get());
1781295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org  process_thread->RegisterModule(remote_bitrate_estimator_.get());
17944caf01c34d4fddec039f917c83fed7e0ce977b2andresp@webrtc.org  process_thread->RegisterModule(bitrate_controller_.get());
18049888ce42858e308c7b0575697f06e2483a34daepwestin@webrtc.org}
1819ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org
1820c478b3d75be3c026e68f03a11cb558c3655c926mflodmanCongestionController::~CongestionController() {
183e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer  pacer_thread_->Stop();
184e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer  pacer_thread_->DeRegisterModule(pacer_.get());
18544caf01c34d4fddec039f917c83fed7e0ce977b2andresp@webrtc.org  process_thread_->DeRegisterModule(bitrate_controller_.get());
1861295dc6a237a7c2d2cb0dbfd53c57babf1034901andresp@webrtc.org  process_thread_->DeRegisterModule(remote_bitrate_estimator_.get());
1876b8d3551681f40b880507cecc88f478a12383cc7Erik Språng  process_thread_->DeRegisterModule(remote_estimator_proxy_.get());
18844caf01c34d4fddec039f917c83fed7e0ce977b2andresp@webrtc.org  call_stats_->DeregisterStatsObserver(remote_bitrate_estimator_.get());
1896b8d3551681f40b880507cecc88f478a12383cc7Erik Språng  if (transport_feedback_adapter_.get())
1906b8d3551681f40b880507cecc88f478a12383cc7Erik Språng    call_stats_->DeregisterStatsObserver(transport_feedback_adapter_.get());
19191d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg  RTC_DCHECK(!remb_->InUse());
192949c2f04b4156095090e02f3f13613aadacce88dmflodman  RTC_DCHECK(encoders_.empty());
193a50e6f073deecfd9004e6e4946eabd8c34621608stefan@webrtc.org}
194a50e6f073deecfd9004e6e4946eabd8c34621608stefan@webrtc.org
1950c478b3d75be3c026e68f03a11cb558c3655c926mflodmanvoid CongestionController::AddEncoder(ViEEncoder* encoder) {
196949c2f04b4156095090e02f3f13613aadacce88dmflodman  rtc::CritScope lock(&encoder_crit_);
197949c2f04b4156095090e02f3f13613aadacce88dmflodman  encoders_.push_back(encoder);
198949c2f04b4156095090e02f3f13613aadacce88dmflodman}
199949c2f04b4156095090e02f3f13613aadacce88dmflodman
2000c478b3d75be3c026e68f03a11cb558c3655c926mflodmanvoid CongestionController::RemoveEncoder(ViEEncoder* encoder) {
201949c2f04b4156095090e02f3f13613aadacce88dmflodman  rtc::CritScope lock(&encoder_crit_);
202949c2f04b4156095090e02f3f13613aadacce88dmflodman  for (auto it = encoders_.begin(); it != encoders_.end(); ++it) {
203949c2f04b4156095090e02f3f13613aadacce88dmflodman    if (*it == encoder) {
204949c2f04b4156095090e02f3f13613aadacce88dmflodman      encoders_.erase(it);
205949c2f04b4156095090e02f3f13613aadacce88dmflodman      return;
206949c2f04b4156095090e02f3f13613aadacce88dmflodman    }
207949c2f04b4156095090e02f3f13613aadacce88dmflodman  }
208a50e6f073deecfd9004e6e4946eabd8c34621608stefan@webrtc.org}
209a50e6f073deecfd9004e6e4946eabd8c34621608stefan@webrtc.org
2100c478b3d75be3c026e68f03a11cb558c3655c926mflodmanvoid CongestionController::SetBweBitrates(int min_bitrate_bps,
2110c478b3d75be3c026e68f03a11cb558c3655c926mflodman                                          int start_bitrate_bps,
2120c478b3d75be3c026e68f03a11cb558c3655c926mflodman                                          int max_bitrate_bps) {
2134fbd145dcefd23169a9b1612d5ca92dace8196d6stefan  if (start_bitrate_bps > 0)
2144fbd145dcefd23169a9b1612d5ca92dace8196d6stefan    bitrate_controller_->SetStartBitrate(start_bitrate_bps);
2154fbd145dcefd23169a9b1612d5ca92dace8196d6stefan  bitrate_controller_->SetMinMaxBitrate(min_bitrate_bps, max_bitrate_bps);
2164fbd145dcefd23169a9b1612d5ca92dace8196d6stefan  if (remote_bitrate_estimator_.get())
2174fbd145dcefd23169a9b1612d5ca92dace8196d6stefan    remote_bitrate_estimator_->SetMinBitrate(min_bitrate_bps);
2184fbd145dcefd23169a9b1612d5ca92dace8196d6stefan  if (transport_feedback_adapter_.get())
2194fbd145dcefd23169a9b1612d5ca92dace8196d6stefan    transport_feedback_adapter_->GetBitrateEstimator()->SetMinBitrate(
2204fbd145dcefd23169a9b1612d5ca92dace8196d6stefan        min_bitrate_bps);
2214fbd145dcefd23169a9b1612d5ca92dace8196d6stefan  min_bitrate_bps_ = min_bitrate_bps;
2224fbd145dcefd23169a9b1612d5ca92dace8196d6stefan}
2234fbd145dcefd23169a9b1612d5ca92dace8196d6stefan
2240c478b3d75be3c026e68f03a11cb558c3655c926mflodmanBitrateController* CongestionController::GetBitrateController() const {
225cb89c6f91491e683e47e5505536c154c905d5194bjornv@webrtc.org  return bitrate_controller_.get();
226f72881406fba86adc2d649bb1caee0d5604f9339stefan@webrtc.org}
227f72881406fba86adc2d649bb1caee0d5604f9339stefan@webrtc.org
2280c478b3d75be3c026e68f03a11cb558c3655c926mflodmanRemoteBitrateEstimator* CongestionController::GetRemoteBitrateEstimator(
229a20de2030f7f3a3c5e252ccc76a467109f5a93dcmflodman    bool send_side_bwe) const {
230a20de2030f7f3a3c5e252ccc76a467109f5a93dcmflodman
231a20de2030f7f3a3c5e252ccc76a467109f5a93dcmflodman  if (send_side_bwe)
232a20de2030f7f3a3c5e252ccc76a467109f5a93dcmflodman    return remote_estimator_proxy_.get();
233a20de2030f7f3a3c5e252ccc76a467109f5a93dcmflodman  else
234a20de2030f7f3a3c5e252ccc76a467109f5a93dcmflodman    return remote_bitrate_estimator_.get();
2359354cc965c04a0c79ea36622043751596a6fd015stefan@webrtc.org}
2369354cc965c04a0c79ea36622043751596a6fd015stefan@webrtc.org
2370c478b3d75be3c026e68f03a11cb558c3655c926mflodmanTransportFeedbackObserver*
2380c478b3d75be3c026e68f03a11cb558c3655c926mflodmanCongestionController::GetTransportFeedbackObserver() {
239949c2f04b4156095090e02f3f13613aadacce88dmflodman  if (transport_feedback_adapter_.get() == nullptr) {
240949c2f04b4156095090e02f3f13613aadacce88dmflodman    transport_feedback_adapter_.reset(new TransportFeedbackAdapter(
241949c2f04b4156095090e02f3f13613aadacce88dmflodman        bitrate_controller_->CreateRtcpBandwidthObserver(),
242949c2f04b4156095090e02f3f13613aadacce88dmflodman        Clock::GetRealTimeClock(), process_thread_));
243949c2f04b4156095090e02f3f13613aadacce88dmflodman    transport_feedback_adapter_->SetBitrateEstimator(
244949c2f04b4156095090e02f3f13613aadacce88dmflodman        new RemoteBitrateEstimatorAbsSendTime(
245949c2f04b4156095090e02f3f13613aadacce88dmflodman            transport_feedback_adapter_.get(), Clock::GetRealTimeClock()));
246949c2f04b4156095090e02f3f13613aadacce88dmflodman    transport_feedback_adapter_->GetBitrateEstimator()->SetMinBitrate(
247949c2f04b4156095090e02f3f13613aadacce88dmflodman        min_bitrate_bps_);
248949c2f04b4156095090e02f3f13613aadacce88dmflodman    call_stats_->RegisterStatsObserver(transport_feedback_adapter_.get());
249949c2f04b4156095090e02f3f13613aadacce88dmflodman  }
250949c2f04b4156095090e02f3f13613aadacce88dmflodman  return transport_feedback_adapter_.get();
251949c2f04b4156095090e02f3f13613aadacce88dmflodman}
252949c2f04b4156095090e02f3f13613aadacce88dmflodman
2530e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodmanvoid CongestionController::UpdatePacerBitrate(int bitrate_kbps,
2540e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman                                              int max_bitrate_kbps,
2550e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman                                              int min_bitrate_kbps) {
2560e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman  pacer_->UpdateBitrate(bitrate_kbps, max_bitrate_kbps, min_bitrate_kbps);
2570e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman}
2580e7e259ebd69993bb5670a991f43aa1b06c9bf9emflodman
2590c478b3d75be3c026e68f03a11cb558c3655c926mflodmanint64_t CongestionController::GetPacerQueuingDelayMs() const {
260e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer  return pacer_->QueueInMs();
261e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer}
262e59041672283a28bde0b043c0c2bc198272f82e1Stefan Holmer
263e37870297fc45f1253dff4b1c59c85a50d2a8a97mflodman// TODO(mflodman): Move out of this class.
2640c478b3d75be3c026e68f03a11cb558c3655c926mflodmanvoid CongestionController::SetChannelRembStatus(bool sender,
2650c478b3d75be3c026e68f03a11cb558c3655c926mflodman                                                bool receiver,
2660c478b3d75be3c026e68f03a11cb558c3655c926mflodman                                                RtpRtcp* rtp_module) {
267e37870297fc45f1253dff4b1c59c85a50d2a8a97mflodman  rtp_module->SetREMBStatus(sender || receiver);
2689ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org  if (sender) {
2699ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org    remb_->AddRembSender(rtp_module);
2709ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org  } else {
2719ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org    remb_->RemoveRembSender(rtp_module);
2729ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org  }
2739ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org  if (receiver) {
2749ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org    remb_->AddReceiveChannel(rtp_module);
2759ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org  } else {
2769ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org    remb_->RemoveReceiveChannel(rtp_module);
2779ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org  }
2789ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org}
279792f1a14e2b62382c5c6080d0b8fdc5c89d27bc6stefan@webrtc.org
2800c478b3d75be3c026e68f03a11cb558c3655c926mflodmanvoid CongestionController::SignalNetworkState(NetworkState state) {
281457a61db616f17be54b32bc7d8bb781d53396f69stefan  if (state == kNetworkUp) {
282457a61db616f17be54b32bc7d8bb781d53396f69stefan    pacer_->Resume();
283457a61db616f17be54b32bc7d8bb781d53396f69stefan  } else {
284457a61db616f17be54b32bc7d8bb781d53396f69stefan    pacer_->Pause();
285457a61db616f17be54b32bc7d8bb781d53396f69stefan  }
286457a61db616f17be54b32bc7d8bb781d53396f69stefan}
287457a61db616f17be54b32bc7d8bb781d53396f69stefan
2880c478b3d75be3c026e68f03a11cb558c3655c926mflodmanvoid CongestionController::OnSentPacket(const rtc::SentPacket& sent_packet) {
289c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan  if (transport_feedback_adapter_) {
290bbe876f0d30ec806c7c4a12629eb1f19ab45fb86stefan    transport_feedback_adapter_->OnSentPacket(sent_packet.packet_id,
291bbe876f0d30ec806c7c4a12629eb1f19ab45fb86stefan                                              sent_packet.send_time_ms);
292c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan  }
293c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan}
2949ec883e8bd334acfc246741f7a2cca3e55d7f5b2mflodman@webrtc.org}  // namespace webrtc
295