blob: d45b1e3639114d396529f7ef93683ae46514cc7f [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 Jansson19704ec2018-03-12 15:59:12 +010014#include "modules/congestion_controller/network_control/include/network_control.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"
nissecae45d02017-04-24 05:53:20 -070018
19namespace webrtc {
20
21RtpTransportControllerSend::RtpTransportControllerSend(
22 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010023 webrtc::RtcEventLog* event_log,
24 const BitrateConstraints& bitrate_config)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010025 : clock_(clock),
26 pacer_(clock, &packet_router_, event_log),
Sebastian Jansson10211e92018-02-28 16:48:26 +010027 send_side_cc_(
28 rtc::MakeUnique<SendSideCongestionController>(clock,
29 nullptr /* observer */,
30 event_log,
31 &pacer_)),
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010032 bitrate_configurator_(bitrate_config),
Sebastian Jansson19704ec2018-03-12 15:59:12 +010033 process_thread_(ProcessThread::Create("SendControllerThread")),
34 observer_(nullptr) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010035 send_side_cc_->SignalNetworkState(kNetworkDown);
36 send_side_cc_->SetBweBitrates(bitrate_config.min_bitrate_bps,
37 bitrate_config.start_bitrate_bps,
38 bitrate_config.max_bitrate_bps);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010039
40 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Jansson10211e92018-02-28 16:48:26 +010041 process_thread_->RegisterModule(send_side_cc_.get(), RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010042 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010043}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010044
45RtpTransportControllerSend::~RtpTransportControllerSend() {
46 process_thread_->Stop();
Sebastian Jansson10211e92018-02-28 16:48:26 +010047 process_thread_->DeRegisterModule(send_side_cc_.get());
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010048 process_thread_->DeRegisterModule(&pacer_);
49}
nissecae45d02017-04-24 05:53:20 -070050
Sebastian Jansson19704ec2018-03-12 15:59:12 +010051void RtpTransportControllerSend::OnNetworkChanged(uint32_t bitrate_bps,
52 uint8_t fraction_loss,
53 int64_t rtt_ms,
54 int64_t probing_interval_ms) {
55 // TODO(srte): Skip this step when old SendSideCongestionController is
56 // deprecated.
57 TargetTransferRate msg;
58 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
59 msg.target_rate = DataRate::bps(bitrate_bps);
60 msg.network_estimate.at_time = msg.at_time;
61 msg.network_estimate.bwe_period = TimeDelta::ms(probing_interval_ms);
62 uint32_t bandwidth_bps;
63 if (send_side_cc_->AvailableBandwidth(&bandwidth_bps))
64 msg.network_estimate.bandwidth = DataRate::bps(bandwidth_bps);
65 msg.network_estimate.loss_rate_ratio = fraction_loss / 255.0;
66 msg.network_estimate.round_trip_time = TimeDelta::ms(rtt_ms);
67 rtc::CritScope cs(&observer_crit_);
68 // We wont register as observer until we have an observer.
69 RTC_DCHECK(observer_ != nullptr);
70 observer_->OnTargetTransferRate(msg);
71}
72
nisse76e62b02017-05-31 02:24:52 -070073PacketRouter* RtpTransportControllerSend::packet_router() {
74 return &packet_router_;
75}
76
nisse76e62b02017-05-31 02:24:52 -070077TransportFeedbackObserver*
78RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson10211e92018-02-28 16:48:26 +010079 return send_side_cc_.get();
nisse76e62b02017-05-31 02:24:52 -070080}
81
82RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +020083 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -070084}
85
sprangdb2a9fc2017-08-09 06:42:32 -070086const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
87 return keepalive_;
88}
89
Stefan Holmer5c8942a2017-08-22 16:16:44 +020090void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
91 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +010092 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +010093 int max_total_bitrate_bps) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +010094 send_side_cc_->SetAllocatedSendBitrateLimits(
95 min_send_bitrate_bps, max_padding_bitrate_bps, max_total_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +020096}
97
sprangdb2a9fc2017-08-09 06:42:32 -070098void RtpTransportControllerSend::SetKeepAliveConfig(
99 const RtpKeepAliveConfig& config) {
100 keepalive_ = config;
101}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100102void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson68ee4652018-03-13 11:40:34 +0100103 send_side_cc_->SetPacingFactor(pacing_factor);
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100104}
105void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
106 pacer_.SetQueueTimeLimit(limit_ms);
107}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100108CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100109 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100110}
111void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
112 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100113 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100114}
115void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
116 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100117 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100118}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100119
120void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
121 TargetTransferRateObserver* observer) {
122 {
123 rtc::CritScope cs(&observer_crit_);
124 RTC_DCHECK(observer_ == nullptr);
125 observer_ = observer;
126 }
127 send_side_cc_->RegisterNetworkObserver(this);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100128}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100129void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100130 const std::string& transport_name,
131 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100132 // Check if the network route is connected.
133 if (!network_route.connected) {
134 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
135 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
136 // consider merging these two methods.
137 return;
138 }
139
140 // Check whether the network route has changed on each transport.
141 auto result =
142 network_routes_.insert(std::make_pair(transport_name, network_route));
143 auto kv = result.first;
144 bool inserted = result.second;
145 if (inserted) {
146 // No need to reset BWE if this is the first time the network connects.
147 return;
148 }
149 if (kv->second != network_route) {
150 kv->second = network_route;
151 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
152 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
153 << ": new local network id "
154 << network_route.local_network_id
155 << " new remote network id "
156 << network_route.remote_network_id
157 << " Reset bitrates to min: "
158 << bitrate_config.min_bitrate_bps
159 << " bps, start: " << bitrate_config.start_bitrate_bps
160 << " bps, max: " << bitrate_config.max_bitrate_bps
161 << " bps.";
162 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100163 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100164 network_route, bitrate_config.start_bitrate_bps,
165 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
166 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100167}
168void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100169 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
170 : kNetworkDown);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100171}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100172RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100173 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100174}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100175int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100176 return pacer_.QueueInMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100177}
178int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100179 return pacer_.FirstSentPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100180}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100181void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100182 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100183}
184void RtpTransportControllerSend::OnSentPacket(
185 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100186 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100187}
sprangdb2a9fc2017-08-09 06:42:32 -0700188
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100189void RtpTransportControllerSend::SetSdpBitrateParameters(
190 const BitrateConstraints& constraints) {
191 rtc::Optional<BitrateConstraints> updated =
192 bitrate_configurator_.UpdateWithSdpParameters(constraints);
193 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100194 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
195 updated->start_bitrate_bps,
196 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100197 } else {
198 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100199 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100200 << "nothing to update";
201 }
202}
203
204void RtpTransportControllerSend::SetClientBitratePreferences(
205 const BitrateConstraintsMask& preferences) {
206 rtc::Optional<BitrateConstraints> updated =
207 bitrate_configurator_.UpdateWithClientPreferences(preferences);
208 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100209 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
210 updated->start_bitrate_bps,
211 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100212 } else {
213 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100214 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100215 << "nothing to update";
216 }
217}
nissecae45d02017-04-24 05:53:20 -0700218} // namespace webrtc