blob: f225bed59cf7a5b6ea7d4851f0de8ee602295e62 [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>
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020011#include <vector>
nissecae45d02017-04-24 05:53:20 -070012
Karl Wiberg918f50c2018-07-05 11:40:33 +020013#include "absl/memory/memory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "call/rtp_transport_controller_send.h"
Sebastian Jansson10211e92018-02-28 16:48:26 +010015#include "modules/congestion_controller/include/send_side_congestion_controller.h"
Sebastian Jansson19bea512018-03-13 19:07:46 +010016#include "modules/congestion_controller/rtp/include/send_side_congestion_controller.h"
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010017#include "rtc_base/location.h"
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010018#include "rtc_base/logging.h"
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020019#include "rtc_base/rate_limiter.h"
Sebastian Jansson19bea512018-03-13 19:07:46 +010020#include "system_wrappers/include/field_trial.h"
nissecae45d02017-04-24 05:53:20 -070021
22namespace webrtc {
Sebastian Jansson19bea512018-03-13 19:07:46 +010023namespace {
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020024static const int64_t kRetransmitWindowSizeMs = 500;
Stefan Holmer64be7fa2018-10-04 15:21:55 +020025static const size_t kMaxOverheadBytes = 500;
Sebastian Jansson19bea512018-03-13 19:07:46 +010026const char kTaskQueueExperiment[] = "WebRTC-TaskQueueCongestionControl";
27using TaskQueueController = webrtc::webrtc_cc::SendSideCongestionController;
28
Sebastian Jansson19bea512018-03-13 19:07:46 +010029std::unique_ptr<SendSideCongestionControllerInterface> CreateController(
30 Clock* clock,
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020031 rtc::TaskQueue* task_queue,
Sebastian Jansson19bea512018-03-13 19:07:46 +010032 webrtc::RtcEventLog* event_log,
33 PacedSender* pacer,
34 const BitrateConstraints& bitrate_config,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020035 bool task_queue_controller,
36 NetworkControllerFactoryInterface* controller_factory) {
Sebastian Jansson19bea512018-03-13 19:07:46 +010037 if (task_queue_controller) {
Sebastian Jansson4e140da2018-04-13 13:25:19 +020038 RTC_LOG(LS_INFO) << "Using TaskQueue based SSCC";
Karl Wiberg918f50c2018-07-05 11:40:33 +020039 return absl::make_unique<webrtc::webrtc_cc::SendSideCongestionController>(
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020040 clock, task_queue, event_log, pacer, bitrate_config.start_bitrate_bps,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020041 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps,
42 controller_factory);
Sebastian Jansson19bea512018-03-13 19:07:46 +010043 }
Sebastian Jansson4e140da2018-04-13 13:25:19 +020044 RTC_LOG(LS_INFO) << "Using Legacy SSCC";
Karl Wiberg918f50c2018-07-05 11:40:33 +020045 auto cc = absl::make_unique<webrtc::SendSideCongestionController>(
Sebastian Jansson19bea512018-03-13 19:07:46 +010046 clock, nullptr /* observer */, event_log, pacer);
47 cc->SignalNetworkState(kNetworkDown);
48 cc->SetBweBitrates(bitrate_config.min_bitrate_bps,
49 bitrate_config.start_bitrate_bps,
50 bitrate_config.max_bitrate_bps);
51 return std::move(cc);
52}
53} // namespace
nissecae45d02017-04-24 05:53:20 -070054
55RtpTransportControllerSend::RtpTransportControllerSend(
56 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010057 webrtc::RtcEventLog* event_log,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020058 NetworkControllerFactoryInterface* controller_factory,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010059 const BitrateConstraints& bitrate_config)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010060 : clock_(clock),
61 pacer_(clock, &packet_router_, event_log),
Sebastian Jansson317a5222018-03-16 15:36:37 +010062 bitrate_configurator_(bitrate_config),
63 process_thread_(ProcessThread::Create("SendControllerThread")),
64 observer_(nullptr),
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020065 retransmission_rate_limiter_(clock, kRetransmitWindowSizeMs),
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.
Sebastian Jansson4ff72142018-10-08 11:15:04 +020068 send_side_cc_ = CreateController(
69 clock, &task_queue_, event_log, &pacer_, bitrate_config,
70 !field_trial::IsDisabled(kTaskQueueExperiment), 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
Stefan Holmer9416ef82018-07-19 10:34:38 +020083RtpVideoSenderInterface* RtpTransportControllerSend::CreateRtpVideoSender(
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020084 const std::vector<uint32_t>& ssrcs,
85 std::map<uint32_t, RtpState> suspended_ssrcs,
86 const std::map<uint32_t, RtpPayloadState>& states,
87 const RtpConfig& rtp_config,
88 const RtcpConfig& rtcp_config,
89 Transport* send_transport,
90 const RtpSenderObservers& observers,
Stefan Holmer64be7fa2018-10-04 15:21:55 +020091 RtcEventLog* event_log,
Benjamin Wright192eeec2018-10-17 17:27:25 -070092 std::unique_ptr<FecController> fec_controller,
93 const RtpSenderFrameEncryptionConfig& frame_encryption_config) {
Stefan Holmer9416ef82018-07-19 10:34:38 +020094 video_rtp_senders_.push_back(absl::make_unique<RtpVideoSender>(
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020095 ssrcs, suspended_ssrcs, states, rtp_config, rtcp_config, send_transport,
96 observers,
97 // TODO(holmer): Remove this circular dependency by injecting
98 // the parts of RtpTransportControllerSendInterface that are really used.
Benjamin Wright192eeec2018-10-17 17:27:25 -070099 this, event_log, &retransmission_rate_limiter_, std::move(fec_controller),
100 frame_encryption_config.frame_encryptor,
101 frame_encryption_config.crypto_options));
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200102 return video_rtp_senders_.back().get();
103}
104
Stefan Holmer9416ef82018-07-19 10:34:38 +0200105void RtpTransportControllerSend::DestroyRtpVideoSender(
106 RtpVideoSenderInterface* rtp_video_sender) {
107 std::vector<std::unique_ptr<RtpVideoSenderInterface>>::iterator it =
Stefan Holmer5ed25af2018-07-18 15:17:14 +0200108 video_rtp_senders_.end();
109 for (it = video_rtp_senders_.begin(); it != video_rtp_senders_.end(); ++it) {
110 if (it->get() == rtp_video_sender) {
111 break;
112 }
113 }
114 RTC_DCHECK(it != video_rtp_senders_.end());
115 video_rtp_senders_.erase(it);
116}
117
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100118void RtpTransportControllerSend::OnNetworkChanged(uint32_t bitrate_bps,
119 uint8_t fraction_loss,
120 int64_t rtt_ms,
121 int64_t probing_interval_ms) {
122 // TODO(srte): Skip this step when old SendSideCongestionController is
123 // deprecated.
124 TargetTransferRate msg;
125 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
126 msg.target_rate = DataRate::bps(bitrate_bps);
127 msg.network_estimate.at_time = msg.at_time;
128 msg.network_estimate.bwe_period = TimeDelta::ms(probing_interval_ms);
129 uint32_t bandwidth_bps;
Sebastian Janssonbd9fe092018-05-07 16:33:50 +0200130 if (send_side_cc_->AvailableBandwidth(&bandwidth_bps))
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100131 msg.network_estimate.bandwidth = DataRate::bps(bandwidth_bps);
132 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
133 msg.network_estimate.round_trip_time = TimeDelta::ms(rtt_ms);
Sebastian Janssone6256052018-05-04 14:08:15 +0200134
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200135 retransmission_rate_limiter_.SetMaxRate(bandwidth_bps);
136
Sebastian Janssone6256052018-05-04 14:08:15 +0200137 if (!task_queue_.IsCurrent()) {
138 task_queue_.PostTask([this, msg] {
139 rtc::CritScope cs(&observer_crit_);
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200140 // We won't register as observer until we have an observers.
Sebastian Janssone6256052018-05-04 14:08:15 +0200141 RTC_DCHECK(observer_ != nullptr);
142 observer_->OnTargetTransferRate(msg);
143 });
144 } else {
145 rtc::CritScope cs(&observer_crit_);
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200146 // We won't register as observer until we have an observers.
Sebastian Janssone6256052018-05-04 14:08:15 +0200147 RTC_DCHECK(observer_ != nullptr);
148 observer_->OnTargetTransferRate(msg);
149 }
150}
151
152rtc::TaskQueue* RtpTransportControllerSend::GetWorkerQueue() {
153 return &task_queue_;
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100154}
155
nisse76e62b02017-05-31 02:24:52 -0700156PacketRouter* RtpTransportControllerSend::packet_router() {
157 return &packet_router_;
158}
159
nisse76e62b02017-05-31 02:24:52 -0700160TransportFeedbackObserver*
161RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100162 return send_side_cc_.get();
nisse76e62b02017-05-31 02:24:52 -0700163}
164
165RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200166 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700167}
168
sprangdb2a9fc2017-08-09 06:42:32 -0700169const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
170 return keepalive_;
171}
172
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200173void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
174 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +0100175 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +0100176 int max_total_bitrate_bps) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100177 send_side_cc_->SetAllocatedSendBitrateLimits(
178 min_send_bitrate_bps, max_padding_bitrate_bps, max_total_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200179}
180
sprangdb2a9fc2017-08-09 06:42:32 -0700181void RtpTransportControllerSend::SetKeepAliveConfig(
182 const RtpKeepAliveConfig& config) {
183 keepalive_ = config;
184}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100185void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100186 send_side_cc_->SetPacingFactor(pacing_factor);
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100187}
188void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
189 pacer_.SetQueueTimeLimit(limit_ms);
190}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100191CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100192 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100193}
194void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
195 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100196 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100197}
198void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
199 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100200 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100201}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100202
203void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
204 TargetTransferRateObserver* observer) {
205 {
206 rtc::CritScope cs(&observer_crit_);
207 RTC_DCHECK(observer_ == nullptr);
208 observer_ = observer;
209 }
210 send_side_cc_->RegisterNetworkObserver(this);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100211}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100212void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100213 const std::string& transport_name,
214 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100215 // Check if the network route is connected.
216 if (!network_route.connected) {
217 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
218 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
219 // consider merging these two methods.
220 return;
221 }
222
223 // Check whether the network route has changed on each transport.
224 auto result =
225 network_routes_.insert(std::make_pair(transport_name, network_route));
226 auto kv = result.first;
227 bool inserted = result.second;
228 if (inserted) {
229 // No need to reset BWE if this is the first time the network connects.
230 return;
231 }
232 if (kv->second != network_route) {
233 kv->second = network_route;
234 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
235 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
236 << ": new local network id "
237 << network_route.local_network_id
238 << " new remote network id "
239 << network_route.remote_network_id
240 << " Reset bitrates to min: "
241 << bitrate_config.min_bitrate_bps
242 << " bps, start: " << bitrate_config.start_bitrate_bps
243 << " bps, max: " << bitrate_config.max_bitrate_bps
244 << " bps.";
245 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100246 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100247 network_route, bitrate_config.start_bitrate_bps,
248 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
249 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100250}
251void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100252 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
253 : kNetworkDown);
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200254 for (auto& rtp_sender : video_rtp_senders_) {
255 rtp_sender->OnNetworkAvailability(network_available);
256 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100257}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100258RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100259 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100260}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100261int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100262 return pacer_.QueueInMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100263}
264int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100265 return pacer_.FirstSentPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100266}
Sebastian Jansson12130bb2018-03-21 12:48:43 +0100267void RtpTransportControllerSend::SetPerPacketFeedbackAvailable(bool available) {
268 send_side_cc_->SetPerPacketFeedbackAvailable(available);
269}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100270void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100271 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100272}
273void RtpTransportControllerSend::OnSentPacket(
274 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100275 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100276}
sprangdb2a9fc2017-08-09 06:42:32 -0700277
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100278void RtpTransportControllerSend::SetSdpBitrateParameters(
279 const BitrateConstraints& constraints) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200280 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100281 bitrate_configurator_.UpdateWithSdpParameters(constraints);
282 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100283 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
284 updated->start_bitrate_bps,
285 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100286 } else {
287 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100288 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100289 << "nothing to update";
290 }
291}
292
293void RtpTransportControllerSend::SetClientBitratePreferences(
Niels Möller0c4f7be2018-05-07 14:01:37 +0200294 const BitrateSettings& preferences) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200295 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100296 bitrate_configurator_.UpdateWithClientPreferences(preferences);
297 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100298 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
299 updated->start_bitrate_bps,
300 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100301 } else {
302 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100303 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100304 << "nothing to update";
305 }
306}
Alex Narestbcf91802018-06-25 16:08:36 +0200307
308void RtpTransportControllerSend::SetAllocatedBitrateWithoutFeedback(
309 uint32_t bitrate_bps) {
Sebastian Jansson35fa2802018-10-01 09:16:12 +0200310 // Audio transport feedback will not be reported in this mode, instead update
311 // acknowledged bitrate estimator with the bitrate allocated for audio.
312 if (field_trial::IsEnabled("WebRTC-Audio-ABWENoTWCC")) {
313 // TODO(srte): Make sure it's safe to always report this and remove the
314 // field trial check.
315 send_side_cc_->SetAllocatedBitrateWithoutFeedback(bitrate_bps);
316 }
Alex Narestbcf91802018-06-25 16:08:36 +0200317}
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200318
319void RtpTransportControllerSend::OnTransportOverheadChanged(
320 size_t transport_overhead_bytes_per_packet) {
321 if (transport_overhead_bytes_per_packet >= kMaxOverheadBytes) {
322 RTC_LOG(LS_ERROR) << "Transport overhead exceeds " << kMaxOverheadBytes;
323 return;
324 }
325
326 // TODO(holmer): Call AudioRtpSenders when they have been moved to
327 // RtpTransportControllerSend.
328 for (auto& rtp_video_sender : video_rtp_senders_) {
329 rtp_video_sender->OnTransportOverheadChanged(
330 transport_overhead_bytes_per_packet);
331 }
332}
nissecae45d02017-04-24 05:53:20 -0700333} // namespace webrtc