blob: 20c7627d8059a86cbae0c23c82d26fd81e8e0702 [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 */
Jonas Olssona4d87372019-07-05 19:08:33 +020010#include "call/rtp_transport_controller_send.h"
11
Sebastian Jansson91bb6672018-02-21 13:02:51 +010012#include <utility>
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020013#include <vector>
nissecae45d02017-04-24 05:53:20 -070014
Karl Wiberg918f50c2018-07-05 11:40:33 +020015#include "absl/memory/memory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010016#include "absl/types/optional.h"
Sebastian Jansson87609be2018-12-05 17:35:35 +010017#include "api/transport/goog_cc_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "api/transport/network_types.h"
19#include "api/units/data_rate.h"
20#include "api/units/time_delta.h"
21#include "api/units/timestamp.h"
Yves Gerey3e707812018-11-28 16:47:49 +010022#include "call/rtp_video_sender.h"
Sebastian Jansson166b45d2019-05-13 11:57:42 +020023#include "logging/rtc_event_log/events/rtc_event_route_change.h"
Yves Gerey3e707812018-11-28 16:47:49 +010024#include "rtc_base/checks.h"
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010025#include "rtc_base/location.h"
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010026#include "rtc_base/logging.h"
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020027#include "rtc_base/rate_limiter.h"
Sebastian Jansson19bea512018-03-13 19:07:46 +010028#include "system_wrappers/include/field_trial.h"
nissecae45d02017-04-24 05:53:20 -070029
30namespace webrtc {
Sebastian Jansson19bea512018-03-13 19:07:46 +010031namespace {
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020032static const int64_t kRetransmitWindowSizeMs = 500;
Stefan Holmer64be7fa2018-10-04 15:21:55 +020033static const size_t kMaxOverheadBytes = 500;
Sebastian Jansson19bea512018-03-13 19:07:46 +010034
Sebastian Janssonecb68972019-01-18 10:30:54 +010035constexpr TimeDelta kPacerQueueUpdateInterval = TimeDelta::Millis<25>();
Sebastian Jansson87609be2018-12-05 17:35:35 +010036
37TargetRateConstraints ConvertConstraints(int min_bitrate_bps,
38 int max_bitrate_bps,
39 int start_bitrate_bps,
Sebastian Janssonaa01f272019-01-30 11:28:59 +010040 Clock* clock) {
Sebastian Jansson87609be2018-12-05 17:35:35 +010041 TargetRateConstraints msg;
42 msg.at_time = Timestamp::ms(clock->TimeInMilliseconds());
43 msg.min_data_rate =
44 min_bitrate_bps >= 0 ? DataRate::bps(min_bitrate_bps) : DataRate::Zero();
45 msg.max_data_rate = max_bitrate_bps > 0 ? DataRate::bps(max_bitrate_bps)
46 : DataRate::Infinity();
47 if (start_bitrate_bps > 0)
48 msg.starting_rate = DataRate::bps(start_bitrate_bps);
49 return msg;
50}
51
52TargetRateConstraints ConvertConstraints(const BitrateConstraints& contraints,
Sebastian Janssonaa01f272019-01-30 11:28:59 +010053 Clock* clock) {
Sebastian Jansson87609be2018-12-05 17:35:35 +010054 return ConvertConstraints(contraints.min_bitrate_bps,
55 contraints.max_bitrate_bps,
56 contraints.start_bitrate_bps, clock);
57}
Sebastian Jansson19bea512018-03-13 19:07:46 +010058} // namespace
nissecae45d02017-04-24 05:53:20 -070059
60RtpTransportControllerSend::RtpTransportControllerSend(
61 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010062 webrtc::RtcEventLog* event_log,
Ying Wang0810a7c2019-04-10 13:48:24 +020063 NetworkStatePredictorFactoryInterface* predictor_factory,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020064 NetworkControllerFactoryInterface* controller_factory,
Sebastian Janssoned50e6c2019-03-01 14:45:21 +010065 const BitrateConstraints& bitrate_config,
66 std::unique_ptr<ProcessThread> process_thread,
67 TaskQueueFactory* task_queue_factory)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010068 : clock_(clock),
Sebastian Jansson166b45d2019-05-13 11:57:42 +020069 event_log_(event_log),
Sebastian Jansson19704ec2018-03-12 15:59:12 +010070 pacer_(clock, &packet_router_, event_log),
Sebastian Jansson317a5222018-03-16 15:36:37 +010071 bitrate_configurator_(bitrate_config),
Sebastian Janssoned50e6c2019-03-01 14:45:21 +010072 process_thread_(std::move(process_thread)),
Sebastian Jansson317a5222018-03-16 15:36:37 +010073 observer_(nullptr),
Sebastian Jansson87609be2018-12-05 17:35:35 +010074 controller_factory_override_(controller_factory),
75 controller_factory_fallback_(
Sebastian Janssondf88cc02019-04-15 15:42:25 +020076 absl::make_unique<GoogCcNetworkControllerFactory>(predictor_factory)),
Sebastian Jansson87609be2018-12-05 17:35:35 +010077 process_interval_(controller_factory_fallback_->GetProcessInterval()),
78 last_report_block_time_(Timestamp::ms(clock_->TimeInMilliseconds())),
79 reset_feedback_on_route_change_(
80 !field_trial::IsEnabled("WebRTC-Bwe-NoFeedbackReset")),
81 send_side_bwe_with_overhead_(
82 webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
Christoffer Rodbroc610e262019-01-08 10:49:19 +010083 add_pacing_to_cwin_(
84 field_trial::IsEnabled("WebRTC-AddPacingToCongestionWindowPushback")),
Sebastian Jansson87609be2018-12-05 17:35:35 +010085 transport_overhead_bytes_per_packet_(0),
86 network_available_(false),
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020087 retransmission_rate_limiter_(clock, kRetransmitWindowSizeMs),
Sebastian Janssoned50e6c2019-03-01 14:45:21 +010088 task_queue_(task_queue_factory->CreateTaskQueue(
89 "rtp_send_controller",
90 TaskQueueFactory::Priority::NORMAL)) {
Sebastian Jansson87609be2018-12-05 17:35:35 +010091 initial_config_.constraints = ConvertConstraints(bitrate_config, clock_);
Sebastian Janssondf88cc02019-04-15 15:42:25 +020092 initial_config_.event_log = event_log;
93 initial_config_.key_value_config = &trial_based_config_;
Sebastian Jansson87609be2018-12-05 17:35:35 +010094 RTC_DCHECK(bitrate_config.start_bitrate_bps > 0);
95
Erik Språng425d6aa2019-07-29 16:38:27 +020096 pacer()->SetPacingRates(DataRate::bps(bitrate_config.start_bitrate_bps),
97 DataRate::Zero());
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020098
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010099 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +0100100 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100101}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +0100102
103RtpTransportControllerSend::~RtpTransportControllerSend() {
104 process_thread_->Stop();
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +0100105 process_thread_->DeRegisterModule(&pacer_);
106}
nissecae45d02017-04-24 05:53:20 -0700107
Stefan Holmer9416ef82018-07-19 10:34:38 +0200108RtpVideoSenderInterface* RtpTransportControllerSend::CreateRtpVideoSender(
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200109 std::map<uint32_t, RtpState> suspended_ssrcs,
110 const std::map<uint32_t, RtpPayloadState>& states,
111 const RtpConfig& rtp_config,
Jiawei Ou55718122018-11-09 13:17:39 -0800112 int rtcp_report_interval_ms,
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200113 Transport* send_transport,
114 const RtpSenderObservers& observers,
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200115 RtcEventLog* event_log,
Benjamin Wright192eeec2018-10-17 17:27:25 -0700116 std::unique_ptr<FecController> fec_controller,
117 const RtpSenderFrameEncryptionConfig& frame_encryption_config) {
Stefan Holmer9416ef82018-07-19 10:34:38 +0200118 video_rtp_senders_.push_back(absl::make_unique<RtpVideoSender>(
Sebastian Jansson572c60f2019-03-04 18:30:41 +0100119 clock_, suspended_ssrcs, states, rtp_config, rtcp_report_interval_ms,
Oleh Prypine8964902019-03-29 15:33:01 +0000120 send_transport, observers,
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200121 // TODO(holmer): Remove this circular dependency by injecting
122 // the parts of RtpTransportControllerSendInterface that are really used.
Benjamin Wright192eeec2018-10-17 17:27:25 -0700123 this, event_log, &retransmission_rate_limiter_, std::move(fec_controller),
124 frame_encryption_config.frame_encryptor,
125 frame_encryption_config.crypto_options));
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200126 return video_rtp_senders_.back().get();
127}
128
Stefan Holmer9416ef82018-07-19 10:34:38 +0200129void RtpTransportControllerSend::DestroyRtpVideoSender(
130 RtpVideoSenderInterface* rtp_video_sender) {
131 std::vector<std::unique_ptr<RtpVideoSenderInterface>>::iterator it =
Stefan Holmer5ed25af2018-07-18 15:17:14 +0200132 video_rtp_senders_.end();
133 for (it = video_rtp_senders_.begin(); it != video_rtp_senders_.end(); ++it) {
134 if (it->get() == rtp_video_sender) {
135 break;
136 }
137 }
138 RTC_DCHECK(it != video_rtp_senders_.end());
139 video_rtp_senders_.erase(it);
140}
141
Sebastian Jansson16180952018-12-12 16:49:10 +0100142void RtpTransportControllerSend::UpdateControlState() {
143 absl::optional<TargetTransferRate> update = control_handler_->GetUpdate();
144 if (!update)
145 return;
146 retransmission_rate_limiter_.SetMaxRate(
147 update->network_estimate.bandwidth.bps());
148 // We won't create control_handler_ until we have an observers.
Sebastian Jansson87609be2018-12-05 17:35:35 +0100149 RTC_DCHECK(observer_ != nullptr);
Sebastian Jansson16180952018-12-12 16:49:10 +0100150 observer_->OnTargetTransferRate(*update);
Sebastian Janssone6256052018-05-04 14:08:15 +0200151}
152
Erik Språng425d6aa2019-07-29 16:38:27 +0200153RtpPacketPacer* RtpTransportControllerSend::pacer() {
154 // TODO(bugs.webrtc.org/10809): Return reference to the correct
155 // pacer implementation.
156 return &pacer_;
157}
158
159const RtpPacketPacer* RtpTransportControllerSend::pacer() const {
160 // TODO(bugs.webrtc.org/10809): Return reference to the correct
161 // pacer implementation.
162 return &pacer_;
163}
164
Sebastian Janssone6256052018-05-04 14:08:15 +0200165rtc::TaskQueue* RtpTransportControllerSend::GetWorkerQueue() {
166 return &task_queue_;
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100167}
168
nisse76e62b02017-05-31 02:24:52 -0700169PacketRouter* RtpTransportControllerSend::packet_router() {
170 return &packet_router_;
171}
172
Sebastian Janssone1795f42019-07-24 11:38:03 +0200173NetworkStateEstimateObserver*
174RtpTransportControllerSend::network_state_estimate_observer() {
175 return this;
176}
177
nisse76e62b02017-05-31 02:24:52 -0700178TransportFeedbackObserver*
179RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100180 return this;
nisse76e62b02017-05-31 02:24:52 -0700181}
182
Erik Språngaa59eca2019-07-24 14:52:55 +0200183RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Erik Språng425d6aa2019-07-29 16:38:27 +0200184 // TODO(bugs.webrtc.org/10809): Return reference to the correct
185 // pacer implementation.
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200186 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700187}
188
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200189void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
190 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +0100191 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +0100192 int max_total_bitrate_bps) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100193 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson11e55ee2019-03-06 16:58:18 +0100194 streams_config_.min_total_allocated_bitrate =
195 DataRate::bps(min_send_bitrate_bps);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100196 streams_config_.max_padding_rate = DataRate::bps(max_padding_bitrate_bps);
197 streams_config_.max_total_allocated_bitrate =
198 DataRate::bps(max_total_bitrate_bps);
199 UpdateStreamsConfig();
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200200}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100201void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100202 RTC_DCHECK_RUN_ON(&task_queue_);
203 streams_config_.pacing_factor = pacing_factor;
204 UpdateStreamsConfig();
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100205}
206void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
Erik Språng425d6aa2019-07-29 16:38:27 +0200207 pacer()->SetQueueTimeLimit(TimeDelta::ms(limit_ms));
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100208}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100209void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
210 PacketFeedbackObserver* observer) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100211 transport_feedback_adapter_.RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100212}
213void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
214 PacketFeedbackObserver* observer) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100215 transport_feedback_adapter_.DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100216}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100217
218void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
219 TargetTransferRateObserver* observer) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100220 task_queue_.PostTask([this, observer] {
221 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100222 RTC_DCHECK(observer_ == nullptr);
223 observer_ = observer;
Sebastian Jansson2701bc92018-12-11 15:02:47 +0100224 observer_->OnStartRateUpdate(*initial_config_.constraints.starting_rate);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100225 MaybeCreateControllers();
226 });
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100227}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100228void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100229 const std::string& transport_name,
230 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100231 // Check if the network route is connected.
232 if (!network_route.connected) {
233 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
234 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
235 // consider merging these two methods.
236 return;
237 }
238
239 // Check whether the network route has changed on each transport.
240 auto result =
241 network_routes_.insert(std::make_pair(transport_name, network_route));
242 auto kv = result.first;
243 bool inserted = result.second;
244 if (inserted) {
245 // No need to reset BWE if this is the first time the network connects.
246 return;
247 }
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100248 if (kv->second.connected != network_route.connected ||
249 kv->second.local_network_id != network_route.local_network_id ||
250 kv->second.remote_network_id != network_route.remote_network_id) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100251 kv->second = network_route;
252 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
253 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
254 << ": new local network id "
255 << network_route.local_network_id
256 << " new remote network id "
257 << network_route.remote_network_id
258 << " Reset bitrates to min: "
259 << bitrate_config.min_bitrate_bps
260 << " bps, start: " << bitrate_config.start_bitrate_bps
261 << " bps, max: " << bitrate_config.max_bitrate_bps
262 << " bps.";
263 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100264
265 if (reset_feedback_on_route_change_)
266 transport_feedback_adapter_.SetNetworkIds(
267 network_route.local_network_id, network_route.remote_network_id);
268 transport_overhead_bytes_per_packet_ = network_route.packet_overhead;
269
Sebastian Jansson166b45d2019-05-13 11:57:42 +0200270 if (event_log_) {
271 event_log_->Log(absl::make_unique<RtcEventRouteChange>(
272 network_route.connected, network_route.packet_overhead));
273 }
Sebastian Jansson87609be2018-12-05 17:35:35 +0100274 NetworkRouteChange msg;
275 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
276 msg.constraints = ConvertConstraints(bitrate_config, clock_);
277 task_queue_.PostTask([this, msg] {
278 RTC_DCHECK_RUN_ON(&task_queue_);
279 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100280 PostUpdates(controller_->OnNetworkRouteChange(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100281 } else {
282 UpdateInitialConstraints(msg.constraints);
283 }
Erik Språng425d6aa2019-07-29 16:38:27 +0200284 pacer()->UpdateOutstandingData(DataSize::Zero());
Sebastian Jansson87609be2018-12-05 17:35:35 +0100285 });
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100286 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100287}
288void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100289 RTC_LOG(LS_INFO) << "SignalNetworkState "
290 << (network_available ? "Up" : "Down");
291 NetworkAvailability msg;
292 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
293 msg.network_available = network_available;
294 task_queue_.PostTask([this, msg]() {
295 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson16180952018-12-12 16:49:10 +0100296 if (network_available_ == msg.network_available)
297 return;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100298 network_available_ = msg.network_available;
Sebastian Jansson16180952018-12-12 16:49:10 +0100299 if (network_available_) {
Erik Språng425d6aa2019-07-29 16:38:27 +0200300 pacer()->Resume();
Sebastian Jansson16180952018-12-12 16:49:10 +0100301 } else {
Erik Språng425d6aa2019-07-29 16:38:27 +0200302 pacer()->Pause();
Sebastian Jansson16180952018-12-12 16:49:10 +0100303 }
Erik Språng425d6aa2019-07-29 16:38:27 +0200304 pacer()->UpdateOutstandingData(DataSize::Zero());
Sebastian Jansson16180952018-12-12 16:49:10 +0100305
Sebastian Jansson87609be2018-12-05 17:35:35 +0100306 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100307 control_handler_->SetNetworkAvailability(network_available_);
308 PostUpdates(controller_->OnNetworkAvailability(msg));
309 UpdateControlState();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100310 } else {
311 MaybeCreateControllers();
312 }
313 });
314
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200315 for (auto& rtp_sender : video_rtp_senders_) {
316 rtp_sender->OnNetworkAvailability(network_available);
317 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100318}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100319RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100320 return this;
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100321}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100322int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Erik Språng425d6aa2019-07-29 16:38:27 +0200323 return pacer()->OldestPacketWaitTime().ms();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100324}
Erik Språng425d6aa2019-07-29 16:38:27 +0200325absl::optional<Timestamp> RtpTransportControllerSend::GetFirstPacketTime()
326 const {
327 return pacer()->FirstSentPacketTime();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100328}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100329void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100330 task_queue_.PostTask([this, enable]() {
331 RTC_DCHECK_RUN_ON(&task_queue_);
332 streams_config_.requests_alr_probing = enable;
333 UpdateStreamsConfig();
334 });
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100335}
336void RtpTransportControllerSend::OnSentPacket(
337 const rtc::SentPacket& sent_packet) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100338 absl::optional<SentPacket> packet_msg =
339 transport_feedback_adapter_.ProcessSentPacket(sent_packet);
340 if (packet_msg) {
341 task_queue_.PostTask([this, packet_msg]() {
342 RTC_DCHECK_RUN_ON(&task_queue_);
343 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100344 PostUpdates(controller_->OnSentPacket(*packet_msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100345 });
346 }
Erik Språng425d6aa2019-07-29 16:38:27 +0200347 pacer()->UpdateOutstandingData(
348 transport_feedback_adapter_.GetOutstandingData());
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100349}
sprangdb2a9fc2017-08-09 06:42:32 -0700350
Ying Wang8b279102019-05-27 17:19:08 +0200351void RtpTransportControllerSend::OnReceivedPacket(
Sebastian Jansson607a6f12019-06-13 17:48:53 +0200352 const ReceivedPacket& packet_msg) {
Ying Wang8b279102019-05-27 17:19:08 +0200353 task_queue_.PostTask([this, packet_msg]() {
354 RTC_DCHECK_RUN_ON(&task_queue_);
355 if (controller_)
356 PostUpdates(controller_->OnReceivedPacket(packet_msg));
357 });
358}
359
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100360void RtpTransportControllerSend::SetSdpBitrateParameters(
361 const BitrateConstraints& constraints) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200362 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100363 bitrate_configurator_.UpdateWithSdpParameters(constraints);
364 if (updated.has_value()) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100365 TargetRateConstraints msg = ConvertConstraints(*updated, clock_);
366 task_queue_.PostTask([this, msg]() {
367 RTC_DCHECK_RUN_ON(&task_queue_);
368 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100369 PostUpdates(controller_->OnTargetRateConstraints(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100370 } else {
371 UpdateInitialConstraints(msg);
372 }
373 });
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100374 } else {
375 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100376 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100377 << "nothing to update";
378 }
379}
380
381void RtpTransportControllerSend::SetClientBitratePreferences(
Niels Möller0c4f7be2018-05-07 14:01:37 +0200382 const BitrateSettings& preferences) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200383 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100384 bitrate_configurator_.UpdateWithClientPreferences(preferences);
385 if (updated.has_value()) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100386 TargetRateConstraints msg = ConvertConstraints(*updated, clock_);
387 task_queue_.PostTask([this, msg]() {
388 RTC_DCHECK_RUN_ON(&task_queue_);
389 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100390 PostUpdates(controller_->OnTargetRateConstraints(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100391 } else {
392 UpdateInitialConstraints(msg);
393 }
394 });
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100395 } else {
396 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100397 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100398 << "nothing to update";
399 }
400}
Alex Narestbcf91802018-06-25 16:08:36 +0200401
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200402void RtpTransportControllerSend::OnTransportOverheadChanged(
403 size_t transport_overhead_bytes_per_packet) {
404 if (transport_overhead_bytes_per_packet >= kMaxOverheadBytes) {
405 RTC_LOG(LS_ERROR) << "Transport overhead exceeds " << kMaxOverheadBytes;
406 return;
407 }
408
409 // TODO(holmer): Call AudioRtpSenders when they have been moved to
410 // RtpTransportControllerSend.
411 for (auto& rtp_video_sender : video_rtp_senders_) {
412 rtp_video_sender->OnTransportOverheadChanged(
413 transport_overhead_bytes_per_packet);
414 }
415}
Sebastian Jansson87609be2018-12-05 17:35:35 +0100416
Erik Språngaa59eca2019-07-24 14:52:55 +0200417void RtpTransportControllerSend::AccountForAudioPacketsInPacedSender(
418 bool account_for_audio) {
Erik Språng425d6aa2019-07-29 16:38:27 +0200419 pacer()->SetAccountForAudioPackets(account_for_audio);
Erik Språngaa59eca2019-07-24 14:52:55 +0200420}
421
Sebastian Jansson87609be2018-12-05 17:35:35 +0100422void RtpTransportControllerSend::OnReceivedEstimatedBitrate(uint32_t bitrate) {
423 RemoteBitrateReport msg;
424 msg.receive_time = Timestamp::ms(clock_->TimeInMilliseconds());
425 msg.bandwidth = DataRate::bps(bitrate);
426 task_queue_.PostTask([this, msg]() {
427 RTC_DCHECK_RUN_ON(&task_queue_);
428 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100429 PostUpdates(controller_->OnRemoteBitrateReport(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100430 });
431}
432
433void RtpTransportControllerSend::OnReceivedRtcpReceiverReport(
434 const ReportBlockList& report_blocks,
435 int64_t rtt_ms,
436 int64_t now_ms) {
437 task_queue_.PostTask([this, report_blocks, now_ms]() {
438 RTC_DCHECK_RUN_ON(&task_queue_);
439 OnReceivedRtcpReceiverReportBlocks(report_blocks, now_ms);
440 });
441
442 task_queue_.PostTask([this, now_ms, rtt_ms]() {
443 RTC_DCHECK_RUN_ON(&task_queue_);
444 RoundTripTimeUpdate report;
445 report.receive_time = Timestamp::ms(now_ms);
446 report.round_trip_time = TimeDelta::ms(rtt_ms);
447 report.smoothed = false;
Christoffer Rodbro4bd31772019-03-27 12:34:21 +0100448 if (controller_ && !report.round_trip_time.IsZero())
Sebastian Jansson16180952018-12-12 16:49:10 +0100449 PostUpdates(controller_->OnRoundTripTimeUpdate(report));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100450 });
451}
452
Erik Språng30a276b2019-04-23 12:00:11 +0200453void RtpTransportControllerSend::OnAddPacket(
454 const RtpPacketSendInfo& packet_info) {
Sebastian Jansson05acd2b2019-01-21 13:07:47 +0100455 transport_feedback_adapter_.AddPacket(
Erik Språng30a276b2019-04-23 12:00:11 +0200456 packet_info,
457 send_side_bwe_with_overhead_ ? transport_overhead_bytes_per_packet_.load()
458 : 0,
Sebastian Jansson05acd2b2019-01-21 13:07:47 +0100459 Timestamp::ms(clock_->TimeInMilliseconds()));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100460}
461
462void RtpTransportControllerSend::OnTransportFeedback(
463 const rtcp::TransportFeedback& feedback) {
464 RTC_DCHECK_RUNS_SERIALIZED(&worker_race_);
465
466 absl::optional<TransportPacketsFeedback> feedback_msg =
Sebastian Jansson05acd2b2019-01-21 13:07:47 +0100467 transport_feedback_adapter_.ProcessTransportFeedback(
468 feedback, Timestamp::ms(clock_->TimeInMilliseconds()));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100469 if (feedback_msg) {
470 task_queue_.PostTask([this, feedback_msg]() {
471 RTC_DCHECK_RUN_ON(&task_queue_);
472 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100473 PostUpdates(controller_->OnTransportPacketsFeedback(*feedback_msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100474 });
475 }
Erik Språng425d6aa2019-07-29 16:38:27 +0200476 pacer()->UpdateOutstandingData(
477 transport_feedback_adapter_.GetOutstandingData());
Sebastian Jansson87609be2018-12-05 17:35:35 +0100478}
479
Sebastian Janssone1795f42019-07-24 11:38:03 +0200480void RtpTransportControllerSend::OnRemoteNetworkEstimate(
481 NetworkStateEstimate estimate) {
482 estimate.update_time = Timestamp::ms(clock_->TimeInMilliseconds());
483 task_queue_.PostTask([this, estimate] {
484 RTC_DCHECK_RUN_ON(&task_queue_);
485 if (controller_)
486 controller_->OnNetworkStateEstimate(estimate);
487 });
488}
489
Sebastian Jansson87609be2018-12-05 17:35:35 +0100490void RtpTransportControllerSend::MaybeCreateControllers() {
491 RTC_DCHECK(!controller_);
492 RTC_DCHECK(!control_handler_);
493
494 if (!network_available_ || !observer_)
495 return;
Sebastian Jansson16180952018-12-12 16:49:10 +0100496 control_handler_ = absl::make_unique<CongestionControlHandler>();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100497
498 initial_config_.constraints.at_time =
499 Timestamp::ms(clock_->TimeInMilliseconds());
500 initial_config_.stream_based_config = streams_config_;
501
502 // TODO(srte): Use fallback controller if no feedback is available.
503 if (controller_factory_override_) {
504 RTC_LOG(LS_INFO) << "Creating overridden congestion controller";
505 controller_ = controller_factory_override_->Create(initial_config_);
506 process_interval_ = controller_factory_override_->GetProcessInterval();
507 } else {
508 RTC_LOG(LS_INFO) << "Creating fallback congestion controller";
509 controller_ = controller_factory_fallback_->Create(initial_config_);
510 process_interval_ = controller_factory_fallback_->GetProcessInterval();
511 }
512 UpdateControllerWithTimeInterval();
513 StartProcessPeriodicTasks();
514}
515
516void RtpTransportControllerSend::UpdateInitialConstraints(
517 TargetRateConstraints new_contraints) {
518 if (!new_contraints.starting_rate)
519 new_contraints.starting_rate = initial_config_.constraints.starting_rate;
520 RTC_DCHECK(new_contraints.starting_rate);
521 initial_config_.constraints = new_contraints;
522}
523
524void RtpTransportControllerSend::StartProcessPeriodicTasks() {
Sebastian Janssonecb68972019-01-18 10:30:54 +0100525 if (!pacer_queue_update_task_.Running()) {
526 pacer_queue_update_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov4423c362019-03-06 18:41:39 +0100527 task_queue_.Get(), kPacerQueueUpdateInterval, [this]() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100528 RTC_DCHECK_RUN_ON(&task_queue_);
Erik Språng425d6aa2019-07-29 16:38:27 +0200529 TimeDelta expected_queue_time = pacer()->ExpectedQueueTime();
Sebastian Jansson16180952018-12-12 16:49:10 +0100530 control_handler_->SetPacerQueue(expected_queue_time);
531 UpdateControlState();
Sebastian Janssonecb68972019-01-18 10:30:54 +0100532 return kPacerQueueUpdateInterval;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100533 });
534 }
Sebastian Janssonecb68972019-01-18 10:30:54 +0100535 controller_task_.Stop();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100536 if (process_interval_.IsFinite()) {
Sebastian Janssonecb68972019-01-18 10:30:54 +0100537 controller_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov4423c362019-03-06 18:41:39 +0100538 task_queue_.Get(), process_interval_, [this]() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100539 RTC_DCHECK_RUN_ON(&task_queue_);
540 UpdateControllerWithTimeInterval();
Sebastian Janssonecb68972019-01-18 10:30:54 +0100541 return process_interval_;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100542 });
543 }
544}
545
546void RtpTransportControllerSend::UpdateControllerWithTimeInterval() {
Sebastian Jansson16180952018-12-12 16:49:10 +0100547 RTC_DCHECK(controller_);
548 ProcessInterval msg;
549 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
Christoffer Rodbroc610e262019-01-08 10:49:19 +0100550 if (add_pacing_to_cwin_)
Erik Språng425d6aa2019-07-29 16:38:27 +0200551 msg.pacer_queue = pacer()->QueueSizeData();
Sebastian Jansson16180952018-12-12 16:49:10 +0100552 PostUpdates(controller_->OnProcessInterval(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100553}
554
555void RtpTransportControllerSend::UpdateStreamsConfig() {
556 streams_config_.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
557 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100558 PostUpdates(controller_->OnStreamsConfig(streams_config_));
559}
560
561void RtpTransportControllerSend::PostUpdates(NetworkControlUpdate update) {
562 if (update.congestion_window) {
Erik Språng425d6aa2019-07-29 16:38:27 +0200563 pacer()->SetCongestionWindow(*update.congestion_window);
Sebastian Jansson16180952018-12-12 16:49:10 +0100564 }
565 if (update.pacer_config) {
Erik Språng425d6aa2019-07-29 16:38:27 +0200566 pacer()->SetPacingRates(update.pacer_config->data_rate(),
567 update.pacer_config->pad_rate());
Sebastian Jansson16180952018-12-12 16:49:10 +0100568 }
569 for (const auto& probe : update.probe_cluster_configs) {
Erik Språng425d6aa2019-07-29 16:38:27 +0200570 pacer()->CreateProbeCluster(probe.target_data_rate, probe.id);
Sebastian Jansson16180952018-12-12 16:49:10 +0100571 }
572 if (update.target_rate) {
573 control_handler_->SetTargetRate(*update.target_rate);
574 UpdateControlState();
575 }
Sebastian Jansson87609be2018-12-05 17:35:35 +0100576}
577
578void RtpTransportControllerSend::OnReceivedRtcpReceiverReportBlocks(
579 const ReportBlockList& report_blocks,
580 int64_t now_ms) {
581 if (report_blocks.empty())
582 return;
583
584 int total_packets_lost_delta = 0;
585 int total_packets_delta = 0;
586
587 // Compute the packet loss from all report blocks.
588 for (const RTCPReportBlock& report_block : report_blocks) {
589 auto it = last_report_blocks_.find(report_block.source_ssrc);
590 if (it != last_report_blocks_.end()) {
591 auto number_of_packets = report_block.extended_highest_sequence_number -
592 it->second.extended_highest_sequence_number;
593 total_packets_delta += number_of_packets;
594 auto lost_delta = report_block.packets_lost - it->second.packets_lost;
595 total_packets_lost_delta += lost_delta;
596 }
597 last_report_blocks_[report_block.source_ssrc] = report_block;
598 }
599 // Can only compute delta if there has been previous blocks to compare to. If
600 // not, total_packets_delta will be unchanged and there's nothing more to do.
601 if (!total_packets_delta)
602 return;
603 int packets_received_delta = total_packets_delta - total_packets_lost_delta;
604 // To detect lost packets, at least one packet has to be received. This check
605 // is needed to avoid bandwith detection update in
606 // VideoSendStreamTest.SuspendBelowMinBitrate
607
608 if (packets_received_delta < 1)
609 return;
610 Timestamp now = Timestamp::ms(now_ms);
611 TransportLossReport msg;
612 msg.packets_lost_delta = total_packets_lost_delta;
613 msg.packets_received_delta = packets_received_delta;
614 msg.receive_time = now;
615 msg.start_time = last_report_block_time_;
616 msg.end_time = now;
617 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100618 PostUpdates(controller_->OnTransportLossReport(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100619 last_report_block_time_ = now;
620}
621
nissecae45d02017-04-24 05:53:20 -0700622} // namespace webrtc