blob: 55541279234944fb2fa9ff05cb3add9975502b2d [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 Janssonc33c0fc2018-02-22 11:10:18 +010014#include "rtc_base/location.h"
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010015#include "rtc_base/logging.h"
Sebastian Jansson10211e92018-02-28 16:48:26 +010016#include "rtc_base/ptr_util.h"
nissecae45d02017-04-24 05:53:20 -070017
18namespace webrtc {
19
20RtpTransportControllerSend::RtpTransportControllerSend(
21 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010022 webrtc::RtcEventLog* event_log,
23 const BitrateConstraints& bitrate_config)
Stefan Holmer5c8942a2017-08-22 16:16:44 +020024 : pacer_(clock, &packet_router_, event_log),
Sebastian Jansson10211e92018-02-28 16:48:26 +010025 send_side_cc_(
26 rtc::MakeUnique<SendSideCongestionController>(clock,
27 nullptr /* observer */,
28 event_log,
29 &pacer_)),
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010030 bitrate_configurator_(bitrate_config),
31 process_thread_(ProcessThread::Create("SendControllerThread")) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010032 send_side_cc_->SignalNetworkState(kNetworkDown);
33 send_side_cc_->SetBweBitrates(bitrate_config.min_bitrate_bps,
34 bitrate_config.start_bitrate_bps,
35 bitrate_config.max_bitrate_bps);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010036
37 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Jansson10211e92018-02-28 16:48:26 +010038 process_thread_->RegisterModule(send_side_cc_.get(), RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010039 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010040}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010041
42RtpTransportControllerSend::~RtpTransportControllerSend() {
43 process_thread_->Stop();
Sebastian Jansson10211e92018-02-28 16:48:26 +010044 process_thread_->DeRegisterModule(send_side_cc_.get());
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010045 process_thread_->DeRegisterModule(&pacer_);
46}
nissecae45d02017-04-24 05:53:20 -070047
nisse76e62b02017-05-31 02:24:52 -070048PacketRouter* RtpTransportControllerSend::packet_router() {
49 return &packet_router_;
50}
51
nisse76e62b02017-05-31 02:24:52 -070052TransportFeedbackObserver*
53RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson10211e92018-02-28 16:48:26 +010054 return send_side_cc_.get();
nisse76e62b02017-05-31 02:24:52 -070055}
56
57RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +020058 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -070059}
60
sprangdb2a9fc2017-08-09 06:42:32 -070061const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
62 return keepalive_;
63}
64
Stefan Holmer5c8942a2017-08-22 16:16:44 +020065void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
66 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +010067 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +010068 int max_total_bitrate_bps) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000069 pacer_.SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
philipeldb4fa4b2018-03-06 18:29:22 +010070 send_side_cc_->SetMaxTotalAllocatedBitrate(max_total_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +020071}
72
sprangdb2a9fc2017-08-09 06:42:32 -070073void RtpTransportControllerSend::SetKeepAliveConfig(
74 const RtpKeepAliveConfig& config) {
75 keepalive_ = config;
76}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +010077void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
78 pacer_.SetPacingFactor(pacing_factor);
79}
80void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
81 pacer_.SetQueueTimeLimit(limit_ms);
82}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010083CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +010084 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +010085}
86void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
87 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010088 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010089}
90void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
91 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010092 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010093}
94void RtpTransportControllerSend::RegisterNetworkObserver(
95 NetworkChangedObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010096 send_side_cc_->RegisterNetworkObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010097}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010098void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010099 const std::string& transport_name,
100 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100101 // Check if the network route is connected.
102 if (!network_route.connected) {
103 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
104 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
105 // consider merging these two methods.
106 return;
107 }
108
109 // Check whether the network route has changed on each transport.
110 auto result =
111 network_routes_.insert(std::make_pair(transport_name, network_route));
112 auto kv = result.first;
113 bool inserted = result.second;
114 if (inserted) {
115 // No need to reset BWE if this is the first time the network connects.
116 return;
117 }
118 if (kv->second != network_route) {
119 kv->second = network_route;
120 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
121 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
122 << ": new local network id "
123 << network_route.local_network_id
124 << " new remote network id "
125 << network_route.remote_network_id
126 << " Reset bitrates to min: "
127 << bitrate_config.min_bitrate_bps
128 << " bps, start: " << bitrate_config.start_bitrate_bps
129 << " bps, max: " << bitrate_config.max_bitrate_bps
130 << " bps.";
131 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100132 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100133 network_route, bitrate_config.start_bitrate_bps,
134 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
135 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100136}
137void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100138 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
139 : kNetworkDown);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100140}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100141RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100142 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100143}
144bool RtpTransportControllerSend::AvailableBandwidth(uint32_t* bandwidth) const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100145 return send_side_cc_->AvailableBandwidth(bandwidth);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100146}
147int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100148 return send_side_cc_->GetPacerQueuingDelayMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100149}
150int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100151 return send_side_cc_->GetFirstPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100152}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100153void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100154 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100155}
156void RtpTransportControllerSend::OnSentPacket(
157 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100158 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100159}
sprangdb2a9fc2017-08-09 06:42:32 -0700160
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100161void RtpTransportControllerSend::SetSdpBitrateParameters(
162 const BitrateConstraints& constraints) {
163 rtc::Optional<BitrateConstraints> updated =
164 bitrate_configurator_.UpdateWithSdpParameters(constraints);
165 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100166 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
167 updated->start_bitrate_bps,
168 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100169 } else {
170 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100171 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100172 << "nothing to update";
173 }
174}
175
176void RtpTransportControllerSend::SetClientBitratePreferences(
177 const BitrateConstraintsMask& preferences) {
178 rtc::Optional<BitrateConstraints> updated =
179 bitrate_configurator_.UpdateWithClientPreferences(preferences);
180 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100181 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
182 updated->start_bitrate_bps,
183 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100184 } else {
185 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100186 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100187 << "nothing to update";
188 }
189}
nissecae45d02017-04-24 05:53:20 -0700190} // namespace webrtc