blob: a4a5ddaac3b731f4aad962bc410113b8f8dde5fd [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>
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020011#include <vector>
nissecae45d02017-04-24 05:53:20 -070012
Karl Wiberg918f50c2018-07-05 11:40:33 +020013#include "absl/memory/memory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010014#include "absl/types/optional.h"
Sebastian Jansson87609be2018-12-05 17:35:35 +010015#include "api/transport/goog_cc_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010016#include "api/transport/network_types.h"
17#include "api/units/data_rate.h"
18#include "api/units/time_delta.h"
19#include "api/units/timestamp.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "call/rtp_transport_controller_send.h"
Yves Gerey3e707812018-11-28 16:47:49 +010021#include "call/rtp_video_sender.h"
Sebastian Jansson166b45d2019-05-13 11:57:42 +020022#include "logging/rtc_event_log/events/rtc_event_route_change.h"
Yves Gerey3e707812018-11-28 16:47:49 +010023#include "rtc_base/checks.h"
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010024#include "rtc_base/location.h"
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010025#include "rtc_base/logging.h"
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020026#include "rtc_base/rate_limiter.h"
Sebastian Jansson19bea512018-03-13 19:07:46 +010027#include "system_wrappers/include/field_trial.h"
nissecae45d02017-04-24 05:53:20 -070028
29namespace webrtc {
Sebastian Jansson19bea512018-03-13 19:07:46 +010030namespace {
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020031static const int64_t kRetransmitWindowSizeMs = 500;
Stefan Holmer64be7fa2018-10-04 15:21:55 +020032static const size_t kMaxOverheadBytes = 500;
Sebastian Jansson19bea512018-03-13 19:07:46 +010033
Sebastian Janssonecb68972019-01-18 10:30:54 +010034constexpr TimeDelta kPacerQueueUpdateInterval = TimeDelta::Millis<25>();
Sebastian Jansson87609be2018-12-05 17:35:35 +010035
36TargetRateConstraints ConvertConstraints(int min_bitrate_bps,
37 int max_bitrate_bps,
38 int start_bitrate_bps,
Sebastian Janssonaa01f272019-01-30 11:28:59 +010039 Clock* clock) {
Sebastian Jansson87609be2018-12-05 17:35:35 +010040 TargetRateConstraints msg;
41 msg.at_time = Timestamp::ms(clock->TimeInMilliseconds());
42 msg.min_data_rate =
43 min_bitrate_bps >= 0 ? DataRate::bps(min_bitrate_bps) : DataRate::Zero();
44 msg.max_data_rate = max_bitrate_bps > 0 ? DataRate::bps(max_bitrate_bps)
45 : DataRate::Infinity();
46 if (start_bitrate_bps > 0)
47 msg.starting_rate = DataRate::bps(start_bitrate_bps);
48 return msg;
49}
50
51TargetRateConstraints ConvertConstraints(const BitrateConstraints& contraints,
Sebastian Janssonaa01f272019-01-30 11:28:59 +010052 Clock* clock) {
Sebastian Jansson87609be2018-12-05 17:35:35 +010053 return ConvertConstraints(contraints.min_bitrate_bps,
54 contraints.max_bitrate_bps,
55 contraints.start_bitrate_bps, clock);
56}
Sebastian Jansson19bea512018-03-13 19:07:46 +010057} // namespace
nissecae45d02017-04-24 05:53:20 -070058
59RtpTransportControllerSend::RtpTransportControllerSend(
60 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010061 webrtc::RtcEventLog* event_log,
Ying Wang0810a7c2019-04-10 13:48:24 +020062 NetworkStatePredictorFactoryInterface* predictor_factory,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020063 NetworkControllerFactoryInterface* controller_factory,
Sebastian Janssoned50e6c2019-03-01 14:45:21 +010064 const BitrateConstraints& bitrate_config,
65 std::unique_ptr<ProcessThread> process_thread,
66 TaskQueueFactory* task_queue_factory)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010067 : clock_(clock),
Sebastian Jansson166b45d2019-05-13 11:57:42 +020068 event_log_(event_log),
Sebastian Jansson19704ec2018-03-12 15:59:12 +010069 pacer_(clock, &packet_router_, event_log),
Sebastian Jansson317a5222018-03-16 15:36:37 +010070 bitrate_configurator_(bitrate_config),
Sebastian Janssoned50e6c2019-03-01 14:45:21 +010071 process_thread_(std::move(process_thread)),
Sebastian Jansson317a5222018-03-16 15:36:37 +010072 observer_(nullptr),
Sebastian Jansson87609be2018-12-05 17:35:35 +010073 controller_factory_override_(controller_factory),
74 controller_factory_fallback_(
Sebastian Janssondf88cc02019-04-15 15:42:25 +020075 absl::make_unique<GoogCcNetworkControllerFactory>(predictor_factory)),
Sebastian Jansson87609be2018-12-05 17:35:35 +010076 process_interval_(controller_factory_fallback_->GetProcessInterval()),
77 last_report_block_time_(Timestamp::ms(clock_->TimeInMilliseconds())),
78 reset_feedback_on_route_change_(
79 !field_trial::IsEnabled("WebRTC-Bwe-NoFeedbackReset")),
80 send_side_bwe_with_overhead_(
81 webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
Christoffer Rodbroc610e262019-01-08 10:49:19 +010082 add_pacing_to_cwin_(
83 field_trial::IsEnabled("WebRTC-AddPacingToCongestionWindowPushback")),
Sebastian Jansson87609be2018-12-05 17:35:35 +010084 transport_overhead_bytes_per_packet_(0),
85 network_available_(false),
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020086 retransmission_rate_limiter_(clock, kRetransmitWindowSizeMs),
Sebastian Janssoned50e6c2019-03-01 14:45:21 +010087 task_queue_(task_queue_factory->CreateTaskQueue(
88 "rtp_send_controller",
89 TaskQueueFactory::Priority::NORMAL)) {
Sebastian Jansson87609be2018-12-05 17:35:35 +010090 initial_config_.constraints = ConvertConstraints(bitrate_config, clock_);
Sebastian Janssondf88cc02019-04-15 15:42:25 +020091 initial_config_.event_log = event_log;
92 initial_config_.key_value_config = &trial_based_config_;
Sebastian Jansson87609be2018-12-05 17:35:35 +010093 RTC_DCHECK(bitrate_config.start_bitrate_bps > 0);
94
Sebastian Jansson02c4f152018-12-20 09:41:03 +010095 pacer_.SetPacingRates(bitrate_config.start_bitrate_bps, 0);
Sebastian Janssonbd9fe092018-05-07 16:33:50 +020096
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010097 process_thread_->RegisterModule(&pacer_, RTC_FROM_HERE);
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +010098 process_thread_->Start();
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010099}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +0100100
101RtpTransportControllerSend::~RtpTransportControllerSend() {
102 process_thread_->Stop();
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +0100103 process_thread_->DeRegisterModule(&pacer_);
104}
nissecae45d02017-04-24 05:53:20 -0700105
Stefan Holmer9416ef82018-07-19 10:34:38 +0200106RtpVideoSenderInterface* RtpTransportControllerSend::CreateRtpVideoSender(
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200107 std::map<uint32_t, RtpState> suspended_ssrcs,
108 const std::map<uint32_t, RtpPayloadState>& states,
109 const RtpConfig& rtp_config,
Jiawei Ou55718122018-11-09 13:17:39 -0800110 int rtcp_report_interval_ms,
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200111 Transport* send_transport,
112 const RtpSenderObservers& observers,
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200113 RtcEventLog* event_log,
Benjamin Wright192eeec2018-10-17 17:27:25 -0700114 std::unique_ptr<FecController> fec_controller,
115 const RtpSenderFrameEncryptionConfig& frame_encryption_config) {
Stefan Holmer9416ef82018-07-19 10:34:38 +0200116 video_rtp_senders_.push_back(absl::make_unique<RtpVideoSender>(
Sebastian Jansson572c60f2019-03-04 18:30:41 +0100117 clock_, suspended_ssrcs, states, rtp_config, rtcp_report_interval_ms,
Oleh Prypine8964902019-03-29 15:33:01 +0000118 send_transport, observers,
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200119 // TODO(holmer): Remove this circular dependency by injecting
120 // the parts of RtpTransportControllerSendInterface that are really used.
Benjamin Wright192eeec2018-10-17 17:27:25 -0700121 this, event_log, &retransmission_rate_limiter_, std::move(fec_controller),
122 frame_encryption_config.frame_encryptor,
123 frame_encryption_config.crypto_options));
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200124 return video_rtp_senders_.back().get();
125}
126
Stefan Holmer9416ef82018-07-19 10:34:38 +0200127void RtpTransportControllerSend::DestroyRtpVideoSender(
128 RtpVideoSenderInterface* rtp_video_sender) {
129 std::vector<std::unique_ptr<RtpVideoSenderInterface>>::iterator it =
Stefan Holmer5ed25af2018-07-18 15:17:14 +0200130 video_rtp_senders_.end();
131 for (it = video_rtp_senders_.begin(); it != video_rtp_senders_.end(); ++it) {
132 if (it->get() == rtp_video_sender) {
133 break;
134 }
135 }
136 RTC_DCHECK(it != video_rtp_senders_.end());
137 video_rtp_senders_.erase(it);
138}
139
Sebastian Jansson16180952018-12-12 16:49:10 +0100140void RtpTransportControllerSend::UpdateControlState() {
141 absl::optional<TargetTransferRate> update = control_handler_->GetUpdate();
142 if (!update)
143 return;
144 retransmission_rate_limiter_.SetMaxRate(
145 update->network_estimate.bandwidth.bps());
146 // We won't create control_handler_ until we have an observers.
Sebastian Jansson87609be2018-12-05 17:35:35 +0100147 RTC_DCHECK(observer_ != nullptr);
Sebastian Jansson16180952018-12-12 16:49:10 +0100148 observer_->OnTargetTransferRate(*update);
Sebastian Janssone6256052018-05-04 14:08:15 +0200149}
150
151rtc::TaskQueue* RtpTransportControllerSend::GetWorkerQueue() {
152 return &task_queue_;
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100153}
154
nisse76e62b02017-05-31 02:24:52 -0700155PacketRouter* RtpTransportControllerSend::packet_router() {
156 return &packet_router_;
157}
158
nisse76e62b02017-05-31 02:24:52 -0700159TransportFeedbackObserver*
160RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100161 return this;
nisse76e62b02017-05-31 02:24:52 -0700162}
163
164RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200165 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700166}
167
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200168void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
169 int min_send_bitrate_bps,
philipel832b1c82018-02-28 17:04:18 +0100170 int max_padding_bitrate_bps,
philipeldb4fa4b2018-03-06 18:29:22 +0100171 int max_total_bitrate_bps) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100172 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson11e55ee2019-03-06 16:58:18 +0100173 streams_config_.min_total_allocated_bitrate =
174 DataRate::bps(min_send_bitrate_bps);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100175 streams_config_.max_padding_rate = DataRate::bps(max_padding_bitrate_bps);
176 streams_config_.max_total_allocated_bitrate =
177 DataRate::bps(max_total_bitrate_bps);
178 UpdateStreamsConfig();
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200179}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100180void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100181 RTC_DCHECK_RUN_ON(&task_queue_);
182 streams_config_.pacing_factor = pacing_factor;
183 UpdateStreamsConfig();
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100184}
185void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
186 pacer_.SetQueueTimeLimit(limit_ms);
187}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100188void RtpTransportControllerSend::RegisterPacketFeedbackObserver(
189 PacketFeedbackObserver* observer) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100190 transport_feedback_adapter_.RegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100191}
192void RtpTransportControllerSend::DeRegisterPacketFeedbackObserver(
193 PacketFeedbackObserver* observer) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100194 transport_feedback_adapter_.DeRegisterPacketFeedbackObserver(observer);
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100195}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100196
197void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
198 TargetTransferRateObserver* observer) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100199 task_queue_.PostTask([this, observer] {
200 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100201 RTC_DCHECK(observer_ == nullptr);
202 observer_ = observer;
Sebastian Jansson2701bc92018-12-11 15:02:47 +0100203 observer_->OnStartRateUpdate(*initial_config_.constraints.starting_rate);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100204 MaybeCreateControllers();
205 });
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100206}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100207void RtpTransportControllerSend::OnNetworkRouteChanged(
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100208 const std::string& transport_name,
209 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100210 // Check if the network route is connected.
211 if (!network_route.connected) {
212 RTC_LOG(LS_INFO) << "Transport " << transport_name << " is disconnected";
213 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
214 // consider merging these two methods.
215 return;
216 }
217
218 // Check whether the network route has changed on each transport.
219 auto result =
220 network_routes_.insert(std::make_pair(transport_name, network_route));
221 auto kv = result.first;
222 bool inserted = result.second;
223 if (inserted) {
224 // No need to reset BWE if this is the first time the network connects.
225 return;
226 }
Sebastian Janssonaf2adda2018-12-04 11:16:19 +0100227 if (kv->second.connected != network_route.connected ||
228 kv->second.local_network_id != network_route.local_network_id ||
229 kv->second.remote_network_id != network_route.remote_network_id) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100230 kv->second = network_route;
231 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
232 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
233 << ": new local network id "
234 << network_route.local_network_id
235 << " new remote network id "
236 << network_route.remote_network_id
237 << " Reset bitrates to min: "
238 << bitrate_config.min_bitrate_bps
239 << " bps, start: " << bitrate_config.start_bitrate_bps
240 << " bps, max: " << bitrate_config.max_bitrate_bps
241 << " bps.";
242 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100243
244 if (reset_feedback_on_route_change_)
245 transport_feedback_adapter_.SetNetworkIds(
246 network_route.local_network_id, network_route.remote_network_id);
247 transport_overhead_bytes_per_packet_ = network_route.packet_overhead;
248
Sebastian Jansson166b45d2019-05-13 11:57:42 +0200249 if (event_log_) {
250 event_log_->Log(absl::make_unique<RtcEventRouteChange>(
251 network_route.connected, network_route.packet_overhead));
252 }
Sebastian Jansson87609be2018-12-05 17:35:35 +0100253 NetworkRouteChange msg;
254 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
255 msg.constraints = ConvertConstraints(bitrate_config, clock_);
256 task_queue_.PostTask([this, msg] {
257 RTC_DCHECK_RUN_ON(&task_queue_);
258 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100259 PostUpdates(controller_->OnNetworkRouteChange(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100260 } else {
261 UpdateInitialConstraints(msg.constraints);
262 }
263 pacer_.UpdateOutstandingData(0);
264 });
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100265 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100266}
267void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100268 RTC_LOG(LS_INFO) << "SignalNetworkState "
269 << (network_available ? "Up" : "Down");
270 NetworkAvailability msg;
271 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
272 msg.network_available = network_available;
273 task_queue_.PostTask([this, msg]() {
274 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson16180952018-12-12 16:49:10 +0100275 if (network_available_ == msg.network_available)
276 return;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100277 network_available_ = msg.network_available;
Sebastian Jansson16180952018-12-12 16:49:10 +0100278 if (network_available_) {
279 pacer_.Resume();
280 } else {
281 pacer_.Pause();
282 }
283 pacer_.UpdateOutstandingData(0);
284
Sebastian Jansson87609be2018-12-05 17:35:35 +0100285 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100286 control_handler_->SetNetworkAvailability(network_available_);
287 PostUpdates(controller_->OnNetworkAvailability(msg));
288 UpdateControlState();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100289 } else {
290 MaybeCreateControllers();
291 }
292 });
293
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200294 for (auto& rtp_sender : video_rtp_senders_) {
295 rtp_sender->OnNetworkAvailability(network_available);
296 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100297}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100298RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100299 return this;
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100300}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100301int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100302 return pacer_.QueueInMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100303}
304int64_t RtpTransportControllerSend::GetFirstPacketTimeMs() const {
Sebastian Janssona06e9192018-03-07 18:49:55 +0100305 return pacer_.FirstSentPacketTimeMs();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100306}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100307void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100308 task_queue_.PostTask([this, enable]() {
309 RTC_DCHECK_RUN_ON(&task_queue_);
310 streams_config_.requests_alr_probing = enable;
311 UpdateStreamsConfig();
312 });
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100313}
314void RtpTransportControllerSend::OnSentPacket(
315 const rtc::SentPacket& sent_packet) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100316 absl::optional<SentPacket> packet_msg =
317 transport_feedback_adapter_.ProcessSentPacket(sent_packet);
318 if (packet_msg) {
319 task_queue_.PostTask([this, packet_msg]() {
320 RTC_DCHECK_RUN_ON(&task_queue_);
321 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100322 PostUpdates(controller_->OnSentPacket(*packet_msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100323 });
324 }
Sebastian Jansson16180952018-12-12 16:49:10 +0100325 pacer_.UpdateOutstandingData(
326 transport_feedback_adapter_.GetOutstandingData().bytes());
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100327}
sprangdb2a9fc2017-08-09 06:42:32 -0700328
Ying Wang8b279102019-05-27 17:19:08 +0200329void RtpTransportControllerSend::OnReceivedPacket(
330 const RtpPacketReceived& received_packet) {
331 ReceivedPacket packet_msg;
332 packet_msg.size = DataSize::bytes(received_packet.payload_size());
333 packet_msg.receive_time = Timestamp::ms(received_packet.arrival_time_ms());
334 task_queue_.PostTask([this, packet_msg]() {
335 RTC_DCHECK_RUN_ON(&task_queue_);
336 if (controller_)
337 PostUpdates(controller_->OnReceivedPacket(packet_msg));
338 });
339}
340
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100341void RtpTransportControllerSend::SetSdpBitrateParameters(
342 const BitrateConstraints& constraints) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200343 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100344 bitrate_configurator_.UpdateWithSdpParameters(constraints);
345 if (updated.has_value()) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100346 TargetRateConstraints msg = ConvertConstraints(*updated, clock_);
347 task_queue_.PostTask([this, msg]() {
348 RTC_DCHECK_RUN_ON(&task_queue_);
349 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100350 PostUpdates(controller_->OnTargetRateConstraints(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100351 } else {
352 UpdateInitialConstraints(msg);
353 }
354 });
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100355 } else {
356 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100357 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100358 << "nothing to update";
359 }
360}
361
362void RtpTransportControllerSend::SetClientBitratePreferences(
Niels Möller0c4f7be2018-05-07 14:01:37 +0200363 const BitrateSettings& preferences) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200364 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100365 bitrate_configurator_.UpdateWithClientPreferences(preferences);
366 if (updated.has_value()) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100367 TargetRateConstraints msg = ConvertConstraints(*updated, clock_);
368 task_queue_.PostTask([this, msg]() {
369 RTC_DCHECK_RUN_ON(&task_queue_);
370 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100371 PostUpdates(controller_->OnTargetRateConstraints(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100372 } else {
373 UpdateInitialConstraints(msg);
374 }
375 });
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100376 } else {
377 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100378 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100379 << "nothing to update";
380 }
381}
Alex Narestbcf91802018-06-25 16:08:36 +0200382
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200383void RtpTransportControllerSend::OnTransportOverheadChanged(
384 size_t transport_overhead_bytes_per_packet) {
385 if (transport_overhead_bytes_per_packet >= kMaxOverheadBytes) {
386 RTC_LOG(LS_ERROR) << "Transport overhead exceeds " << kMaxOverheadBytes;
387 return;
388 }
389
390 // TODO(holmer): Call AudioRtpSenders when they have been moved to
391 // RtpTransportControllerSend.
392 for (auto& rtp_video_sender : video_rtp_senders_) {
393 rtp_video_sender->OnTransportOverheadChanged(
394 transport_overhead_bytes_per_packet);
395 }
396}
Sebastian Jansson87609be2018-12-05 17:35:35 +0100397
398void RtpTransportControllerSend::OnReceivedEstimatedBitrate(uint32_t bitrate) {
399 RemoteBitrateReport msg;
400 msg.receive_time = Timestamp::ms(clock_->TimeInMilliseconds());
401 msg.bandwidth = DataRate::bps(bitrate);
402 task_queue_.PostTask([this, msg]() {
403 RTC_DCHECK_RUN_ON(&task_queue_);
404 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100405 PostUpdates(controller_->OnRemoteBitrateReport(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100406 });
407}
408
409void RtpTransportControllerSend::OnReceivedRtcpReceiverReport(
410 const ReportBlockList& report_blocks,
411 int64_t rtt_ms,
412 int64_t now_ms) {
413 task_queue_.PostTask([this, report_blocks, now_ms]() {
414 RTC_DCHECK_RUN_ON(&task_queue_);
415 OnReceivedRtcpReceiverReportBlocks(report_blocks, now_ms);
416 });
417
418 task_queue_.PostTask([this, now_ms, rtt_ms]() {
419 RTC_DCHECK_RUN_ON(&task_queue_);
420 RoundTripTimeUpdate report;
421 report.receive_time = Timestamp::ms(now_ms);
422 report.round_trip_time = TimeDelta::ms(rtt_ms);
423 report.smoothed = false;
Christoffer Rodbro4bd31772019-03-27 12:34:21 +0100424 if (controller_ && !report.round_trip_time.IsZero())
Sebastian Jansson16180952018-12-12 16:49:10 +0100425 PostUpdates(controller_->OnRoundTripTimeUpdate(report));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100426 });
427}
428
Erik Språng30a276b2019-04-23 12:00:11 +0200429void RtpTransportControllerSend::OnAddPacket(
430 const RtpPacketSendInfo& packet_info) {
Sebastian Jansson05acd2b2019-01-21 13:07:47 +0100431 transport_feedback_adapter_.AddPacket(
Erik Språng30a276b2019-04-23 12:00:11 +0200432 packet_info,
433 send_side_bwe_with_overhead_ ? transport_overhead_bytes_per_packet_.load()
434 : 0,
Sebastian Jansson05acd2b2019-01-21 13:07:47 +0100435 Timestamp::ms(clock_->TimeInMilliseconds()));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100436}
437
438void RtpTransportControllerSend::OnTransportFeedback(
439 const rtcp::TransportFeedback& feedback) {
440 RTC_DCHECK_RUNS_SERIALIZED(&worker_race_);
441
442 absl::optional<TransportPacketsFeedback> feedback_msg =
Sebastian Jansson05acd2b2019-01-21 13:07:47 +0100443 transport_feedback_adapter_.ProcessTransportFeedback(
444 feedback, Timestamp::ms(clock_->TimeInMilliseconds()));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100445 if (feedback_msg) {
446 task_queue_.PostTask([this, feedback_msg]() {
447 RTC_DCHECK_RUN_ON(&task_queue_);
448 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100449 PostUpdates(controller_->OnTransportPacketsFeedback(*feedback_msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100450 });
451 }
Sebastian Jansson16180952018-12-12 16:49:10 +0100452 pacer_.UpdateOutstandingData(
453 transport_feedback_adapter_.GetOutstandingData().bytes());
Sebastian Jansson87609be2018-12-05 17:35:35 +0100454}
455
Sebastian Jansson87609be2018-12-05 17:35:35 +0100456void RtpTransportControllerSend::MaybeCreateControllers() {
457 RTC_DCHECK(!controller_);
458 RTC_DCHECK(!control_handler_);
459
460 if (!network_available_ || !observer_)
461 return;
Sebastian Jansson16180952018-12-12 16:49:10 +0100462 control_handler_ = absl::make_unique<CongestionControlHandler>();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100463
464 initial_config_.constraints.at_time =
465 Timestamp::ms(clock_->TimeInMilliseconds());
466 initial_config_.stream_based_config = streams_config_;
467
468 // TODO(srte): Use fallback controller if no feedback is available.
469 if (controller_factory_override_) {
470 RTC_LOG(LS_INFO) << "Creating overridden congestion controller";
471 controller_ = controller_factory_override_->Create(initial_config_);
472 process_interval_ = controller_factory_override_->GetProcessInterval();
473 } else {
474 RTC_LOG(LS_INFO) << "Creating fallback congestion controller";
475 controller_ = controller_factory_fallback_->Create(initial_config_);
476 process_interval_ = controller_factory_fallback_->GetProcessInterval();
477 }
478 UpdateControllerWithTimeInterval();
479 StartProcessPeriodicTasks();
480}
481
482void RtpTransportControllerSend::UpdateInitialConstraints(
483 TargetRateConstraints new_contraints) {
484 if (!new_contraints.starting_rate)
485 new_contraints.starting_rate = initial_config_.constraints.starting_rate;
486 RTC_DCHECK(new_contraints.starting_rate);
487 initial_config_.constraints = new_contraints;
488}
489
490void RtpTransportControllerSend::StartProcessPeriodicTasks() {
Sebastian Janssonecb68972019-01-18 10:30:54 +0100491 if (!pacer_queue_update_task_.Running()) {
492 pacer_queue_update_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov4423c362019-03-06 18:41:39 +0100493 task_queue_.Get(), kPacerQueueUpdateInterval, [this]() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100494 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson16180952018-12-12 16:49:10 +0100495 TimeDelta expected_queue_time =
496 TimeDelta::ms(pacer_.ExpectedQueueTimeMs());
497 control_handler_->SetPacerQueue(expected_queue_time);
498 UpdateControlState();
Sebastian Janssonecb68972019-01-18 10:30:54 +0100499 return kPacerQueueUpdateInterval;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100500 });
501 }
Sebastian Janssonecb68972019-01-18 10:30:54 +0100502 controller_task_.Stop();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100503 if (process_interval_.IsFinite()) {
Sebastian Janssonecb68972019-01-18 10:30:54 +0100504 controller_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov4423c362019-03-06 18:41:39 +0100505 task_queue_.Get(), process_interval_, [this]() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100506 RTC_DCHECK_RUN_ON(&task_queue_);
507 UpdateControllerWithTimeInterval();
Sebastian Janssonecb68972019-01-18 10:30:54 +0100508 return process_interval_;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100509 });
510 }
511}
512
513void RtpTransportControllerSend::UpdateControllerWithTimeInterval() {
Sebastian Jansson16180952018-12-12 16:49:10 +0100514 RTC_DCHECK(controller_);
515 ProcessInterval msg;
516 msg.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
Christoffer Rodbroc610e262019-01-08 10:49:19 +0100517 if (add_pacing_to_cwin_)
518 msg.pacer_queue = DataSize::bytes(pacer_.QueueSizeBytes());
Sebastian Jansson16180952018-12-12 16:49:10 +0100519 PostUpdates(controller_->OnProcessInterval(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100520}
521
522void RtpTransportControllerSend::UpdateStreamsConfig() {
523 streams_config_.at_time = Timestamp::ms(clock_->TimeInMilliseconds());
524 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100525 PostUpdates(controller_->OnStreamsConfig(streams_config_));
526}
527
528void RtpTransportControllerSend::PostUpdates(NetworkControlUpdate update) {
529 if (update.congestion_window) {
530 if (update.congestion_window->IsFinite())
531 pacer_.SetCongestionWindow(update.congestion_window->bytes());
532 else
533 pacer_.SetCongestionWindow(PacedSender::kNoCongestionWindow);
534 }
535 if (update.pacer_config) {
536 pacer_.SetPacingRates(update.pacer_config->data_rate().bps(),
537 update.pacer_config->pad_rate().bps());
538 }
539 for (const auto& probe : update.probe_cluster_configs) {
540 int64_t bitrate_bps = probe.target_data_rate.bps();
Piotr (Peter) Slatalac39f4622019-02-15 07:38:04 -0800541 pacer_.CreateProbeCluster(bitrate_bps, probe.id);
Sebastian Jansson16180952018-12-12 16:49:10 +0100542 }
543 if (update.target_rate) {
544 control_handler_->SetTargetRate(*update.target_rate);
545 UpdateControlState();
546 }
Sebastian Jansson87609be2018-12-05 17:35:35 +0100547}
548
549void RtpTransportControllerSend::OnReceivedRtcpReceiverReportBlocks(
550 const ReportBlockList& report_blocks,
551 int64_t now_ms) {
552 if (report_blocks.empty())
553 return;
554
555 int total_packets_lost_delta = 0;
556 int total_packets_delta = 0;
557
558 // Compute the packet loss from all report blocks.
559 for (const RTCPReportBlock& report_block : report_blocks) {
560 auto it = last_report_blocks_.find(report_block.source_ssrc);
561 if (it != last_report_blocks_.end()) {
562 auto number_of_packets = report_block.extended_highest_sequence_number -
563 it->second.extended_highest_sequence_number;
564 total_packets_delta += number_of_packets;
565 auto lost_delta = report_block.packets_lost - it->second.packets_lost;
566 total_packets_lost_delta += lost_delta;
567 }
568 last_report_blocks_[report_block.source_ssrc] = report_block;
569 }
570 // Can only compute delta if there has been previous blocks to compare to. If
571 // not, total_packets_delta will be unchanged and there's nothing more to do.
572 if (!total_packets_delta)
573 return;
574 int packets_received_delta = total_packets_delta - total_packets_lost_delta;
575 // To detect lost packets, at least one packet has to be received. This check
576 // is needed to avoid bandwith detection update in
577 // VideoSendStreamTest.SuspendBelowMinBitrate
578
579 if (packets_received_delta < 1)
580 return;
581 Timestamp now = Timestamp::ms(now_ms);
582 TransportLossReport msg;
583 msg.packets_lost_delta = total_packets_lost_delta;
584 msg.packets_received_delta = packets_received_delta;
585 msg.receive_time = now;
586 msg.start_time = last_report_block_time_;
587 msg.end_time = now;
588 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100589 PostUpdates(controller_->OnTransportLossReport(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100590 last_report_block_time_ = now;
591}
592
nissecae45d02017-04-24 05:53:20 -0700593} // namespace webrtc