blob: 91faed544740e88a067d02d7afbe1f4d84ce3f3d [file] [log] [blame]
nissecae45d02017-04-24 05:53:20 -07001/*
2 * Copyright (c) 2017 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 */
Sebastian Jansson91bb6672018-02-21 13:02:51 +010010#include <utility>
nissecae45d02017-04-24 05:53:20 -070011
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020012#include "call/rtp_transport_controller_send.h"
Sebastian Jansson10211e92018-02-28 16:48:26 +010013#include "modules/congestion_controller/include/send_side_congestion_controller.h"
Sebastian Jansson19bea512018-03-13 19:07:46 +010014#include "modules/congestion_controller/rtp/include/send_side_congestion_controller.h"
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010015#include "rtc_base/location.h"
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010016#include "rtc_base/logging.h"
Sebastian Jansson10211e92018-02-28 16:48:26 +010017#include "rtc_base/ptr_util.h"
Sebastian Jansson19bea512018-03-13 19:07:46 +010018#include "system_wrappers/include/field_trial.h"
nissecae45d02017-04-24 05:53:20 -070019
20namespace webrtc {
Sebastian Jansson19bea512018-03-13 19:07:46 +010021namespace {
22const char kTaskQueueExperiment[] = "WebRTC-TaskQueueCongestionControl";
23using TaskQueueController = webrtc::webrtc_cc::SendSideCongestionController;
24
25bool TaskQueueExperimentEnabled() {
26 std::string trial = webrtc::field_trial::FindFullName(kTaskQueueExperiment);
27 return trial.find("Enable") == 0;
28}
29
30std::unique_ptr<SendSideCongestionControllerInterface> CreateController(
31 Clock* clock,
32 webrtc::RtcEventLog* event_log,
33 PacedSender* pacer,
34 const BitrateConstraints& bitrate_config,
35 bool task_queue_controller) {
36 if (task_queue_controller) {
37 return rtc::MakeUnique<webrtc::webrtc_cc::SendSideCongestionController>(
38 clock, event_log, pacer, bitrate_config.start_bitrate_bps,
39 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
40 }
41 auto cc = rtc::MakeUnique<webrtc::SendSideCongestionController>(
42 clock, nullptr /* observer */, event_log, pacer);
43 cc->SignalNetworkState(kNetworkDown);
44 cc->SetBweBitrates(bitrate_config.min_bitrate_bps,
45 bitrate_config.start_bitrate_bps,
46 bitrate_config.max_bitrate_bps);
47 return std::move(cc);
48}
49} // namespace
nissecae45d02017-04-24 05:53:20 -070050
51RtpTransportControllerSend::RtpTransportControllerSend(
52 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010053 webrtc::RtcEventLog* event_log,
54 const BitrateConstraints& bitrate_config)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010055 : clock_(clock),
56 pacer_(clock, &packet_router_, event_log),
Sebastian Jansson19bea512018-03-13 19:07:46 +010057 send_side_cc_(CreateController(clock,
58 event_log,
59 &pacer_,
60 bitrate_config,
61 TaskQueueExperimentEnabled())),
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010062 bitrate_configurator_(bitrate_config),
Sebastian Jansson19704ec2018-03-12 15:59:12 +010063 process_thread_(ProcessThread::Create("SendControllerThread")),
64 observer_(nullptr) {
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010065 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Jansson10211e92018-02-28 16:48:26 +010066 process_thread_->RegisterModule(send_side_cc_.get(), RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010067 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010068}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010069
70RtpTransportControllerSend::~RtpTransportControllerSend() {
71 process_thread_->Stop();
Sebastian Jansson10211e92018-02-28 16:48:26 +010072 process_thread_->DeRegisterModule(send_side_cc_.get());
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010073 process_thread_->DeRegisterModule(&pacer_);
74}
nissecae45d02017-04-24 05:53:20 -070075
Sebastian Jansson19704ec2018-03-12 15:59:12 +010076void RtpTransportControllerSend::OnNetworkChanged(uint32_t bitrate_bps,
77 uint8_t fraction_loss,
78 int64_t rtt_ms,
79 int64_t probing_interval_ms) {
80 // TODO(srte): Skip this step when old SendSideCongestionController is
81 // deprecated.
82 TargetTransferRate msg;
83 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
84 msg.target_rate = DataRate::bps(bitrate_bps);
85 msg.network_estimate.at_time = msg.at_time;
86 msg.network_estimate.bwe_period = TimeDelta::ms(probing_interval_ms);
87 uint32_t bandwidth_bps;
88 if (send_side_cc_->AvailableBandwidth(&bandwidth_bps))
89 msg.network_estimate.bandwidth = DataRate::bps(bandwidth_bps);
90 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
91 msg.network_estimate.round_trip_time = TimeDelta::ms(rtt_ms);
92 rtc::CritScope cs(&observer_crit_);
93 // We wont register as observer until we have an observer.
94 RTC_DCHECK(observer_ != nullptr);
95 observer_->OnTargetTransferRate(msg);
96}
97
nisse76e62b02017-05-31 02:24:52 -070098PacketRouter* RtpTransportControllerSend::packet_router() {
99 return &packet_router_;
100}
101
nisse76e62b02017-05-31 02:24:52 -0700102TransportFeedbackObserver*
103RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100104 return send_side_cc_.get();
nisse76e62b02017-05-31 02:24:52 -0700105}
106
107RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200108 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700109}
110
sprangdb2a9fc2017-08-09 06:42:32 -0700111const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
112 return keepalive_;
113}
114
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200115void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
116 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +0100117 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +0100118 int max_total_bitrate_bps) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100119 send_side_cc_->SetAllocatedSendBitrateLimits(
120 min_send_bitrate_bps, max_padding_bitrate_bps, max_total_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200121}
122
sprangdb2a9fc2017-08-09 06:42:32 -0700123void RtpTransportControllerSend::SetKeepAliveConfig(
124 const RtpKeepAliveConfig& config) {
125 keepalive_ = config;
126}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100127void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100128 send_side_cc_->SetPacingFactor(pacing_factor);
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100129}
130void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
131 pacer_.SetQueueTimeLimit(limit_ms);
132}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100133CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100134 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100135}
136void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
137 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100138 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100139}
140void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
141 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100142 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100143}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100144
145void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
146 TargetTransferRateObserver* observer) {
147 {
148 rtc::CritScope cs(&observer_crit_);
149 RTC_DCHECK(observer_ == nullptr);
150 observer_ = observer;
151 }
152 send_side_cc_->RegisterNetworkObserver(this);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100153}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100154void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100155 const std::string& transport_name,
156 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100157 // Check if the network route is connected.
158 if (!network_route.connected) {
159 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
160 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
161 // consider merging these two methods.
162 return;
163 }
164
165 // Check whether the network route has changed on each transport.
166 auto result =
167 network_routes_.insert(std::make_pair(transport_name, network_route));
168 auto kv = result.first;
169 bool inserted = result.second;
170 if (inserted) {
171 // No need to reset BWE if this is the first time the network connects.
172 return;
173 }
174 if (kv->second != network_route) {
175 kv->second = network_route;
176 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
177 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
178 << ": new local network id "
179 << network_route.local_network_id
180 << " new remote network id "
181 << network_route.remote_network_id
182 << " Reset bitrates to min: "
183 << bitrate_config.min_bitrate_bps
184 << " bps, start: " << bitrate_config.start_bitrate_bps
185 << " bps, max: " << bitrate_config.max_bitrate_bps
186 << " bps.";
187 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100188 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100189 network_route, bitrate_config.start_bitrate_bps,
190 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
191 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100192}
193void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100194 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
195 : kNetworkDown);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100196}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100197RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100198 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100199}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100200int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100201 return pacer_.QueueInMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100202}
203int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100204 return pacer_.FirstSentPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100205}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100206void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100207 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100208}
209void RtpTransportControllerSend::OnSentPacket(
210 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100211 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100212}
sprangdb2a9fc2017-08-09 06:42:32 -0700213
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100214void RtpTransportControllerSend::SetSdpBitrateParameters(
215 const BitrateConstraints& constraints) {
216 rtc::Optional<BitrateConstraints> updated =
217 bitrate_configurator_.UpdateWithSdpParameters(constraints);
218 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100219 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
220 updated->start_bitrate_bps,
221 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100222 } else {
223 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100224 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100225 << "nothing to update";
226 }
227}
228
229void RtpTransportControllerSend::SetClientBitratePreferences(
230 const BitrateConstraintsMask& preferences) {
231 rtc::Optional<BitrateConstraints> updated =
232 bitrate_configurator_.UpdateWithClientPreferences(preferences);
233 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100234 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
235 updated->start_bitrate_bps,
236 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100237 } else {
238 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100239 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100240 << "nothing to update";
241 }
242}
nissecae45d02017-04-24 05:53:20 -0700243} // namespace webrtc