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