blob: 5e054a85b0ee2fdec73b80ddb26a85585f80b588 [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 Jansson97f61ea2018-02-21 13:01:55 +010013#include "rtc_base/logging.h"
nissecae45d02017-04-24 05:53:20 -070014
15namespace webrtc {
16
17RtpTransportControllerSend::RtpTransportControllerSend(
18 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010019 webrtc::RtcEventLog* event_log,
20 const BitrateConstraints& bitrate_config)
Stefan Holmer5c8942a2017-08-22 16:16:44 +020021 : pacer_(clock, &packet_router_, event_log),
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010022 send_side_cc_(clock, nullptr /* observer */, event_log, &pacer_),
23 bitrate_configurator_(bitrate_config) {
24 send_side_cc_.SignalNetworkState(kNetworkDown);
25 send_side_cc_.SetBweBitrates(bitrate_config.min_bitrate_bps,
26 bitrate_config.start_bitrate_bps,
27 bitrate_config.max_bitrate_bps);
28}
29RtpTransportControllerSend::~RtpTransportControllerSend() = default;
nissecae45d02017-04-24 05:53:20 -070030
nisse76e62b02017-05-31 02:24:52 -070031PacketRouter* RtpTransportControllerSend::packet_router() {
32 return &packet_router_;
33}
34
nisse76e62b02017-05-31 02:24:52 -070035TransportFeedbackObserver*
36RtpTransportControllerSend::transport_feedback_observer() {
37 return &send_side_cc_;
38}
39
40RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +020041 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -070042}
43
sprangdb2a9fc2017-08-09 06:42:32 -070044const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
45 return keepalive_;
46}
47
Stefan Holmer5c8942a2017-08-22 16:16:44 +020048void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
49 int min_send_bitrate_bps,
50 int max_padding_bitrate_bps) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000051 pacer_.SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +020052}
53
sprangdb2a9fc2017-08-09 06:42:32 -070054void RtpTransportControllerSend::SetKeepAliveConfig(
55 const RtpKeepAliveConfig& config) {
56 keepalive_ = config;
57}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +010058Module* RtpTransportControllerSend::GetPacerModule() {
59 return &pacer_;
60}
61void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
62 pacer_.SetPacingFactor(pacing_factor);
63}
64void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
65 pacer_.SetQueueTimeLimit(limit_ms);
66}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010067Module* RtpTransportControllerSend::GetModule() {
68 return &send_side_cc_;
69}
70CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
71 return &send_side_cc_;
72}
73void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
74 PacketFeedbackObserver* observer) {
75 send_side_cc_.RegisterPacketFeedbackObserver(observer);
76}
77void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
78 PacketFeedbackObserver* observer) {
79 send_side_cc_.DeRegisterPacketFeedbackObserver(observer);
80}
81void RtpTransportControllerSend::RegisterNetworkObserver(
82 NetworkChangedObserver* observer) {
83 send_side_cc_.RegisterNetworkObserver(observer);
84}
85void RtpTransportControllerSend::DeRegisterNetworkObserver(
86 NetworkChangedObserver* observer) {
87 send_side_cc_.DeRegisterNetworkObserver(observer);
88}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010089void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010090 const std::string& transport_name,
91 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +010092 // Check if the network route is connected.
93 if (!network_route.connected) {
94 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
95 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
96 // consider merging these two methods.
97 return;
98 }
99
100 // Check whether the network route has changed on each transport.
101 auto result =
102 network_routes_.insert(std::make_pair(transport_name, network_route));
103 auto kv = result.first;
104 bool inserted = result.second;
105 if (inserted) {
106 // No need to reset BWE if this is the first time the network connects.
107 return;
108 }
109 if (kv->second != network_route) {
110 kv->second = network_route;
111 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
112 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
113 << ": new local network id "
114 << network_route.local_network_id
115 << " new remote network id "
116 << network_route.remote_network_id
117 << " Reset bitrates to min: "
118 << bitrate_config.min_bitrate_bps
119 << " bps, start: " << bitrate_config.start_bitrate_bps
120 << " bps, max: " << bitrate_config.max_bitrate_bps
121 << " bps.";
122 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
123 send_side_cc_.OnNetworkRouteChanged(
124 network_route, bitrate_config.start_bitrate_bps,
125 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
126 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100127}
128void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
129 send_side_cc_.SignalNetworkState(network_available ? kNetworkUp
130 : kNetworkDown);
131}
132void RtpTransportControllerSend::SetTransportOverhead(
133 size_t transport_overhead_bytes_per_packet) {
134 send_side_cc_.SetTransportOverhead(transport_overhead_bytes_per_packet);
135}
136RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
137 return send_side_cc_.GetBandwidthObserver();
138}
139bool RtpTransportControllerSend::AvailableBandwidth(uint32_t* bandwidth) const {
140 return send_side_cc_.AvailableBandwidth(bandwidth);
141}
142int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
143 return send_side_cc_.GetPacerQueuingDelayMs();
144}
145int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
146 return send_side_cc_.GetFirstPacketTimeMs();
147}
148RateLimiter* RtpTransportControllerSend::GetRetransmissionRateLimiter() {
149 return send_side_cc_.GetRetransmissionRateLimiter();
150}
151void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
152 send_side_cc_.EnablePeriodicAlrProbing(enable);
153}
154void RtpTransportControllerSend::OnSentPacket(
155 const rtc::SentPacket& sent_packet) {
156 send_side_cc_.OnSentPacket(sent_packet);
157}
sprangdb2a9fc2017-08-09 06:42:32 -0700158
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100159void RtpTransportControllerSend::SetSdpBitrateParameters(
160 const BitrateConstraints& constraints) {
161 rtc::Optional<BitrateConstraints> updated =
162 bitrate_configurator_.UpdateWithSdpParameters(constraints);
163 if (updated.has_value()) {
164 send_side_cc_.SetBweBitrates(updated->min_bitrate_bps,
165 updated->start_bitrate_bps,
166 updated->max_bitrate_bps);
167 } else {
168 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100169 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100170 << "nothing to update";
171 }
172}
173
174void RtpTransportControllerSend::SetClientBitratePreferences(
175 const BitrateConstraintsMask& preferences) {
176 rtc::Optional<BitrateConstraints> updated =
177 bitrate_configurator_.UpdateWithClientPreferences(preferences);
178 if (updated.has_value()) {
179 send_side_cc_.SetBweBitrates(updated->min_bitrate_bps,
180 updated->start_bitrate_bps,
181 updated->max_bitrate_bps);
182 } else {
183 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100184 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100185 << "nothing to update";
186 }
187}
nissecae45d02017-04-24 05:53:20 -0700188} // namespace webrtc