blob: bcfc131f7a0a36a077eed1533cdcc834cc7f12de [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,
68 int total_bitrate_bps) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000069 pacer_.SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +020070}
71
sprangdb2a9fc2017-08-09 06:42:32 -070072void RtpTransportControllerSend::SetKeepAliveConfig(
73 const RtpKeepAliveConfig& config) {
74 keepalive_ = config;
75}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +010076void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
77 pacer_.SetPacingFactor(pacing_factor);
78}
79void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
80 pacer_.SetQueueTimeLimit(limit_ms);
81}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010082CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +010083 return send_side_cc_.get();
Sebastian Janssone4be6da2018-02-15 16:51:41 +010084}
85void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
86 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010087 send_side_cc_->RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010088}
89void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
90 PacketFeedbackObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010091 send_side_cc_->DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010092}
93void RtpTransportControllerSend::RegisterNetworkObserver(
94 NetworkChangedObserver* observer) {
Sebastian Jansson10211e92018-02-28 16:48:26 +010095 send_side_cc_->RegisterNetworkObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +010096}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010097void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010098 const std::string& transport_name,
99 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100100 // Check if the network route is connected.
101 if (!network_route.connected) {
102 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
103 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
104 // consider merging these two methods.
105 return;
106 }
107
108 // Check whether the network route has changed on each transport.
109 auto result =
110 network_routes_.insert(std::make_pair(transport_name, network_route));
111 auto kv = result.first;
112 bool inserted = result.second;
113 if (inserted) {
114 // No need to reset BWE if this is the first time the network connects.
115 return;
116 }
117 if (kv->second != network_route) {
118 kv->second = network_route;
119 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
120 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
121 << ": new local network id "
122 << network_route.local_network_id
123 << " new remote network id "
124 << network_route.remote_network_id
125 << " Reset bitrates to min: "
126 << bitrate_config.min_bitrate_bps
127 << " bps, start: " << bitrate_config.start_bitrate_bps
128 << " bps, max: " << bitrate_config.max_bitrate_bps
129 << " bps.";
130 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson10211e92018-02-28 16:48:26 +0100131 send_side_cc_->OnNetworkRouteChanged(
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100132 network_route, bitrate_config.start_bitrate_bps,
133 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
134 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100135}
136void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100137 send_side_cc_->SignalNetworkState(network_available ? kNetworkUp
138 : kNetworkDown);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100139}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100140RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100141 return send_side_cc_->GetBandwidthObserver();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100142}
143bool RtpTransportControllerSend::AvailableBandwidth(uint32_t* bandwidth) const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100144 return send_side_cc_->AvailableBandwidth(bandwidth);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100145}
146int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100147 return send_side_cc_->GetPacerQueuingDelayMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100148}
149int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100150 return send_side_cc_->GetFirstPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100151}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100152void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100153 send_side_cc_->EnablePeriodicAlrProbing(enable);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100154}
155void RtpTransportControllerSend::OnSentPacket(
156 const rtc::SentPacket& sent_packet) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100157 send_side_cc_->OnSentPacket(sent_packet);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100158}
sprangdb2a9fc2017-08-09 06:42:32 -0700159
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100160void RtpTransportControllerSend::SetSdpBitrateParameters(
161 const BitrateConstraints& constraints) {
162 rtc::Optional<BitrateConstraints> updated =
163 bitrate_configurator_.UpdateWithSdpParameters(constraints);
164 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100165 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
166 updated->start_bitrate_bps,
167 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100168 } else {
169 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100170 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100171 << "nothing to update";
172 }
173}
174
175void RtpTransportControllerSend::SetClientBitratePreferences(
176 const BitrateConstraintsMask& preferences) {
177 rtc::Optional<BitrateConstraints> updated =
178 bitrate_configurator_.UpdateWithClientPreferences(preferences);
179 if (updated.has_value()) {
Sebastian Jansson10211e92018-02-28 16:48:26 +0100180 send_side_cc_->SetBweBitrates(updated->min_bitrate_bps,
181 updated->start_bitrate_bps,
182 updated->max_bitrate_bps);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100183 } else {
184 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100185 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100186 << "nothing to update";
187 }
188}
nissecae45d02017-04-24 05:53:20 -0700189} // namespace webrtc