blob: 23d8e0ae9d85a4b0e23f0f700238e878d03b4067 [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) {
Sebastian Jansson4e140da2018-04-13 13:25:19 +020037 RTC_LOG(LS_INFO) << "Using TaskQueue based SSCC";
Sebastian Jansson19bea512018-03-13 19:07:46 +010038 return rtc::MakeUnique<webrtc::webrtc_cc::SendSideCongestionController>(
39 clock, event_log, pacer, bitrate_config.start_bitrate_bps,
40 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
41 }
Sebastian Jansson4e140da2018-04-13 13:25:19 +020042 RTC_LOG(LS_INFO) << "Using Legacy SSCC";
Sebastian Jansson19bea512018-03-13 19:07:46 +010043 auto cc = rtc::MakeUnique<webrtc::SendSideCongestionController>(
44 clock, nullptr /* observer */, event_log, pacer);
45 cc->SignalNetworkState(kNetworkDown);
46 cc->SetBweBitrates(bitrate_config.min_bitrate_bps,
47 bitrate_config.start_bitrate_bps,
48 bitrate_config.max_bitrate_bps);
49 return std::move(cc);
50}
51} // namespace
nissecae45d02017-04-24 05:53:20 -070052
53RtpTransportControllerSend::RtpTransportControllerSend(
54 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010055 webrtc::RtcEventLog* event_log,
56 const BitrateConstraints& bitrate_config)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010057 : clock_(clock),
58 pacer_(clock, &packet_router_, event_log),
Sebastian Jansson317a5222018-03-16 15:36:37 +010059 bitrate_configurator_(bitrate_config),
60 process_thread_(ProcessThread::Create("SendControllerThread")),
61 observer_(nullptr),
Sebastian Jansson19bea512018-03-13 19:07:46 +010062 send_side_cc_(CreateController(clock,
63 event_log,
64 &pacer_,
65 bitrate_config,
Sebastian Jansson317a5222018-03-16 15:36:37 +010066 TaskQueueExperimentEnabled())) {
Sebastian Jansson947120f2018-03-26 14:56:37 +020067 send_side_cc_ptr_ = send_side_cc_.get();
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010068 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Jansson10211e92018-02-28 16:48:26 +010069 process_thread_->RegisterModule(send_side_cc_.get(), RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010070 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010071}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010072
73RtpTransportControllerSend::~RtpTransportControllerSend() {
74 process_thread_->Stop();
Sebastian Jansson10211e92018-02-28 16:48:26 +010075 process_thread_->DeRegisterModule(send_side_cc_.get());
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010076 process_thread_->DeRegisterModule(&pacer_);
77}
nissecae45d02017-04-24 05:53:20 -070078
Sebastian Jansson19704ec2018-03-12 15:59:12 +010079void RtpTransportControllerSend::OnNetworkChanged(uint32_t bitrate_bps,
80 uint8_t fraction_loss,
81 int64_t rtt_ms,
82 int64_t probing_interval_ms) {
83 // TODO(srte): Skip this step when old SendSideCongestionController is
84 // deprecated.
85 TargetTransferRate msg;
86 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
87 msg.target_rate = DataRate::bps(bitrate_bps);
88 msg.network_estimate.at_time = msg.at_time;
89 msg.network_estimate.bwe_period = TimeDelta::ms(probing_interval_ms);
90 uint32_t bandwidth_bps;
Sebastian Jansson947120f2018-03-26 14:56:37 +020091 if (send_side_cc_ptr_->AvailableBandwidth(&bandwidth_bps))
Sebastian Jansson19704ec2018-03-12 15:59:12 +010092 msg.network_estimate.bandwidth = DataRate::bps(bandwidth_bps);
93 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
94 msg.network_estimate.round_trip_time = TimeDelta::ms(rtt_ms);
95 rtc::CritScope cs(&observer_crit_);
96 // We wont register as observer until we have an observer.
97 RTC_DCHECK(observer_ != nullptr);
98 observer_->OnTargetTransferRate(msg);
99}
100
nisse76e62b02017-05-31 02:24:52 -0700101PacketRouter* RtpTransportControllerSend::packet_router() {
102 return &packet_router_;
103}
104
nisse76e62b02017-05-31 02:24:52 -0700105TransportFeedbackObserver*
106RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100107 return send_side_cc_.get();
nisse76e62b02017-05-31 02:24:52 -0700108}
109
110RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200111 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700112}
113
sprangdb2a9fc2017-08-09 06:42:32 -0700114const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
115 return keepalive_;
116}
117
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200118void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
119 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +0100120 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +0100121 int max_total_bitrate_bps) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100122 send_side_cc_->SetAllocatedSendBitrateLimits(
123 min_send_bitrate_bps, max_padding_bitrate_bps, max_total_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200124}
125
sprangdb2a9fc2017-08-09 06:42:32 -0700126void RtpTransportControllerSend::SetKeepAliveConfig(
127 const RtpKeepAliveConfig& config) {
128 keepalive_ = config;
129}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100130void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100131 send_side_cc_->SetPacingFactor(pacing_factor);
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100132}
133void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
134 pacer_.SetQueueTimeLimit(limit_ms);
135}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100136CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100137 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100138}
139void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
140 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100141 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100142}
143void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
144 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100145 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100146}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100147
148void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
149 TargetTransferRateObserver* observer) {
150 {
151 rtc::CritScope cs(&observer_crit_);
152 RTC_DCHECK(observer_ == nullptr);
153 observer_ = observer;
154 }
155 send_side_cc_->RegisterNetworkObserver(this);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100156}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100157void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100158 const std::string& transport_name,
159 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100160 // Check if the network route is connected.
161 if (!network_route.connected) {
162 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
163 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
164 // consider merging these two methods.
165 return;
166 }
167
168 // Check whether the network route has changed on each transport.
169 auto result =
170 network_routes_.insert(std::make_pair(transport_name, network_route));
171 auto kv = result.first;
172 bool inserted = result.second;
173 if (inserted) {
174 // No need to reset BWE if this is the first time the network connects.
175 return;
176 }
177 if (kv->second != network_route) {
178 kv->second = network_route;
179 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
180 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
181 << ": new local network id "
182 << network_route.local_network_id
183 << " new remote network id "
184 << network_route.remote_network_id
185 << " Reset bitrates to min: "
186 << bitrate_config.min_bitrate_bps
187 << " bps, start: " << bitrate_config.start_bitrate_bps
188 << " bps, max: " << bitrate_config.max_bitrate_bps
189 << " bps.";
190 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100191 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100192 network_route, bitrate_config.start_bitrate_bps,
193 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
194 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100195}
196void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100197 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
198 : kNetworkDown);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100199}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100200RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100201 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100202}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100203int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100204 return pacer_.QueueInMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100205}
206int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100207 return pacer_.FirstSentPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100208}
Sebastian Jansson12130bb2018-03-21 12:48:43 +0100209void RtpTransportControllerSend::SetPerPacketFeedbackAvailable(bool available) {
210 send_side_cc_->SetPerPacketFeedbackAvailable(available);
211}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100212void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100213 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100214}
215void RtpTransportControllerSend::OnSentPacket(
216 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100217 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100218}
sprangdb2a9fc2017-08-09 06:42:32 -0700219
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100220void RtpTransportControllerSend::SetSdpBitrateParameters(
221 const BitrateConstraints& constraints) {
222 rtc::Optional<BitrateConstraints> updated =
223 bitrate_configurator_.UpdateWithSdpParameters(constraints);
224 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100225 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
226 updated->start_bitrate_bps,
227 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100228 } else {
229 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100230 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100231 << "nothing to update";
232 }
233}
234
235void RtpTransportControllerSend::SetClientBitratePreferences(
236 const BitrateConstraintsMask& preferences) {
237 rtc::Optional<BitrateConstraints> updated =
238 bitrate_configurator_.UpdateWithClientPreferences(preferences);
239 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100240 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
241 updated->start_bitrate_bps,
242 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100243 } else {
244 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100245 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100246 << "nothing to update";
247 }
248}
nissecae45d02017-04-24 05:53:20 -0700249} // namespace webrtc