blob: ed0054772a708325af17e67db4c4f88ae3fc581a [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 Janssonc33c0fc2018-02-22 11:10:18 +010013#include "rtc_base/location.h"
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010014#include "rtc_base/logging.h"
nissecae45d02017-04-24 05:53:20 -070015
16namespace webrtc {
17
18RtpTransportControllerSend::RtpTransportControllerSend(
19 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010020 webrtc::RtcEventLog* event_log,
21 const BitrateConstraints& bitrate_config)
Stefan Holmer5c8942a2017-08-22 16:16:44 +020022 : pacer_(clock, &packet_router_, event_log),
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010023 send_side_cc_(clock, nullptr /* observer */, event_log, &pacer_),
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010024 bitrate_configurator_(bitrate_config),
25 process_thread_(ProcessThread::Create("SendControllerThread")) {
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010026 send_side_cc_.SignalNetworkState(kNetworkDown);
27 send_side_cc_.SetBweBitrates(bitrate_config.min_bitrate_bps,
28 bitrate_config.start_bitrate_bps,
29 bitrate_config.max_bitrate_bps);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010030
31 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
32 process_thread_->RegisterModule(&send_side_cc_, RTC_FROM_HERE);
33 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010034}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010035
36RtpTransportControllerSend::~RtpTransportControllerSend() {
37 process_thread_->Stop();
38 process_thread_->DeRegisterModule(&send_side_cc_);
39 process_thread_->DeRegisterModule(&pacer_);
40}
nissecae45d02017-04-24 05:53:20 -070041
nisse76e62b02017-05-31 02:24:52 -070042PacketRouter* RtpTransportControllerSend::packet_router() {
43 return &packet_router_;
44}
45
nisse76e62b02017-05-31 02:24:52 -070046TransportFeedbackObserver*
47RtpTransportControllerSend::transport_feedback_observer() {
48 return &send_side_cc_;
49}
50
51RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +020052 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -070053}
54
sprangdb2a9fc2017-08-09 06:42:32 -070055const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
56 return keepalive_;
57}
58
Stefan Holmer5c8942a2017-08-22 16:16:44 +020059void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
60 int min_send_bitrate_bps,
61 int max_padding_bitrate_bps) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000062 pacer_.SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +020063}
64
sprangdb2a9fc2017-08-09 06:42:32 -070065void RtpTransportControllerSend::SetKeepAliveConfig(
66 const RtpKeepAliveConfig& config) {
67 keepalive_ = config;
68}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +010069void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
70 pacer_.SetPacingFactor(pacing_factor);
71}
72void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
73 pacer_.SetQueueTimeLimit(limit_ms);
74}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010075CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
76 return &send_side_cc_;
77}
78void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
79 PacketFeedbackObserver* observer) {
80 send_side_cc_.RegisterPacketFeedbackObserver(observer);
81}
82void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
83 PacketFeedbackObserver* observer) {
84 send_side_cc_.DeRegisterPacketFeedbackObserver(observer);
85}
86void RtpTransportControllerSend::RegisterNetworkObserver(
87 NetworkChangedObserver* observer) {
88 send_side_cc_.RegisterNetworkObserver(observer);
89}
90void RtpTransportControllerSend::DeRegisterNetworkObserver(
91 NetworkChangedObserver* observer) {
92 send_side_cc_.DeRegisterNetworkObserver(observer);
93}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010094void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010095 const std::string& transport_name,
96 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +010097 // Check if the network route is connected.
98 if (!network_route.connected) {
99 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
100 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
101 // consider merging these two methods.
102 return;
103 }
104
105 // Check whether the network route has changed on each transport.
106 auto result =
107 network_routes_.insert(std::make_pair(transport_name, network_route));
108 auto kv = result.first;
109 bool inserted = result.second;
110 if (inserted) {
111 // No need to reset BWE if this is the first time the network connects.
112 return;
113 }
114 if (kv->second != network_route) {
115 kv->second = network_route;
116 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
117 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
118 << ": new local network id "
119 << network_route.local_network_id
120 << " new remote network id "
121 << network_route.remote_network_id
122 << " Reset bitrates to min: "
123 << bitrate_config.min_bitrate_bps
124 << " bps, start: " << bitrate_config.start_bitrate_bps
125 << " bps, max: " << bitrate_config.max_bitrate_bps
126 << " bps.";
127 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
128 send_side_cc_.OnNetworkRouteChanged(
129 network_route, bitrate_config.start_bitrate_bps,
130 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
131 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100132}
133void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
134 send_side_cc_.SignalNetworkState(network_available ? kNetworkUp
135 : kNetworkDown);
136}
137void RtpTransportControllerSend::SetTransportOverhead(
138 size_t transport_overhead_bytes_per_packet) {
139 send_side_cc_.SetTransportOverhead(transport_overhead_bytes_per_packet);
140}
141RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
142 return send_side_cc_.GetBandwidthObserver();
143}
144bool RtpTransportControllerSend::AvailableBandwidth(uint32_t* bandwidth) const {
145 return send_side_cc_.AvailableBandwidth(bandwidth);
146}
147int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
148 return send_side_cc_.GetPacerQueuingDelayMs();
149}
150int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
151 return send_side_cc_.GetFirstPacketTimeMs();
152}
153RateLimiter* RtpTransportControllerSend::GetRetransmissionRateLimiter() {
154 return send_side_cc_.GetRetransmissionRateLimiter();
155}
156void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
157 send_side_cc_.EnablePeriodicAlrProbing(enable);
158}
159void RtpTransportControllerSend::OnSentPacket(
160 const rtc::SentPacket& sent_packet) {
161 send_side_cc_.OnSentPacket(sent_packet);
162}
sprangdb2a9fc2017-08-09 06:42:32 -0700163
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100164void RtpTransportControllerSend::SetSdpBitrateParameters(
165 const BitrateConstraints& constraints) {
166 rtc::Optional<BitrateConstraints> updated =
167 bitrate_configurator_.UpdateWithSdpParameters(constraints);
168 if (updated.has_value()) {
169 send_side_cc_.SetBweBitrates(updated->min_bitrate_bps,
170 updated->start_bitrate_bps,
171 updated->max_bitrate_bps);
172 } else {
173 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100174 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100175 << "nothing to update";
176 }
177}
178
179void RtpTransportControllerSend::SetClientBitratePreferences(
180 const BitrateConstraintsMask& preferences) {
181 rtc::Optional<BitrateConstraints> updated =
182 bitrate_configurator_.UpdateWithClientPreferences(preferences);
183 if (updated.has_value()) {
184 send_side_cc_.SetBweBitrates(updated->min_bitrate_bps,
185 updated->start_bitrate_bps,
186 updated->max_bitrate_bps);
187 } else {
188 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100189 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100190 << "nothing to update";
191 }
192}
nissecae45d02017-04-24 05:53:20 -0700193} // namespace webrtc