blob: a48d84353e1bc2ef3861f6921658869937c4eb51 [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 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "call/rtp_transport_controller_send.h"
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010012#include "rtc_base/logging.h"
nissecae45d02017-04-24 05:53:20 -070013
14namespace webrtc {
15
16RtpTransportControllerSend::RtpTransportControllerSend(
17 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010018 webrtc::RtcEventLog* event_log,
19 const BitrateConstraints& bitrate_config)
Stefan Holmer5c8942a2017-08-22 16:16:44 +020020 : pacer_(clock, &packet_router_, event_log),
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010021 send_side_cc_(clock, nullptr /* observer */, event_log, &pacer_),
22 bitrate_configurator_(bitrate_config) {
23 send_side_cc_.SignalNetworkState(kNetworkDown);
24 send_side_cc_.SetBweBitrates(bitrate_config.min_bitrate_bps,
25 bitrate_config.start_bitrate_bps,
26 bitrate_config.max_bitrate_bps);
27}
28RtpTransportControllerSend::~RtpTransportControllerSend() = default;
nissecae45d02017-04-24 05:53:20 -070029
nisse76e62b02017-05-31 02:24:52 -070030PacketRouter* RtpTransportControllerSend::packet_router() {
31 return &packet_router_;
32}
33
nisse76e62b02017-05-31 02:24:52 -070034TransportFeedbackObserver*
35RtpTransportControllerSend::transport_feedback_observer() {
36 return &send_side_cc_;
37}
38
39RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +020040 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -070041}
42
sprangdb2a9fc2017-08-09 06:42:32 -070043const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
44 return keepalive_;
45}
46
Stefan Holmer5c8942a2017-08-22 16:16:44 +020047void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
48 int min_send_bitrate_bps,
49 int max_padding_bitrate_bps) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000050 pacer_.SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
Stefan Holmer5c8942a2017-08-22 16:16:44 +020051}
52
sprangdb2a9fc2017-08-09 06:42:32 -070053void RtpTransportControllerSend::SetKeepAliveConfig(
54 const RtpKeepAliveConfig& config) {
55 keepalive_ = config;
56}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +010057Module* RtpTransportControllerSend::GetPacerModule() {
58 return &pacer_;
59}
60void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
61 pacer_.SetPacingFactor(pacing_factor);
62}
63void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
64 pacer_.SetQueueTimeLimit(limit_ms);
65}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010066Module* RtpTransportControllerSend::GetModule() {
67 return &send_side_cc_;
68}
69CallStatsObserver* RtpTransportControllerSend::GetCallStatsObserver() {
70 return &send_side_cc_;
71}
72void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
73 PacketFeedbackObserver* observer) {
74 send_side_cc_.RegisterPacketFeedbackObserver(observer);
75}
76void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
77 PacketFeedbackObserver* observer) {
78 send_side_cc_.DeRegisterPacketFeedbackObserver(observer);
79}
80void RtpTransportControllerSend::RegisterNetworkObserver(
81 NetworkChangedObserver* observer) {
82 send_side_cc_.RegisterNetworkObserver(observer);
83}
84void RtpTransportControllerSend::DeRegisterNetworkObserver(
85 NetworkChangedObserver* observer) {
86 send_side_cc_.DeRegisterNetworkObserver(observer);
87}
Sebastian Janssone4be6da2018-02-15 16:51:41 +010088void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010089 const std::string& transport_name,
90 const rtc::NetworkRoute& network_route) {
91 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
92 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
93 << ": new local network id "
94 << network_route.local_network_id
95 << " new remote network id "
96 << network_route.remote_network_id
97 << " Reset bitrates to min: "
98 << bitrate_config.min_bitrate_bps
99 << " bps, start: " << bitrate_config.start_bitrate_bps
100 << " bps, max: " << bitrate_config.max_bitrate_bps
101 << " bps.";
102 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
103 send_side_cc_.OnNetworkRouteChanged(
104 network_route, bitrate_config.start_bitrate_bps,
105 bitrate_config.min_bitrate_bps, bitrate_config.max_bitrate_bps);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100106}
107void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
108 send_side_cc_.SignalNetworkState(network_available ? kNetworkUp
109 : kNetworkDown);
110}
111void RtpTransportControllerSend::SetTransportOverhead(
112 size_t transport_overhead_bytes_per_packet) {
113 send_side_cc_.SetTransportOverhead(transport_overhead_bytes_per_packet);
114}
115RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
116 return send_side_cc_.GetBandwidthObserver();
117}
118bool RtpTransportControllerSend::AvailableBandwidth(uint32_t* bandwidth) const {
119 return send_side_cc_.AvailableBandwidth(bandwidth);
120}
121int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
122 return send_side_cc_.GetPacerQueuingDelayMs();
123}
124int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
125 return send_side_cc_.GetFirstPacketTimeMs();
126}
127RateLimiter* RtpTransportControllerSend::GetRetransmissionRateLimiter() {
128 return send_side_cc_.GetRetransmissionRateLimiter();
129}
130void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
131 send_side_cc_.EnablePeriodicAlrProbing(enable);
132}
133void RtpTransportControllerSend::OnSentPacket(
134 const rtc::SentPacket& sent_packet) {
135 send_side_cc_.OnSentPacket(sent_packet);
136}
sprangdb2a9fc2017-08-09 06:42:32 -0700137
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100138void RtpTransportControllerSend::SetSdpBitrateParameters(
139 const BitrateConstraints& constraints) {
140 rtc::Optional<BitrateConstraints> updated =
141 bitrate_configurator_.UpdateWithSdpParameters(constraints);
142 if (updated.has_value()) {
143 send_side_cc_.SetBweBitrates(updated->min_bitrate_bps,
144 updated->start_bitrate_bps,
145 updated->max_bitrate_bps);
146 } else {
147 RTC_LOG(LS_VERBOSE)
148 << "WebRTC.RtpTransportControllerSend.SetBitrateConfig: "
149 << "nothing to update";
150 }
151}
152
153void RtpTransportControllerSend::SetClientBitratePreferences(
154 const BitrateConstraintsMask& preferences) {
155 rtc::Optional<BitrateConstraints> updated =
156 bitrate_configurator_.UpdateWithClientPreferences(preferences);
157 if (updated.has_value()) {
158 send_side_cc_.SetBweBitrates(updated->min_bitrate_bps,
159 updated->start_bitrate_bps,
160 updated->max_bitrate_bps);
161 } else {
162 RTC_LOG(LS_VERBOSE)
163 << "WebRTC.RtpTransportControllerSend.SetBitrateConfigMask: "
164 << "nothing to update";
165 }
166}
nissecae45d02017-04-24 05:53:20 -0700167} // namespace webrtc