blob: 10b39e5aff393045b190b25e6193aaca1734709f [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;
Sebastian Jansson19bea512018-03-13 19:07:46 +010025const char kTaskQueueExperiment[] = "WebRTC-TaskQueueCongestionControl";
26using TaskQueueController = webrtc::webrtc_cc::SendSideCongestionController;
27
28bool TaskQueueExperimentEnabled() {
29 std::string trial = webrtc::field_trial::FindFullName(kTaskQueueExperiment);
30 return trial.find("Enable") == 0;
31}
32
33std::unique_ptr<SendSideCongestionControllerInterface> CreateController(
34 Clock* clock,
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020035 rtc::TaskQueue* task_queue,
Sebastian Jansson19bea512018-03-13 19:07:46 +010036 webrtc::RtcEventLog* event_log,
37 PacedSender* pacer,
38 const BitrateConstraints& bitrate_config,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020039 bool task_queue_controller,
40 NetworkControllerFactoryInterface* controller_factory) {
Sebastian Jansson19bea512018-03-13 19:07:46 +010041 if (task_queue_controller) {
Sebastian Jansson4e140da2018-04-13 13:25:19 +020042 RTC_LOG(LS_INFO) << "Using TaskQueue based SSCC";
Karl Wiberg918f50c2018-07-05 11:40:33 +020043 return absl::make_unique<webrtc::webrtc_cc::SendSideCongestionController>(
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020044 clock, task_queue, event_log, pacer, bitrate_config.start_bitrate_bps,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020045 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps,
46 controller_factory);
Sebastian Jansson19bea512018-03-13 19:07:46 +010047 }
Sebastian Jansson4e140da2018-04-13 13:25:19 +020048 RTC_LOG(LS_INFO) << "Using Legacy SSCC";
Karl Wiberg918f50c2018-07-05 11:40:33 +020049 auto cc = absl::make_unique<webrtc::SendSideCongestionController>(
Sebastian Jansson19bea512018-03-13 19:07:46 +010050 clock, nullptr /* observer */, event_log, pacer);
51 cc->SignalNetworkState(kNetworkDown);
52 cc->SetBweBitrates(bitrate_config.min_bitrate_bps,
53 bitrate_config.start_bitrate_bps,
54 bitrate_config.max_bitrate_bps);
55 return std::move(cc);
56}
57} // namespace
nissecae45d02017-04-24 05:53:20 -070058
59RtpTransportControllerSend::RtpTransportControllerSend(
60 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010061 webrtc::RtcEventLog* event_log,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020062 NetworkControllerFactoryInterface* controller_factory,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010063 const BitrateConstraints& bitrate_config)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010064 : clock_(clock),
65 pacer_(clock, &packet_router_, event_log),
Sebastian Jansson317a5222018-03-16 15:36:37 +010066 bitrate_configurator_(bitrate_config),
67 process_thread_(ProcessThread::Create("SendControllerThread")),
68 observer_(nullptr),
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020069 retransmission_rate_limiter_(clock, kRetransmitWindowSizeMs),
Sebastian Janssone6256052018-05-04 14:08:15 +020070 task_queue_("rtp_send_controller") {
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020071 // Created after task_queue to be able to post to the task queue internally.
72 send_side_cc_ =
73 CreateController(clock, &task_queue_, event_log, &pacer_, bitrate_config,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020074 TaskQueueExperimentEnabled(), controller_factory);
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020075
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010076 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Jansson10211e92018-02-28 16:48:26 +010077 process_thread_->RegisterModule(send_side_cc_.get(), RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010078 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010079}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010080
81RtpTransportControllerSend::~RtpTransportControllerSend() {
82 process_thread_->Stop();
Sebastian Jansson10211e92018-02-28 16:48:26 +010083 process_thread_->DeRegisterModule(send_side_cc_.get());
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010084 process_thread_->DeRegisterModule(&pacer_);
85}
nissecae45d02017-04-24 05:53:20 -070086
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020087PayloadRouter* RtpTransportControllerSend::CreateVideoRtpSender(
88 const std::vector<uint32_t>& ssrcs,
89 std::map<uint32_t, RtpState> suspended_ssrcs,
90 const std::map<uint32_t, RtpPayloadState>& states,
91 const RtpConfig& rtp_config,
92 const RtcpConfig& rtcp_config,
93 Transport* send_transport,
94 const RtpSenderObservers& observers,
95 RtcEventLog* event_log) {
96 video_rtp_senders_.push_back(absl::make_unique<PayloadRouter>(
97 ssrcs, suspended_ssrcs, states, rtp_config, rtcp_config, send_transport,
98 observers,
99 // TODO(holmer): Remove this circular dependency by injecting
100 // the parts of RtpTransportControllerSendInterface that are really used.
101 this, event_log, &retransmission_rate_limiter_));
102 return video_rtp_senders_.back().get();
103}
104
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100105void RtpTransportControllerSend::OnNetworkChanged(uint32_t bitrate_bps,
106 uint8_t fraction_loss,
107 int64_t rtt_ms,
108 int64_t probing_interval_ms) {
109 // TODO(srte): Skip this step when old SendSideCongestionController is
110 // deprecated.
111 TargetTransferRate msg;
112 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
113 msg.target_rate = DataRate::bps(bitrate_bps);
114 msg.network_estimate.at_time = msg.at_time;
115 msg.network_estimate.bwe_period = TimeDelta::ms(probing_interval_ms);
116 uint32_t bandwidth_bps;
Sebastian Janssonbd9fe092018-05-07 16:33:50 +0200117 if (send_side_cc_->AvailableBandwidth(&bandwidth_bps))
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100118 msg.network_estimate.bandwidth = DataRate::bps(bandwidth_bps);
119 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
120 msg.network_estimate.round_trip_time = TimeDelta::ms(rtt_ms);
Sebastian Janssone6256052018-05-04 14:08:15 +0200121
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200122 retransmission_rate_limiter_.SetMaxRate(bandwidth_bps);
123
Sebastian Janssone6256052018-05-04 14:08:15 +0200124 if (!task_queue_.IsCurrent()) {
125 task_queue_.PostTask([this, msg] {
126 rtc::CritScope cs(&observer_crit_);
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200127 // We won't register as observer until we have an observers.
Sebastian Janssone6256052018-05-04 14:08:15 +0200128 RTC_DCHECK(observer_ != nullptr);
129 observer_->OnTargetTransferRate(msg);
130 });
131 } else {
132 rtc::CritScope cs(&observer_crit_);
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200133 // We won't register as observer until we have an observers.
Sebastian Janssone6256052018-05-04 14:08:15 +0200134 RTC_DCHECK(observer_ != nullptr);
135 observer_->OnTargetTransferRate(msg);
136 }
137}
138
139rtc::TaskQueue* RtpTransportControllerSend::GetWorkerQueue() {
140 return &task_queue_;
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100141}
142
nisse76e62b02017-05-31 02:24:52 -0700143PacketRouter* RtpTransportControllerSend::packet_router() {
144 return &packet_router_;
145}
146
nisse76e62b02017-05-31 02:24:52 -0700147TransportFeedbackObserver*
148RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100149 return send_side_cc_.get();
nisse76e62b02017-05-31 02:24:52 -0700150}
151
152RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200153 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700154}
155
sprangdb2a9fc2017-08-09 06:42:32 -0700156const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
157 return keepalive_;
158}
159
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200160void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
161 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +0100162 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +0100163 int max_total_bitrate_bps) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100164 send_side_cc_->SetAllocatedSendBitrateLimits(
165 min_send_bitrate_bps, max_padding_bitrate_bps, max_total_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200166}
167
sprangdb2a9fc2017-08-09 06:42:32 -0700168void RtpTransportControllerSend::SetKeepAliveConfig(
169 const RtpKeepAliveConfig& config) {
170 keepalive_ = config;
171}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100172void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100173 send_side_cc_->SetPacingFactor(pacing_factor);
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100174}
175void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
176 pacer_.SetQueueTimeLimit(limit_ms);
177}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100178CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100179 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100180}
181void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
182 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100183 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100184}
185void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
186 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100187 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100188}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100189
190void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
191 TargetTransferRateObserver* observer) {
192 {
193 rtc::CritScope cs(&observer_crit_);
194 RTC_DCHECK(observer_ == nullptr);
195 observer_ = observer;
196 }
197 send_side_cc_->RegisterNetworkObserver(this);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100198}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100199void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100200 const std::string& transport_name,
201 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100202 // Check if the network route is connected.
203 if (!network_route.connected) {
204 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
205 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
206 // consider merging these two methods.
207 return;
208 }
209
210 // Check whether the network route has changed on each transport.
211 auto result =
212 network_routes_.insert(std::make_pair(transport_name, network_route));
213 auto kv = result.first;
214 bool inserted = result.second;
215 if (inserted) {
216 // No need to reset BWE if this is the first time the network connects.
217 return;
218 }
219 if (kv->second != network_route) {
220 kv->second = network_route;
221 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
222 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
223 << ": new local network id "
224 << network_route.local_network_id
225 << " new remote network id "
226 << network_route.remote_network_id
227 << " Reset bitrates to min: "
228 << bitrate_config.min_bitrate_bps
229 << " bps, start: " << bitrate_config.start_bitrate_bps
230 << " bps, max: " << bitrate_config.max_bitrate_bps
231 << " bps.";
232 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100233 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100234 network_route, bitrate_config.start_bitrate_bps,
235 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
236 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100237}
238void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100239 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
240 : kNetworkDown);
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200241 for (auto& rtp_sender : video_rtp_senders_) {
242 rtp_sender->OnNetworkAvailability(network_available);
243 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100244}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100245RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100246 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100247}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100248int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100249 return pacer_.QueueInMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100250}
251int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100252 return pacer_.FirstSentPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100253}
Sebastian Jansson12130bb2018-03-21 12:48:43 +0100254void RtpTransportControllerSend::SetPerPacketFeedbackAvailable(bool available) {
255 send_side_cc_->SetPerPacketFeedbackAvailable(available);
256}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100257void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100258 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100259}
260void RtpTransportControllerSend::OnSentPacket(
261 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100262 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100263}
sprangdb2a9fc2017-08-09 06:42:32 -0700264
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100265void RtpTransportControllerSend::SetSdpBitrateParameters(
266 const BitrateConstraints& constraints) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200267 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100268 bitrate_configurator_.UpdateWithSdpParameters(constraints);
269 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100270 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
271 updated->start_bitrate_bps,
272 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100273 } else {
274 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100275 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100276 << "nothing to update";
277 }
278}
279
280void RtpTransportControllerSend::SetClientBitratePreferences(
Niels Möller0c4f7be2018-05-07 14:01:37 +0200281 const BitrateSettings& preferences) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200282 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100283 bitrate_configurator_.UpdateWithClientPreferences(preferences);
284 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100285 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
286 updated->start_bitrate_bps,
287 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100288 } else {
289 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100290 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100291 << "nothing to update";
292 }
293}
Alex Narestbcf91802018-06-25 16:08:36 +0200294
295void RtpTransportControllerSend::SetAllocatedBitrateWithoutFeedback(
296 uint32_t bitrate_bps) {
297 send_side_cc_->SetAllocatedBitrateWithoutFeedback(bitrate_bps);
298}
nissecae45d02017-04-24 05:53:20 -0700299} // namespace webrtc