blob: 76ba7f654fbe615608be4217e5018e0255582711 [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,
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020032 rtc::TaskQueue* task_queue,
Sebastian Jansson19bea512018-03-13 19:07:46 +010033 webrtc::RtcEventLog* event_log,
34 PacedSender* pacer,
35 const BitrateConstraints& bitrate_config,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020036 bool task_queue_controller,
37 NetworkControllerFactoryInterface* controller_factory) {
Sebastian Jansson19bea512018-03-13 19:07:46 +010038 if (task_queue_controller) {
Sebastian Jansson4e140da2018-04-13 13:25:19 +020039 RTC_LOG(LS_INFO) << "Using TaskQueue based SSCC";
Sebastian Jansson19bea512018-03-13 19:07:46 +010040 return rtc::MakeUnique<webrtc::webrtc_cc::SendSideCongestionController>(
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020041 clock, task_queue, event_log, pacer, bitrate_config.start_bitrate_bps,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020042 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps,
43 controller_factory);
Sebastian Jansson19bea512018-03-13 19:07:46 +010044 }
Sebastian Jansson4e140da2018-04-13 13:25:19 +020045 RTC_LOG(LS_INFO) << "Using Legacy SSCC";
Sebastian Jansson19bea512018-03-13 19:07:46 +010046 auto cc = rtc::MakeUnique<webrtc::SendSideCongestionController>(
47 clock, nullptr /* observer */, event_log, pacer);
48 cc->SignalNetworkState(kNetworkDown);
49 cc->SetBweBitrates(bitrate_config.min_bitrate_bps,
50 bitrate_config.start_bitrate_bps,
51 bitrate_config.max_bitrate_bps);
52 return std::move(cc);
53}
54} // namespace
nissecae45d02017-04-24 05:53:20 -070055
56RtpTransportControllerSend::RtpTransportControllerSend(
57 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010058 webrtc::RtcEventLog* event_log,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020059 NetworkControllerFactoryInterface* controller_factory,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010060 const BitrateConstraints& bitrate_config)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010061 : clock_(clock),
62 pacer_(clock, &packet_router_, event_log),
Sebastian Jansson317a5222018-03-16 15:36:37 +010063 bitrate_configurator_(bitrate_config),
64 process_thread_(ProcessThread::Create("SendControllerThread")),
65 observer_(nullptr),
Sebastian Janssone6256052018-05-04 14:08:15 +020066 task_queue_("rtp_send_controller") {
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020067 // Created after task_queue to be able to post to the task queue internally.
68 send_side_cc_ =
69 CreateController(clock, &task_queue_, event_log, &pacer_, bitrate_config,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020070 TaskQueueExperimentEnabled(), controller_factory);
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020071
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010072 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Jansson10211e92018-02-28 16:48:26 +010073 process_thread_->RegisterModule(send_side_cc_.get(), RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010074 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010075}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010076
77RtpTransportControllerSend::~RtpTransportControllerSend() {
78 process_thread_->Stop();
Sebastian Jansson10211e92018-02-28 16:48:26 +010079 process_thread_->DeRegisterModule(send_side_cc_.get());
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010080 process_thread_->DeRegisterModule(&pacer_);
81}
nissecae45d02017-04-24 05:53:20 -070082
Sebastian Jansson19704ec2018-03-12 15:59:12 +010083void RtpTransportControllerSend::OnNetworkChanged(uint32_t bitrate_bps,
84 uint8_t fraction_loss,
85 int64_t rtt_ms,
86 int64_t probing_interval_ms) {
87 // TODO(srte): Skip this step when old SendSideCongestionController is
88 // deprecated.
89 TargetTransferRate msg;
90 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
91 msg.target_rate = DataRate::bps(bitrate_bps);
92 msg.network_estimate.at_time = msg.at_time;
93 msg.network_estimate.bwe_period = TimeDelta::ms(probing_interval_ms);
94 uint32_t bandwidth_bps;
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020095 if (send_side_cc_->AvailableBandwidth(&bandwidth_bps))
Sebastian Jansson19704ec2018-03-12 15:59:12 +010096 msg.network_estimate.bandwidth = DataRate::bps(bandwidth_bps);
97 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
98 msg.network_estimate.round_trip_time = TimeDelta::ms(rtt_ms);
Sebastian Janssone6256052018-05-04 14:08:15 +020099
100 if (!task_queue_.IsCurrent()) {
101 task_queue_.PostTask([this, msg] {
102 rtc::CritScope cs(&observer_crit_);
103 // We won't register as observer until we have an observer.
104 RTC_DCHECK(observer_ != nullptr);
105 observer_->OnTargetTransferRate(msg);
106 });
107 } else {
108 rtc::CritScope cs(&observer_crit_);
109 // We won't register as observer until we have an observer.
110 RTC_DCHECK(observer_ != nullptr);
111 observer_->OnTargetTransferRate(msg);
112 }
113}
114
115rtc::TaskQueue* RtpTransportControllerSend::GetWorkerQueue() {
116 return &task_queue_;
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100117}
118
nisse76e62b02017-05-31 02:24:52 -0700119PacketRouter* RtpTransportControllerSend::packet_router() {
120 return &packet_router_;
121}
122
nisse76e62b02017-05-31 02:24:52 -0700123TransportFeedbackObserver*
124RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100125 return send_side_cc_.get();
nisse76e62b02017-05-31 02:24:52 -0700126}
127
128RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200129 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700130}
131
sprangdb2a9fc2017-08-09 06:42:32 -0700132const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
133 return keepalive_;
134}
135
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200136void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
137 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +0100138 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +0100139 int max_total_bitrate_bps) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100140 send_side_cc_->SetAllocatedSendBitrateLimits(
141 min_send_bitrate_bps, max_padding_bitrate_bps, max_total_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200142}
143
sprangdb2a9fc2017-08-09 06:42:32 -0700144void RtpTransportControllerSend::SetKeepAliveConfig(
145 const RtpKeepAliveConfig& config) {
146 keepalive_ = config;
147}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100148void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100149 send_side_cc_->SetPacingFactor(pacing_factor);
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100150}
151void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
152 pacer_.SetQueueTimeLimit(limit_ms);
153}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100154CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100155 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100156}
157void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
158 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100159 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100160}
161void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
162 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100163 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100164}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100165
166void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
167 TargetTransferRateObserver* observer) {
168 {
169 rtc::CritScope cs(&observer_crit_);
170 RTC_DCHECK(observer_ == nullptr);
171 observer_ = observer;
172 }
173 send_side_cc_->RegisterNetworkObserver(this);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100174}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100175void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100176 const std::string& transport_name,
177 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100178 // Check if the network route is connected.
179 if (!network_route.connected) {
180 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
181 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
182 // consider merging these two methods.
183 return;
184 }
185
186 // Check whether the network route has changed on each transport.
187 auto result =
188 network_routes_.insert(std::make_pair(transport_name, network_route));
189 auto kv = result.first;
190 bool inserted = result.second;
191 if (inserted) {
192 // No need to reset BWE if this is the first time the network connects.
193 return;
194 }
195 if (kv->second != network_route) {
196 kv->second = network_route;
197 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
198 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
199 << ": new local network id "
200 << network_route.local_network_id
201 << " new remote network id "
202 << network_route.remote_network_id
203 << " Reset bitrates to min: "
204 << bitrate_config.min_bitrate_bps
205 << " bps, start: " << bitrate_config.start_bitrate_bps
206 << " bps, max: " << bitrate_config.max_bitrate_bps
207 << " bps.";
208 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100209 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100210 network_route, bitrate_config.start_bitrate_bps,
211 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
212 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100213}
214void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100215 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
216 : kNetworkDown);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100217}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100218RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100219 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100220}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100221int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100222 return pacer_.QueueInMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100223}
224int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100225 return pacer_.FirstSentPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100226}
Sebastian Jansson12130bb2018-03-21 12:48:43 +0100227void RtpTransportControllerSend::SetPerPacketFeedbackAvailable(bool available) {
228 send_side_cc_->SetPerPacketFeedbackAvailable(available);
229}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100230void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100231 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100232}
233void RtpTransportControllerSend::OnSentPacket(
234 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100235 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100236}
sprangdb2a9fc2017-08-09 06:42:32 -0700237
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100238void RtpTransportControllerSend::SetSdpBitrateParameters(
239 const BitrateConstraints& constraints) {
240 rtc::Optional<BitrateConstraints> updated =
241 bitrate_configurator_.UpdateWithSdpParameters(constraints);
242 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100243 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
244 updated->start_bitrate_bps,
245 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100246 } else {
247 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100248 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100249 << "nothing to update";
250 }
251}
252
253void RtpTransportControllerSend::SetClientBitratePreferences(
Niels Möller0c4f7be2018-05-07 14:01:37 +0200254 const BitrateSettings& preferences) {
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100255 rtc::Optional<BitrateConstraints> updated =
256 bitrate_configurator_.UpdateWithClientPreferences(preferences);
257 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100258 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
259 updated->start_bitrate_bps,
260 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100261 } else {
262 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100263 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100264 << "nothing to update";
265 }
266}
nissecae45d02017-04-24 05:53:20 -0700267} // namespace webrtc