blob: e86cca37c329955dd24f67746970d1d848ce2160 [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 Janssone6256052018-05-04 14:08:15 +020066 TaskQueueExperimentEnabled())),
67 task_queue_("rtp_send_controller") {
Sebastian Jansson947120f2018-03-26 14:56:37 +020068 send_side_cc_ptr_ = send_side_cc_.get();
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010069 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Jansson10211e92018-02-28 16:48:26 +010070 process_thread_->RegisterModule(send_side_cc_.get(), RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010071 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010072}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010073
74RtpTransportControllerSend::~RtpTransportControllerSend() {
75 process_thread_->Stop();
Sebastian Jansson10211e92018-02-28 16:48:26 +010076 process_thread_->DeRegisterModule(send_side_cc_.get());
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010077 process_thread_->DeRegisterModule(&pacer_);
78}
nissecae45d02017-04-24 05:53:20 -070079
Sebastian Jansson19704ec2018-03-12 15:59:12 +010080void RtpTransportControllerSend::OnNetworkChanged(uint32_t bitrate_bps,
81 uint8_t fraction_loss,
82 int64_t rtt_ms,
83 int64_t probing_interval_ms) {
84 // TODO(srte): Skip this step when old SendSideCongestionController is
85 // deprecated.
86 TargetTransferRate msg;
87 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
88 msg.target_rate = DataRate::bps(bitrate_bps);
89 msg.network_estimate.at_time = msg.at_time;
90 msg.network_estimate.bwe_period = TimeDelta::ms(probing_interval_ms);
91 uint32_t bandwidth_bps;
Sebastian Jansson947120f2018-03-26 14:56:37 +020092 if (send_side_cc_ptr_->AvailableBandwidth(&bandwidth_bps))
Sebastian Jansson19704ec2018-03-12 15:59:12 +010093 msg.network_estimate.bandwidth = DataRate::bps(bandwidth_bps);
94 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
95 msg.network_estimate.round_trip_time = TimeDelta::ms(rtt_ms);
Sebastian Janssone6256052018-05-04 14:08:15 +020096
97 if (!task_queue_.IsCurrent()) {
98 task_queue_.PostTask([this, msg] {
99 rtc::CritScope cs(&observer_crit_);
100 // We won't register as observer until we have an observer.
101 RTC_DCHECK(observer_ != nullptr);
102 observer_->OnTargetTransferRate(msg);
103 });
104 } else {
105 rtc::CritScope cs(&observer_crit_);
106 // We won't register as observer until we have an observer.
107 RTC_DCHECK(observer_ != nullptr);
108 observer_->OnTargetTransferRate(msg);
109 }
110}
111
112rtc::TaskQueue* RtpTransportControllerSend::GetWorkerQueue() {
113 return &task_queue_;
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100114}
115
nisse76e62b02017-05-31 02:24:52 -0700116PacketRouter* RtpTransportControllerSend::packet_router() {
117 return &packet_router_;
118}
119
nisse76e62b02017-05-31 02:24:52 -0700120TransportFeedbackObserver*
121RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100122 return send_side_cc_.get();
nisse76e62b02017-05-31 02:24:52 -0700123}
124
125RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200126 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700127}
128
sprangdb2a9fc2017-08-09 06:42:32 -0700129const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
130 return keepalive_;
131}
132
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200133void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
134 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +0100135 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +0100136 int max_total_bitrate_bps) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100137 send_side_cc_->SetAllocatedSendBitrateLimits(
138 min_send_bitrate_bps, max_padding_bitrate_bps, max_total_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200139}
140
sprangdb2a9fc2017-08-09 06:42:32 -0700141void RtpTransportControllerSend::SetKeepAliveConfig(
142 const RtpKeepAliveConfig& config) {
143 keepalive_ = config;
144}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100145void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100146 send_side_cc_->SetPacingFactor(pacing_factor);
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100147}
148void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
149 pacer_.SetQueueTimeLimit(limit_ms);
150}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100151CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100152 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100153}
154void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
155 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100156 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100157}
158void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
159 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100160 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100161}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100162
163void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
164 TargetTransferRateObserver* observer) {
165 {
166 rtc::CritScope cs(&observer_crit_);
167 RTC_DCHECK(observer_ == nullptr);
168 observer_ = observer;
169 }
170 send_side_cc_->RegisterNetworkObserver(this);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100171}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100172void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100173 const std::string& transport_name,
174 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100175 // Check if the network route is connected.
176 if (!network_route.connected) {
177 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
178 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
179 // consider merging these two methods.
180 return;
181 }
182
183 // Check whether the network route has changed on each transport.
184 auto result =
185 network_routes_.insert(std::make_pair(transport_name, network_route));
186 auto kv = result.first;
187 bool inserted = result.second;
188 if (inserted) {
189 // No need to reset BWE if this is the first time the network connects.
190 return;
191 }
192 if (kv->second != network_route) {
193 kv->second = network_route;
194 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
195 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
196 << ": new local network id "
197 << network_route.local_network_id
198 << " new remote network id "
199 << network_route.remote_network_id
200 << " Reset bitrates to min: "
201 << bitrate_config.min_bitrate_bps
202 << " bps, start: " << bitrate_config.start_bitrate_bps
203 << " bps, max: " << bitrate_config.max_bitrate_bps
204 << " bps.";
205 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100206 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100207 network_route, bitrate_config.start_bitrate_bps,
208 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
209 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100210}
211void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100212 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
213 : kNetworkDown);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100214}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100215RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100216 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100217}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100218int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100219 return pacer_.QueueInMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100220}
221int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100222 return pacer_.FirstSentPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100223}
Sebastian Jansson12130bb2018-03-21 12:48:43 +0100224void RtpTransportControllerSend::SetPerPacketFeedbackAvailable(bool available) {
225 send_side_cc_->SetPerPacketFeedbackAvailable(available);
226}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100227void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100228 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100229}
230void RtpTransportControllerSend::OnSentPacket(
231 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100232 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100233}
sprangdb2a9fc2017-08-09 06:42:32 -0700234
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100235void RtpTransportControllerSend::SetSdpBitrateParameters(
236 const BitrateConstraints& constraints) {
237 rtc::Optional<BitrateConstraints> updated =
238 bitrate_configurator_.UpdateWithSdpParameters(constraints);
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.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100246 << "nothing to update";
247 }
248}
249
250void RtpTransportControllerSend::SetClientBitratePreferences(
251 const BitrateConstraintsMask& preferences) {
252 rtc::Optional<BitrateConstraints> updated =
253 bitrate_configurator_.UpdateWithClientPreferences(preferences);
254 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100255 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
256 updated->start_bitrate_bps,
257 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100258 } else {
259 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100260 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100261 << "nothing to update";
262 }
263}
nissecae45d02017-04-24 05:53:20 -0700264} // namespace webrtc