blob: e80713c7d361a06d2e6648fb21dd671e4d2c70f8 [file] [log] [blame]
nissecae45d02017-04-24 12:53:201/*
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 17:08:3310#include "call/rtp_transport_controller_send.h"
11
Mirko Bonadei317a1f02019-09-17 15:06:1812#include <memory>
Sebastian Jansson91bb6672018-02-21 12:02:5113#include <utility>
Stefan Holmerdbdb3a02018-07-17 14:03:4614#include <vector>
nissecae45d02017-04-24 12:53:2015
Yves Gerey3e707812018-11-28 15:47:4916#include "absl/types/optional.h"
Sebastian Jansson87609be2018-12-05 16:35:3517#include "api/transport/goog_cc_factory.h"
Yves Gerey3e707812018-11-28 15:47:4918#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 15:47:4922#include "call/rtp_video_sender.h"
Sebastian Jansson0a5ed892019-09-18 13:37:3123#include "logging/rtc_event_log/events/rtc_event_remote_estimate.h"
Sebastian Jansson166b45d2019-05-13 09:57:4224#include "logging/rtc_event_log/events/rtc_event_route_change.h"
Sebastian Jansson658f1812020-01-16 09:59:2825#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
Yves Gerey3e707812018-11-28 15:47:4926#include "rtc_base/checks.h"
Sebastian Jansson97f61ea2018-02-21 12:01:5527#include "rtc_base/logging.h"
Stefan Holmerdbdb3a02018-07-17 14:03:4628#include "rtc_base/rate_limiter.h"
nissecae45d02017-04-24 12:53:2029
30namespace webrtc {
Sebastian Jansson19bea512018-03-13 18:07:4631namespace {
Stefan Holmerdbdb3a02018-07-17 14:03:4632static const int64_t kRetransmitWindowSizeMs = 500;
Stefan Holmer64be7fa2018-10-04 13:21:5533static const size_t kMaxOverheadBytes = 500;
Sebastian Jansson19bea512018-03-13 18:07:4634
Danil Chapovalov0c626af2020-02-10 10:16:0035constexpr TimeDelta kPacerQueueUpdateInterval = TimeDelta::Millis(25);
Sebastian Jansson87609be2018-12-05 16:35:3536
37TargetRateConstraints ConvertConstraints(int min_bitrate_bps,
38 int max_bitrate_bps,
39 int start_bitrate_bps,
Sebastian Janssonaa01f272019-01-30 10:28:5940 Clock* clock) {
Sebastian Jansson87609be2018-12-05 16:35:3541 TargetRateConstraints msg;
Danil Chapovalov0c626af2020-02-10 10:16:0042 msg.at_time = Timestamp::Millis(clock->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 16:35:3543 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 10:28:5953 Clock* clock) {
Sebastian Jansson87609be2018-12-05 16:35:3554 return ConvertConstraints(contraints.min_bitrate_bps,
55 contraints.max_bitrate_bps,
56 contraints.start_bitrate_bps, clock);
57}
Erik Språng662678d2019-11-15 16:18:5258
59bool IsEnabled(const WebRtcKeyValueConfig* trials, absl::string_view key) {
Erik Språng014dd3c2019-11-28 12:44:2560 RTC_DCHECK(trials != nullptr);
61 return trials->Lookup(key).find("Enabled") == 0;
Erik Språng662678d2019-11-15 16:18:5262}
63
Sebastian Jansson19bea512018-03-13 18:07:4664} // namespace
nissecae45d02017-04-24 12:53:2065
66RtpTransportControllerSend::RtpTransportControllerSend(
67 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 12:01:5568 webrtc::RtcEventLog* event_log,
Ying Wang0810a7c2019-04-10 11:48:2469 NetworkStatePredictorFactoryInterface* predictor_factory,
Sebastian Janssondfce03a2018-05-18 16:05:1070 NetworkControllerFactoryInterface* controller_factory,
Sebastian Janssoned50e6c2019-03-01 13:45:2171 const BitrateConstraints& bitrate_config,
72 std::unique_ptr<ProcessThread> process_thread,
Erik Språng662678d2019-11-15 16:18:5273 TaskQueueFactory* task_queue_factory,
74 const WebRtcKeyValueConfig* trials)
Sebastian Jansson19704ec2018-03-12 14:59:1275 : clock_(clock),
Sebastian Jansson166b45d2019-05-13 09:57:4276 event_log_(event_log),
Sebastian Jansson317a5222018-03-16 14:36:3777 bitrate_configurator_(bitrate_config),
Sebastian Janssoned50e6c2019-03-01 13:45:2178 process_thread_(std::move(process_thread)),
Erik Språng014dd3c2019-11-28 12:44:2579 use_task_queue_pacer_(IsEnabled(trials, "WebRTC-TaskQueuePacer")),
Erik Språng4314a492019-11-26 16:48:4980 process_thread_pacer_(use_task_queue_pacer_
81 ? nullptr
82 : new PacedSender(clock,
83 &packet_router_,
84 event_log,
Erik Språng014dd3c2019-11-28 12:44:2585 trials,
Erik Språng4314a492019-11-26 16:48:4986 process_thread_.get())),
87 task_queue_pacer_(use_task_queue_pacer_
88 ? new TaskQueuePacedSender(clock,
89 &packet_router_,
90 event_log,
Erik Språng014dd3c2019-11-28 12:44:2591 trials,
Erik Språng4314a492019-11-26 16:48:4992 task_queue_factory)
93 : nullptr),
Sebastian Jansson317a5222018-03-16 14:36:3794 observer_(nullptr),
Sebastian Jansson87609be2018-12-05 16:35:3595 controller_factory_override_(controller_factory),
96 controller_factory_fallback_(
Mirko Bonadei317a1f02019-09-17 15:06:1897 std::make_unique<GoogCcNetworkControllerFactory>(predictor_factory)),
Sebastian Jansson87609be2018-12-05 16:35:3598 process_interval_(controller_factory_fallback_->GetProcessInterval()),
Danil Chapovalov0c626af2020-02-10 10:16:0099 last_report_block_time_(Timestamp::Millis(clock_->TimeInMilliseconds())),
Sebastian Jansson87609be2018-12-05 16:35:35100 reset_feedback_on_route_change_(
Erik Språng014dd3c2019-11-28 12:44:25101 !IsEnabled(trials, "WebRTC-Bwe-NoFeedbackReset")),
Sebastian Jansson87609be2018-12-05 16:35:35102 send_side_bwe_with_overhead_(
Erik Språng014dd3c2019-11-28 12:44:25103 IsEnabled(trials, "WebRTC-SendSideBwe-WithOverhead")),
Christoffer Rodbroc610e262019-01-08 09:49:19104 add_pacing_to_cwin_(
Erik Språng014dd3c2019-11-28 12:44:25105 IsEnabled(trials, "WebRTC-AddPacingToCongestionWindowPushback")),
Sebastian Jansson87609be2018-12-05 16:35:35106 transport_overhead_bytes_per_packet_(0),
107 network_available_(false),
Stefan Holmerdbdb3a02018-07-17 14:03:46108 retransmission_rate_limiter_(clock, kRetransmitWindowSizeMs),
Sebastian Janssoned50e6c2019-03-01 13:45:21109 task_queue_(task_queue_factory->CreateTaskQueue(
110 "rtp_send_controller",
111 TaskQueueFactory::Priority::NORMAL)) {
Sebastian Jansson87609be2018-12-05 16:35:35112 initial_config_.constraints = ConvertConstraints(bitrate_config, clock_);
Sebastian Janssondf88cc02019-04-15 13:42:25113 initial_config_.event_log = event_log;
Erik Språng014dd3c2019-11-28 12:44:25114 initial_config_.key_value_config = trials;
Sebastian Jansson87609be2018-12-05 16:35:35115 RTC_DCHECK(bitrate_config.start_bitrate_bps > 0);
116
Erik Språng425d6aa2019-07-29 14:38:27117 pacer()->SetPacingRates(DataRate::bps(bitrate_config.start_bitrate_bps),
118 DataRate::Zero());
Sebastian Janssonbd9fe092018-05-07 14:33:50119
Erik Språng4314a492019-11-26 16:48:49120 if (!use_task_queue_pacer_) {
121 process_thread_->Start();
122 }
Sebastian Jansson97f61ea2018-02-21 12:01:55123}
Sebastian Janssonc33c0fc2018-02-22 10:10:18124
125RtpTransportControllerSend::~RtpTransportControllerSend() {
Erik Språng4314a492019-11-26 16:48:49126 if (!use_task_queue_pacer_) {
127 process_thread_->Stop();
128 }
Sebastian Janssonc33c0fc2018-02-22 10:10:18129}
nissecae45d02017-04-24 12:53:20130
Stefan Holmer9416ef82018-07-19 08:34:38131RtpVideoSenderInterface* RtpTransportControllerSend::CreateRtpVideoSender(
Stefan Holmerdbdb3a02018-07-17 14:03:46132 std::map<uint32_t, RtpState> suspended_ssrcs,
133 const std::map<uint32_t, RtpPayloadState>& states,
134 const RtpConfig& rtp_config,
Jiawei Ou55718122018-11-09 21:17:39135 int rtcp_report_interval_ms,
Stefan Holmerdbdb3a02018-07-17 14:03:46136 Transport* send_transport,
137 const RtpSenderObservers& observers,
Stefan Holmer64be7fa2018-10-04 13:21:55138 RtcEventLog* event_log,
Benjamin Wright192eeec2018-10-18 00:27:25139 std::unique_ptr<FecController> fec_controller,
140 const RtpSenderFrameEncryptionConfig& frame_encryption_config) {
Mirko Bonadei317a1f02019-09-17 15:06:18141 video_rtp_senders_.push_back(std::make_unique<RtpVideoSender>(
Sebastian Jansson572c60f2019-03-04 17:30:41142 clock_, suspended_ssrcs, states, rtp_config, rtcp_report_interval_ms,
Oleh Prypine8964902019-03-29 15:33:01143 send_transport, observers,
Stefan Holmerdbdb3a02018-07-17 14:03:46144 // TODO(holmer): Remove this circular dependency by injecting
145 // the parts of RtpTransportControllerSendInterface that are really used.
Benjamin Wright192eeec2018-10-18 00:27:25146 this, event_log, &retransmission_rate_limiter_, std::move(fec_controller),
147 frame_encryption_config.frame_encryptor,
148 frame_encryption_config.crypto_options));
Stefan Holmerdbdb3a02018-07-17 14:03:46149 return video_rtp_senders_.back().get();
150}
151
Stefan Holmer9416ef82018-07-19 08:34:38152void RtpTransportControllerSend::DestroyRtpVideoSender(
153 RtpVideoSenderInterface* rtp_video_sender) {
154 std::vector<std::unique_ptr<RtpVideoSenderInterface>>::iterator it =
Stefan Holmer5ed25af2018-07-18 13:17:14155 video_rtp_senders_.end();
156 for (it = video_rtp_senders_.begin(); it != video_rtp_senders_.end(); ++it) {
157 if (it->get() == rtp_video_sender) {
158 break;
159 }
160 }
161 RTC_DCHECK(it != video_rtp_senders_.end());
162 video_rtp_senders_.erase(it);
163}
164
Sebastian Jansson16180952018-12-12 15:49:10165void RtpTransportControllerSend::UpdateControlState() {
166 absl::optional<TargetTransferRate> update = control_handler_->GetUpdate();
167 if (!update)
168 return;
Sebastian Janssonf34116e2019-09-24 15:55:50169 retransmission_rate_limiter_.SetMaxRate(update->target_rate.bps());
Sebastian Jansson16180952018-12-12 15:49:10170 // We won't create control_handler_ until we have an observers.
Sebastian Jansson87609be2018-12-05 16:35:35171 RTC_DCHECK(observer_ != nullptr);
Sebastian Jansson16180952018-12-12 15:49:10172 observer_->OnTargetTransferRate(*update);
Sebastian Janssone6256052018-05-04 12:08:15173}
174
Erik Språng425d6aa2019-07-29 14:38:27175RtpPacketPacer* RtpTransportControllerSend::pacer() {
Erik Språng4314a492019-11-26 16:48:49176 if (use_task_queue_pacer_) {
177 return task_queue_pacer_.get();
178 }
179 return process_thread_pacer_.get();
Erik Språng425d6aa2019-07-29 14:38:27180}
181
182const RtpPacketPacer* RtpTransportControllerSend::pacer() const {
Erik Språng4314a492019-11-26 16:48:49183 if (use_task_queue_pacer_) {
184 return task_queue_pacer_.get();
185 }
186 return process_thread_pacer_.get();
Erik Språng425d6aa2019-07-29 14:38:27187}
188
Sebastian Janssone6256052018-05-04 12:08:15189rtc::TaskQueue* RtpTransportControllerSend::GetWorkerQueue() {
190 return &task_queue_;
Sebastian Jansson19704ec2018-03-12 14:59:12191}
192
nisse76e62b02017-05-31 09:24:52193PacketRouter* RtpTransportControllerSend::packet_router() {
194 return &packet_router_;
195}
196
Sebastian Janssone1795f42019-07-24 09:38:03197NetworkStateEstimateObserver*
198RtpTransportControllerSend::network_state_estimate_observer() {
199 return this;
200}
201
nisse76e62b02017-05-31 09:24:52202TransportFeedbackObserver*
203RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson87609be2018-12-05 16:35:35204 return this;
nisse76e62b02017-05-31 09:24:52205}
206
Erik Språngaa59eca2019-07-24 12:52:55207RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Erik Språng4314a492019-11-26 16:48:49208 if (use_task_queue_pacer_) {
209 return task_queue_pacer_.get();
210 }
211 return process_thread_pacer_.get();
nisse76e62b02017-05-31 09:24:52212}
213
Stefan Holmer5c8942a2017-08-22 14:16:44214void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
Sebastian Jansson93b1ea22019-09-18 16:31:52215 BitrateAllocationLimits limits) {
Sebastian Jansson87609be2018-12-05 16:35:35216 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson93b1ea22019-09-18 16:31:52217 streams_config_.min_total_allocated_bitrate = limits.min_allocatable_rate;
218 streams_config_.max_padding_rate = limits.max_padding_rate;
219 streams_config_.max_total_allocated_bitrate = limits.max_allocatable_rate;
Sebastian Jansson87609be2018-12-05 16:35:35220 UpdateStreamsConfig();
Stefan Holmer5c8942a2017-08-22 14:16:44221}
Sebastian Jansson4c1ffb82018-02-15 15:51:58222void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson87609be2018-12-05 16:35:35223 RTC_DCHECK_RUN_ON(&task_queue_);
224 streams_config_.pacing_factor = pacing_factor;
225 UpdateStreamsConfig();
Sebastian Jansson4c1ffb82018-02-15 15:51:58226}
227void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
Danil Chapovalov0c626af2020-02-10 10:16:00228 pacer()->SetQueueTimeLimit(TimeDelta::Millis(limit_ms));
Sebastian Jansson4c1ffb82018-02-15 15:51:58229}
Sebastian Janssonf2988552019-10-29 16:18:51230StreamFeedbackProvider*
231RtpTransportControllerSend::GetStreamFeedbackProvider() {
JT Tehea992f82020-01-15 18:24:20232 return &feedback_demuxer_;
Sebastian Janssone4be6da2018-02-15 15:51:41233}
Sebastian Jansson19704ec2018-03-12 14:59:12234
235void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
236 TargetTransferRateObserver* observer) {
Sebastian Jansson87609be2018-12-05 16:35:35237 task_queue_.PostTask([this, observer] {
238 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson19704ec2018-03-12 14:59:12239 RTC_DCHECK(observer_ == nullptr);
240 observer_ = observer;
Sebastian Jansson2701bc92018-12-11 14:02:47241 observer_->OnStartRateUpdate(*initial_config_.constraints.starting_rate);
Sebastian Jansson87609be2018-12-05 16:35:35242 MaybeCreateControllers();
243 });
Sebastian Janssone4be6da2018-02-15 15:51:41244}
Sebastian Janssone4be6da2018-02-15 15:51:41245void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 12:01:55246 const std::string& transport_name,
247 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 12:02:51248 // Check if the network route is connected.
249 if (!network_route.connected) {
250 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
251 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
252 // consider merging these two methods.
253 return;
254 }
255
256 // Check whether the network route has changed on each transport.
257 auto result =
258 network_routes_.insert(std::make_pair(transport_name, network_route));
259 auto kv = result.first;
260 bool inserted = result.second;
261 if (inserted) {
Jakob Ivarssonb4cdd622020-02-13 13:01:26262 task_queue_.PostTask([this, network_route] {
263 RTC_DCHECK_RUN_ON(&task_queue_);
264 transport_overhead_bytes_per_packet_ = network_route.packet_overhead;
265 });
Sebastian Jansson91bb6672018-02-21 12:02:51266 // No need to reset BWE if this is the first time the network connects.
267 return;
268 }
Sebastian Janssonaf2adda2018-12-04 10:16:19269 if (kv->second.connected != network_route.connected ||
270 kv->second.local_network_id != network_route.local_network_id ||
271 kv->second.remote_network_id != network_route.remote_network_id) {
Sebastian Jansson91bb6672018-02-21 12:02:51272 kv->second = network_route;
273 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
274 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
275 << ": new local network id "
276 << network_route.local_network_id
277 << " new remote network id "
278 << network_route.remote_network_id
279 << " Reset bitrates to min: "
280 << bitrate_config.min_bitrate_bps
281 << " bps, start: " << bitrate_config.start_bitrate_bps
282 << " bps, max: " << bitrate_config.max_bitrate_bps
283 << " bps.";
284 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson87609be2018-12-05 16:35:35285
Sebastian Jansson166b45d2019-05-13 09:57:42286 if (event_log_) {
Mirko Bonadei317a1f02019-09-17 15:06:18287 event_log_->Log(std::make_unique<RtcEventRouteChange>(
Sebastian Jansson166b45d2019-05-13 09:57:42288 network_route.connected, network_route.packet_overhead));
289 }
Sebastian Jansson87609be2018-12-05 16:35:35290 NetworkRouteChange msg;
Danil Chapovalov0c626af2020-02-10 10:16:00291 msg.at_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 16:35:35292 msg.constraints = ConvertConstraints(bitrate_config, clock_);
Sebastian Jansson658f1812020-01-16 09:59:28293 task_queue_.PostTask([this, msg, network_route] {
Sebastian Jansson87609be2018-12-05 16:35:35294 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson658f1812020-01-16 09:59:28295 transport_overhead_bytes_per_packet_ = network_route.packet_overhead;
296 if (reset_feedback_on_route_change_) {
297 transport_feedback_adapter_.SetNetworkIds(
298 network_route.local_network_id, network_route.remote_network_id);
299 }
Sebastian Jansson87609be2018-12-05 16:35:35300 if (controller_) {
Sebastian Jansson16180952018-12-12 15:49:10301 PostUpdates(controller_->OnNetworkRouteChange(msg));
Sebastian Jansson87609be2018-12-05 16:35:35302 } else {
303 UpdateInitialConstraints(msg.constraints);
304 }
Erik Språng425d6aa2019-07-29 14:38:27305 pacer()->UpdateOutstandingData(DataSize::Zero());
Sebastian Jansson87609be2018-12-05 16:35:35306 });
Sebastian Jansson91bb6672018-02-21 12:02:51307 }
Sebastian Janssone4be6da2018-02-15 15:51:41308}
309void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Harald Alvestrand977b2652019-12-12 12:40:50310 RTC_LOG(LS_VERBOSE) << "SignalNetworkState "
311 << (network_available ? "Up" : "Down");
Sebastian Jansson87609be2018-12-05 16:35:35312 NetworkAvailability msg;
Danil Chapovalov0c626af2020-02-10 10:16:00313 msg.at_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 16:35:35314 msg.network_available = network_available;
315 task_queue_.PostTask([this, msg]() {
316 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson16180952018-12-12 15:49:10317 if (network_available_ == msg.network_available)
318 return;
Sebastian Jansson87609be2018-12-05 16:35:35319 network_available_ = msg.network_available;
Sebastian Jansson16180952018-12-12 15:49:10320 if (network_available_) {
Erik Språng425d6aa2019-07-29 14:38:27321 pacer()->Resume();
Sebastian Jansson16180952018-12-12 15:49:10322 } else {
Erik Språng425d6aa2019-07-29 14:38:27323 pacer()->Pause();
Sebastian Jansson16180952018-12-12 15:49:10324 }
Erik Språng425d6aa2019-07-29 14:38:27325 pacer()->UpdateOutstandingData(DataSize::Zero());
Sebastian Jansson16180952018-12-12 15:49:10326
Sebastian Jansson87609be2018-12-05 16:35:35327 if (controller_) {
Sebastian Jansson16180952018-12-12 15:49:10328 control_handler_->SetNetworkAvailability(network_available_);
329 PostUpdates(controller_->OnNetworkAvailability(msg));
330 UpdateControlState();
Sebastian Jansson87609be2018-12-05 16:35:35331 } else {
332 MaybeCreateControllers();
333 }
334 });
335
Stefan Holmerdbdb3a02018-07-17 14:03:46336 for (auto& rtp_sender : video_rtp_senders_) {
337 rtp_sender->OnNetworkAvailability(network_available);
338 }
Sebastian Janssone4be6da2018-02-15 15:51:41339}
Sebastian Janssone4be6da2018-02-15 15:51:41340RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson87609be2018-12-05 16:35:35341 return this;
Sebastian Janssone4be6da2018-02-15 15:51:41342}
Sebastian Janssone4be6da2018-02-15 15:51:41343int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Erik Språng425d6aa2019-07-29 14:38:27344 return pacer()->OldestPacketWaitTime().ms();
Sebastian Janssone4be6da2018-02-15 15:51:41345}
Erik Språng425d6aa2019-07-29 14:38:27346absl::optional<Timestamp> RtpTransportControllerSend::GetFirstPacketTime()
347 const {
348 return pacer()->FirstSentPacketTime();
Sebastian Janssone4be6da2018-02-15 15:51:41349}
Sebastian Janssone4be6da2018-02-15 15:51:41350void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson87609be2018-12-05 16:35:35351 task_queue_.PostTask([this, enable]() {
352 RTC_DCHECK_RUN_ON(&task_queue_);
353 streams_config_.requests_alr_probing = enable;
354 UpdateStreamsConfig();
355 });
Sebastian Janssone4be6da2018-02-15 15:51:41356}
357void RtpTransportControllerSend::OnSentPacket(
358 const rtc::SentPacket& sent_packet) {
Sebastian Jansson658f1812020-01-16 09:59:28359 task_queue_.PostTask([this, sent_packet]() {
360 RTC_DCHECK_RUN_ON(&task_queue_);
361 absl::optional<SentPacket> packet_msg =
362 transport_feedback_adapter_.ProcessSentPacket(sent_packet);
363 pacer()->UpdateOutstandingData(
364 transport_feedback_adapter_.GetOutstandingData());
365 if (packet_msg && controller_)
366 PostUpdates(controller_->OnSentPacket(*packet_msg));
367 });
Sebastian Janssone4be6da2018-02-15 15:51:41368}
sprangdb2a9fc2017-08-09 13:42:32369
Ying Wang8b279102019-05-27 15:19:08370void RtpTransportControllerSend::OnReceivedPacket(
Sebastian Jansson607a6f12019-06-13 15:48:53371 const ReceivedPacket& packet_msg) {
Ying Wang8b279102019-05-27 15:19:08372 task_queue_.PostTask([this, packet_msg]() {
373 RTC_DCHECK_RUN_ON(&task_queue_);
374 if (controller_)
375 PostUpdates(controller_->OnReceivedPacket(packet_msg));
376 });
377}
378
Sebastian Jansson97f61ea2018-02-21 12:01:55379void RtpTransportControllerSend::SetSdpBitrateParameters(
380 const BitrateConstraints& constraints) {
Danil Chapovalovb9b146c2018-06-15 10:28:07381 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 12:01:55382 bitrate_configurator_.UpdateWithSdpParameters(constraints);
383 if (updated.has_value()) {
Sebastian Jansson87609be2018-12-05 16:35:35384 TargetRateConstraints msg = ConvertConstraints(*updated, clock_);
385 task_queue_.PostTask([this, msg]() {
386 RTC_DCHECK_RUN_ON(&task_queue_);
387 if (controller_) {
Sebastian Jansson16180952018-12-12 15:49:10388 PostUpdates(controller_->OnTargetRateConstraints(msg));
Sebastian Jansson87609be2018-12-05 16:35:35389 } else {
390 UpdateInitialConstraints(msg);
391 }
392 });
Sebastian Jansson97f61ea2018-02-21 12:01:55393 } else {
394 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 12:07:13395 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Jonas Olssonb2b20312020-01-14 11:11:31396 "nothing to update";
Sebastian Jansson97f61ea2018-02-21 12:01:55397 }
398}
399
400void RtpTransportControllerSend::SetClientBitratePreferences(
Niels Möller0c4f7be2018-05-07 12:01:37401 const BitrateSettings& preferences) {
Danil Chapovalovb9b146c2018-06-15 10:28:07402 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 12:01:55403 bitrate_configurator_.UpdateWithClientPreferences(preferences);
404 if (updated.has_value()) {
Sebastian Jansson87609be2018-12-05 16:35:35405 TargetRateConstraints msg = ConvertConstraints(*updated, clock_);
406 task_queue_.PostTask([this, msg]() {
407 RTC_DCHECK_RUN_ON(&task_queue_);
408 if (controller_) {
Sebastian Jansson16180952018-12-12 15:49:10409 PostUpdates(controller_->OnTargetRateConstraints(msg));
Sebastian Jansson87609be2018-12-05 16:35:35410 } else {
411 UpdateInitialConstraints(msg);
412 }
413 });
Sebastian Jansson97f61ea2018-02-21 12:01:55414 } else {
415 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 12:07:13416 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Jonas Olssonb2b20312020-01-14 11:11:31417 "nothing to update";
Sebastian Jansson97f61ea2018-02-21 12:01:55418 }
419}
Alex Narestbcf91802018-06-25 14:08:36420
Stefan Holmer64be7fa2018-10-04 13:21:55421void RtpTransportControllerSend::OnTransportOverheadChanged(
422 size_t transport_overhead_bytes_per_packet) {
423 if (transport_overhead_bytes_per_packet >= kMaxOverheadBytes) {
424 RTC_LOG(LS_ERROR) << "Transport overhead exceeds " << kMaxOverheadBytes;
425 return;
426 }
427
Mirko Bonadeie7bc3a32020-01-29 18:45:00428 pacer()->SetTransportOverhead(
429 DataSize::bytes(transport_overhead_bytes_per_packet));
430
Stefan Holmer64be7fa2018-10-04 13:21:55431 // TODO(holmer): Call AudioRtpSenders when they have been moved to
432 // RtpTransportControllerSend.
433 for (auto& rtp_video_sender : video_rtp_senders_) {
434 rtp_video_sender->OnTransportOverheadChanged(
435 transport_overhead_bytes_per_packet);
436 }
437}
Sebastian Jansson87609be2018-12-05 16:35:35438
Erik Språngaa59eca2019-07-24 12:52:55439void RtpTransportControllerSend::AccountForAudioPacketsInPacedSender(
440 bool account_for_audio) {
Erik Språng425d6aa2019-07-29 14:38:27441 pacer()->SetAccountForAudioPackets(account_for_audio);
Erik Språngaa59eca2019-07-24 12:52:55442}
443
Sebastian Janssonc3eb9fd2020-01-29 16:42:52444void RtpTransportControllerSend::IncludeOverheadInPacedSender() {
445 pacer()->SetIncludeOverhead();
446}
447
Sebastian Jansson87609be2018-12-05 16:35:35448void RtpTransportControllerSend::OnReceivedEstimatedBitrate(uint32_t bitrate) {
449 RemoteBitrateReport msg;
Danil Chapovalov0c626af2020-02-10 10:16:00450 msg.receive_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 16:35:35451 msg.bandwidth = DataRate::bps(bitrate);
452 task_queue_.PostTask([this, msg]() {
453 RTC_DCHECK_RUN_ON(&task_queue_);
454 if (controller_)
Sebastian Jansson16180952018-12-12 15:49:10455 PostUpdates(controller_->OnRemoteBitrateReport(msg));
Sebastian Jansson87609be2018-12-05 16:35:35456 });
457}
458
459void RtpTransportControllerSend::OnReceivedRtcpReceiverReport(
460 const ReportBlockList& report_blocks,
461 int64_t rtt_ms,
462 int64_t now_ms) {
463 task_queue_.PostTask([this, report_blocks, now_ms]() {
464 RTC_DCHECK_RUN_ON(&task_queue_);
465 OnReceivedRtcpReceiverReportBlocks(report_blocks, now_ms);
466 });
467
468 task_queue_.PostTask([this, now_ms, rtt_ms]() {
469 RTC_DCHECK_RUN_ON(&task_queue_);
470 RoundTripTimeUpdate report;
Danil Chapovalov0c626af2020-02-10 10:16:00471 report.receive_time = Timestamp::Millis(now_ms);
472 report.round_trip_time = TimeDelta::Millis(rtt_ms);
Sebastian Jansson87609be2018-12-05 16:35:35473 report.smoothed = false;
Christoffer Rodbro4bd31772019-03-27 11:34:21474 if (controller_ && !report.round_trip_time.IsZero())
Sebastian Jansson16180952018-12-12 15:49:10475 PostUpdates(controller_->OnRoundTripTimeUpdate(report));
Sebastian Jansson87609be2018-12-05 16:35:35476 });
477}
478
Erik Språng30a276b2019-04-23 10:00:11479void RtpTransportControllerSend::OnAddPacket(
480 const RtpPacketSendInfo& packet_info) {
JT Tehea992f82020-01-15 18:24:20481 feedback_demuxer_.AddPacket(packet_info);
482
Danil Chapovalov0c626af2020-02-10 10:16:00483 Timestamp creation_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson658f1812020-01-16 09:59:28484 task_queue_.PostTask([this, packet_info, creation_time]() {
485 RTC_DCHECK_RUN_ON(&task_queue_);
486 transport_feedback_adapter_.AddPacket(
487 packet_info,
488 send_side_bwe_with_overhead_ ? transport_overhead_bytes_per_packet_ : 0,
489 creation_time);
490 });
Sebastian Jansson87609be2018-12-05 16:35:35491}
492
493void RtpTransportControllerSend::OnTransportFeedback(
494 const rtcp::TransportFeedback& feedback) {
JT Tehea992f82020-01-15 18:24:20495 feedback_demuxer_.OnTransportFeedback(feedback);
Danil Chapovalov0c626af2020-02-10 10:16:00496 auto feedback_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson658f1812020-01-16 09:59:28497 task_queue_.PostTask([this, feedback, feedback_time]() {
498 RTC_DCHECK_RUN_ON(&task_queue_);
499 absl::optional<TransportPacketsFeedback> feedback_msg =
500 transport_feedback_adapter_.ProcessTransportFeedback(feedback,
501 feedback_time);
502 if (feedback_msg && controller_) {
503 PostUpdates(controller_->OnTransportPacketsFeedback(*feedback_msg));
504 }
505 pacer()->UpdateOutstandingData(
506 transport_feedback_adapter_.GetOutstandingData());
507 });
Sebastian Jansson87609be2018-12-05 16:35:35508}
509
Sebastian Janssone1795f42019-07-24 09:38:03510void RtpTransportControllerSend::OnRemoteNetworkEstimate(
511 NetworkStateEstimate estimate) {
Sebastian Jansson0a5ed892019-09-18 13:37:31512 if (event_log_) {
513 event_log_->Log(std::make_unique<RtcEventRemoteEstimate>(
514 estimate.link_capacity_lower, estimate.link_capacity_upper));
515 }
Danil Chapovalov0c626af2020-02-10 10:16:00516 estimate.update_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Janssone1795f42019-07-24 09:38:03517 task_queue_.PostTask([this, estimate] {
518 RTC_DCHECK_RUN_ON(&task_queue_);
519 if (controller_)
Danil Chapovalove34fb872019-10-21 08:51:08520 PostUpdates(controller_->OnNetworkStateEstimate(estimate));
Sebastian Janssone1795f42019-07-24 09:38:03521 });
522}
523
Sebastian Jansson87609be2018-12-05 16:35:35524void RtpTransportControllerSend::MaybeCreateControllers() {
525 RTC_DCHECK(!controller_);
526 RTC_DCHECK(!control_handler_);
527
528 if (!network_available_ || !observer_)
529 return;
Mirko Bonadei317a1f02019-09-17 15:06:18530 control_handler_ = std::make_unique<CongestionControlHandler>();
Sebastian Jansson87609be2018-12-05 16:35:35531
532 initial_config_.constraints.at_time =
Danil Chapovalov0c626af2020-02-10 10:16:00533 Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 16:35:35534 initial_config_.stream_based_config = streams_config_;
535
536 // TODO(srte): Use fallback controller if no feedback is available.
537 if (controller_factory_override_) {
538 RTC_LOG(LS_INFO) << "Creating overridden congestion controller";
539 controller_ = controller_factory_override_->Create(initial_config_);
540 process_interval_ = controller_factory_override_->GetProcessInterval();
541 } else {
542 RTC_LOG(LS_INFO) << "Creating fallback congestion controller";
543 controller_ = controller_factory_fallback_->Create(initial_config_);
544 process_interval_ = controller_factory_fallback_->GetProcessInterval();
545 }
546 UpdateControllerWithTimeInterval();
547 StartProcessPeriodicTasks();
548}
549
550void RtpTransportControllerSend::UpdateInitialConstraints(
551 TargetRateConstraints new_contraints) {
552 if (!new_contraints.starting_rate)
553 new_contraints.starting_rate = initial_config_.constraints.starting_rate;
554 RTC_DCHECK(new_contraints.starting_rate);
555 initial_config_.constraints = new_contraints;
556}
557
558void RtpTransportControllerSend::StartProcessPeriodicTasks() {
Sebastian Janssonecb68972019-01-18 09:30:54559 if (!pacer_queue_update_task_.Running()) {
560 pacer_queue_update_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov4423c362019-03-06 17:41:39561 task_queue_.Get(), kPacerQueueUpdateInterval, [this]() {
Sebastian Jansson87609be2018-12-05 16:35:35562 RTC_DCHECK_RUN_ON(&task_queue_);
Erik Språng425d6aa2019-07-29 14:38:27563 TimeDelta expected_queue_time = pacer()->ExpectedQueueTime();
Sebastian Jansson16180952018-12-12 15:49:10564 control_handler_->SetPacerQueue(expected_queue_time);
565 UpdateControlState();
Sebastian Janssonecb68972019-01-18 09:30:54566 return kPacerQueueUpdateInterval;
Sebastian Jansson87609be2018-12-05 16:35:35567 });
568 }
Sebastian Janssonecb68972019-01-18 09:30:54569 controller_task_.Stop();
Sebastian Jansson87609be2018-12-05 16:35:35570 if (process_interval_.IsFinite()) {
Sebastian Janssonecb68972019-01-18 09:30:54571 controller_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov4423c362019-03-06 17:41:39572 task_queue_.Get(), process_interval_, [this]() {
Sebastian Jansson87609be2018-12-05 16:35:35573 RTC_DCHECK_RUN_ON(&task_queue_);
574 UpdateControllerWithTimeInterval();
Sebastian Janssonecb68972019-01-18 09:30:54575 return process_interval_;
Sebastian Jansson87609be2018-12-05 16:35:35576 });
577 }
578}
579
580void RtpTransportControllerSend::UpdateControllerWithTimeInterval() {
Sebastian Jansson16180952018-12-12 15:49:10581 RTC_DCHECK(controller_);
582 ProcessInterval msg;
Danil Chapovalov0c626af2020-02-10 10:16:00583 msg.at_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Christoffer Rodbroc610e262019-01-08 09:49:19584 if (add_pacing_to_cwin_)
Erik Språng425d6aa2019-07-29 14:38:27585 msg.pacer_queue = pacer()->QueueSizeData();
Sebastian Jansson16180952018-12-12 15:49:10586 PostUpdates(controller_->OnProcessInterval(msg));
Sebastian Jansson87609be2018-12-05 16:35:35587}
588
589void RtpTransportControllerSend::UpdateStreamsConfig() {
Danil Chapovalov0c626af2020-02-10 10:16:00590 streams_config_.at_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 16:35:35591 if (controller_)
Sebastian Jansson16180952018-12-12 15:49:10592 PostUpdates(controller_->OnStreamsConfig(streams_config_));
593}
594
595void RtpTransportControllerSend::PostUpdates(NetworkControlUpdate update) {
596 if (update.congestion_window) {
Erik Språng425d6aa2019-07-29 14:38:27597 pacer()->SetCongestionWindow(*update.congestion_window);
Sebastian Jansson16180952018-12-12 15:49:10598 }
599 if (update.pacer_config) {
Erik Språng425d6aa2019-07-29 14:38:27600 pacer()->SetPacingRates(update.pacer_config->data_rate(),
601 update.pacer_config->pad_rate());
Sebastian Jansson16180952018-12-12 15:49:10602 }
603 for (const auto& probe : update.probe_cluster_configs) {
Erik Språng425d6aa2019-07-29 14:38:27604 pacer()->CreateProbeCluster(probe.target_data_rate, probe.id);
Sebastian Jansson16180952018-12-12 15:49:10605 }
606 if (update.target_rate) {
607 control_handler_->SetTargetRate(*update.target_rate);
608 UpdateControlState();
609 }
Sebastian Jansson87609be2018-12-05 16:35:35610}
611
612void RtpTransportControllerSend::OnReceivedRtcpReceiverReportBlocks(
613 const ReportBlockList& report_blocks,
614 int64_t now_ms) {
615 if (report_blocks.empty())
616 return;
617
618 int total_packets_lost_delta = 0;
619 int total_packets_delta = 0;
620
621 // Compute the packet loss from all report blocks.
622 for (const RTCPReportBlock& report_block : report_blocks) {
623 auto it = last_report_blocks_.find(report_block.source_ssrc);
624 if (it != last_report_blocks_.end()) {
625 auto number_of_packets = report_block.extended_highest_sequence_number -
626 it->second.extended_highest_sequence_number;
627 total_packets_delta += number_of_packets;
628 auto lost_delta = report_block.packets_lost - it->second.packets_lost;
629 total_packets_lost_delta += lost_delta;
630 }
631 last_report_blocks_[report_block.source_ssrc] = report_block;
632 }
633 // Can only compute delta if there has been previous blocks to compare to. If
634 // not, total_packets_delta will be unchanged and there's nothing more to do.
635 if (!total_packets_delta)
636 return;
637 int packets_received_delta = total_packets_delta - total_packets_lost_delta;
638 // To detect lost packets, at least one packet has to be received. This check
639 // is needed to avoid bandwith detection update in
640 // VideoSendStreamTest.SuspendBelowMinBitrate
641
642 if (packets_received_delta < 1)
643 return;
Danil Chapovalov0c626af2020-02-10 10:16:00644 Timestamp now = Timestamp::Millis(now_ms);
Sebastian Jansson87609be2018-12-05 16:35:35645 TransportLossReport msg;
646 msg.packets_lost_delta = total_packets_lost_delta;
647 msg.packets_received_delta = packets_received_delta;
648 msg.receive_time = now;
649 msg.start_time = last_report_block_time_;
650 msg.end_time = now;
651 if (controller_)
Sebastian Jansson16180952018-12-12 15:49:10652 PostUpdates(controller_->OnTransportLossReport(msg));
Sebastian Jansson87609be2018-12-05 16:35:35653 last_report_block_time_ = now;
654}
655
nissecae45d02017-04-24 12:53:20656} // namespace webrtc