blob: f206057e68b0c5fa931261758be071c1d424c962 [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,
67 int max_padding_bitrate_bps) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000068 pacer_.SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +020069}
70
sprangdb2a9fc2017-08-09 06:42:32 -070071void RtpTransportControllerSend::SetKeepAliveConfig(
72 const RtpKeepAliveConfig& config) {
73 keepalive_ = config;
74}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +010075void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
76 pacer_.SetPacingFactor(pacing_factor);
77}
78void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
79 pacer_.SetQueueTimeLimit(limit_ms);
80}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010081CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +010082 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +010083}
84void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
85 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010086 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010087}
88void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
89 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010090 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010091}
92void RtpTransportControllerSend::RegisterNetworkObserver(
93 NetworkChangedObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010094 send_side_cc_->RegisterNetworkObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010095}
96void RtpTransportControllerSend::DeRegisterNetworkObserver(
97 NetworkChangedObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010098 send_side_cc_->DeRegisterNetworkObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010099}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100100void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100101 const std::string& transport_name,
102 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100103 // Check if the network route is connected.
104 if (!network_route.connected) {
105 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
106 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
107 // consider merging these two methods.
108 return;
109 }
110
111 // Check whether the network route has changed on each transport.
112 auto result =
113 network_routes_.insert(std::make_pair(transport_name, network_route));
114 auto kv = result.first;
115 bool inserted = result.second;
116 if (inserted) {
117 // No need to reset BWE if this is the first time the network connects.
118 return;
119 }
120 if (kv->second != network_route) {
121 kv->second = network_route;
122 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
123 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
124 << ": new local network id "
125 << network_route.local_network_id
126 << " new remote network id "
127 << network_route.remote_network_id
128 << " Reset bitrates to min: "
129 << bitrate_config.min_bitrate_bps
130 << " bps, start: " << bitrate_config.start_bitrate_bps
131 << " bps, max: " << bitrate_config.max_bitrate_bps
132 << " bps.";
133 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100134 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100135 network_route, bitrate_config.start_bitrate_bps,
136 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
137 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100138}
139void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100140 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
141 : kNetworkDown);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100142}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100143RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100144 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100145}
146bool RtpTransportControllerSend::AvailableBandwidth(uint32_t* bandwidth) const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100147 return send_side_cc_->AvailableBandwidth(bandwidth);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100148}
149int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100150 return send_side_cc_->GetPacerQueuingDelayMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100151}
152int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100153 return send_side_cc_->GetFirstPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100154}
155RateLimiter* RtpTransportControllerSend::GetRetransmissionRateLimiter() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100156 return send_side_cc_->GetRetransmissionRateLimiter();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100157}
158void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100159 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100160}
161void RtpTransportControllerSend::OnSentPacket(
162 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100163 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100164}
sprangdb2a9fc2017-08-09 06:42:32 -0700165
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100166void RtpTransportControllerSend::SetSdpBitrateParameters(
167 const BitrateConstraints& constraints) {
168 rtc::Optional<BitrateConstraints> updated =
169 bitrate_configurator_.UpdateWithSdpParameters(constraints);
170 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100171 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
172 updated->start_bitrate_bps,
173 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100174 } else {
175 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100176 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100177 << "nothing to update";
178 }
179}
180
181void RtpTransportControllerSend::SetClientBitratePreferences(
182 const BitrateConstraintsMask& preferences) {
183 rtc::Optional<BitrateConstraints> updated =
184 bitrate_configurator_.UpdateWithClientPreferences(preferences);
185 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100186 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
187 updated->start_bitrate_bps,
188 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100189 } else {
190 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100191 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100192 << "nothing to update";
193 }
194}
nissecae45d02017-04-24 05:53:20 -0700195} // namespace webrtc