blob: 64b18e5866e96c23d1ba6583d8f773d6ffe40ffc [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
Mirko Bonadei317a1f02019-09-17 17:06:18 +020012#include <memory>
Sebastian Jansson91bb6672018-02-21 13:02:51 +010013#include <utility>
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020014#include <vector>
nissecae45d02017-04-24 05:53:20 -070015
Mirko Bonadei06d35592020-04-01 13:43:08 +020016#include "absl/strings/match.h"
Ali Tofigh641a1b12022-05-17 11:48:46 +020017#include "absl/strings/string_view.h"
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "absl/types/optional.h"
Sebastian Jansson87609be2018-12-05 17:35:35 +010019#include "api/transport/goog_cc_factory.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "api/transport/network_types.h"
21#include "api/units/data_rate.h"
22#include "api/units/time_delta.h"
23#include "api/units/timestamp.h"
Yves Gerey3e707812018-11-28 16:47:49 +010024#include "call/rtp_video_sender.h"
Sebastian Jansson0a5ed892019-09-18 15:37:31 +020025#include "logging/rtc_event_log/events/rtc_event_remote_estimate.h"
Sebastian Jansson166b45d2019-05-13 11:57:42 +020026#include "logging/rtc_event_log/events/rtc_event_route_change.h"
Sebastian Jansson658f1812020-01-16 10:59:28 +010027#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
Yves Gerey3e707812018-11-28 16:47:49 +010028#include "rtc_base/checks.h"
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010029#include "rtc_base/logging.h"
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020030#include "rtc_base/rate_limiter.h"
nissecae45d02017-04-24 05:53:20 -070031
32namespace webrtc {
Sebastian Jansson19bea512018-03-13 19:07:46 +010033namespace {
Stefan Holmerdbdb3a02018-07-17 16:03:46 +020034static const int64_t kRetransmitWindowSizeMs = 500;
Stefan Holmer64be7fa2018-10-04 15:21:55 +020035static const size_t kMaxOverheadBytes = 500;
Sebastian Jansson19bea512018-03-13 19:07:46 +010036
Danil Chapovalov0c626af2020-02-10 11:16:00 +010037constexpr TimeDelta kPacerQueueUpdateInterval = TimeDelta::Millis(25);
Sebastian Jansson87609be2018-12-05 17:35:35 +010038
39TargetRateConstraints ConvertConstraints(int min_bitrate_bps,
40 int max_bitrate_bps,
41 int start_bitrate_bps,
Sebastian Janssonaa01f272019-01-30 11:28:59 +010042 Clock* clock) {
Sebastian Jansson87609be2018-12-05 17:35:35 +010043 TargetRateConstraints msg;
Danil Chapovalov0c626af2020-02-10 11:16:00 +010044 msg.at_time = Timestamp::Millis(clock->TimeInMilliseconds());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010045 msg.min_data_rate = min_bitrate_bps >= 0
46 ? DataRate::BitsPerSec(min_bitrate_bps)
47 : DataRate::Zero();
48 msg.max_data_rate = max_bitrate_bps > 0
49 ? DataRate::BitsPerSec(max_bitrate_bps)
50 : DataRate::Infinity();
Sebastian Jansson87609be2018-12-05 17:35:35 +010051 if (start_bitrate_bps > 0)
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +010052 msg.starting_rate = DataRate::BitsPerSec(start_bitrate_bps);
Sebastian Jansson87609be2018-12-05 17:35:35 +010053 return msg;
54}
55
56TargetRateConstraints ConvertConstraints(const BitrateConstraints& contraints,
Sebastian Janssonaa01f272019-01-30 11:28:59 +010057 Clock* clock) {
Sebastian Jansson87609be2018-12-05 17:35:35 +010058 return ConvertConstraints(contraints.min_bitrate_bps,
59 contraints.max_bitrate_bps,
60 contraints.start_bitrate_bps, clock);
61}
Erik Språng662678d2019-11-15 17:18:52 +010062
Jonas Orelande62c2f22022-03-29 11:04:48 +020063bool IsEnabled(const FieldTrialsView& trials, absl::string_view key) {
Erik Språnge486a7b2022-03-15 15:13:25 +010064 return absl::StartsWith(trials.Lookup(key), "Enabled");
Erik Språng662678d2019-11-15 17:18:52 +010065}
66
Jonas Orelande62c2f22022-03-29 11:04:48 +020067bool IsDisabled(const FieldTrialsView& trials, absl::string_view key) {
Erik Språnge486a7b2022-03-15 15:13:25 +010068 return absl::StartsWith(trials.Lookup(key), "Disabled");
Jakob Ivarsson36274f92020-10-22 13:01:07 +020069}
70
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +010071bool IsRelayed(const rtc::NetworkRoute& route) {
72 return route.local.uses_turn() || route.remote.uses_turn();
Christoffer Rodbrob0ca5192020-03-26 09:22:24 +010073}
Sebastian Jansson19bea512018-03-13 19:07:46 +010074} // namespace
nissecae45d02017-04-24 05:53:20 -070075
Erik Språng0f86c1f2021-10-26 16:19:03 +020076RtpTransportControllerSend::PacerSettings::PacerSettings(
Jonas Orelande62c2f22022-03-29 11:04:48 +020077 const FieldTrialsView& trials)
Erik Språngf3f3a612022-05-13 15:55:29 +020078 : holdback_window("holdback_window", TimeDelta::Millis(5)),
Erik Språng128addb2022-03-31 14:47:34 +020079 holdback_packets("holdback_packets", 3) {
Erik Språngf3f3a612022-05-13 15:55:29 +020080 ParseFieldTrial({&holdback_window, &holdback_packets},
Erik Språnge486a7b2022-03-15 15:13:25 +010081 trials.Lookup("WebRTC-TaskQueuePacer"));
Erik Språng0f86c1f2021-10-26 16:19:03 +020082}
83
nissecae45d02017-04-24 05:53:20 -070084RtpTransportControllerSend::RtpTransportControllerSend(
85 Clock* clock,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +010086 webrtc::RtcEventLog* event_log,
Ying Wang0810a7c2019-04-10 13:48:24 +020087 NetworkStatePredictorFactoryInterface* predictor_factory,
Sebastian Janssondfce03a2018-05-18 18:05:10 +020088 NetworkControllerFactoryInterface* controller_factory,
Sebastian Janssoned50e6c2019-03-01 14:45:21 +010089 const BitrateConstraints& bitrate_config,
Erik Språng662678d2019-11-15 17:18:52 +010090 TaskQueueFactory* task_queue_factory,
Jonas Orelande62c2f22022-03-29 11:04:48 +020091 const FieldTrialsView& trials)
Sebastian Jansson19704ec2018-03-12 15:59:12 +010092 : clock_(clock),
Sebastian Jansson166b45d2019-05-13 11:57:42 +020093 event_log_(event_log),
Sebastian Jansson317a5222018-03-16 15:36:37 +010094 bitrate_configurator_(bitrate_config),
Etienne Pierre-doray03bce3f2021-03-29 17:36:15 +000095 pacer_started_(false),
Erik Språng0f86c1f2021-10-26 16:19:03 +020096 pacer_settings_(trials),
Erik Språngf3f3a612022-05-13 15:55:29 +020097 pacer_(clock,
98 &packet_router_,
99 trials,
100 task_queue_factory,
101 pacer_settings_.holdback_window.Get(),
102 pacer_settings_.holdback_packets.Get()),
Sebastian Jansson317a5222018-03-16 15:36:37 +0100103 observer_(nullptr),
Sebastian Jansson87609be2018-12-05 17:35:35 +0100104 controller_factory_override_(controller_factory),
105 controller_factory_fallback_(
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200106 std::make_unique<GoogCcNetworkControllerFactory>(predictor_factory)),
Sebastian Jansson87609be2018-12-05 17:35:35 +0100107 process_interval_(controller_factory_fallback_->GetProcessInterval()),
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100108 last_report_block_time_(Timestamp::Millis(clock_->TimeInMilliseconds())),
Sebastian Jansson87609be2018-12-05 17:35:35 +0100109 reset_feedback_on_route_change_(
Erik Språng014dd3c2019-11-28 13:44:25 +0100110 !IsEnabled(trials, "WebRTC-Bwe-NoFeedbackReset")),
Sebastian Jansson87609be2018-12-05 17:35:35 +0100111 send_side_bwe_with_overhead_(
Jakob Ivarsson36274f92020-10-22 13:01:07 +0200112 !IsDisabled(trials, "WebRTC-SendSideBwe-WithOverhead")),
Christoffer Rodbroc610e262019-01-08 10:49:19 +0100113 add_pacing_to_cwin_(
Erik Språng014dd3c2019-11-28 13:44:25 +0100114 IsEnabled(trials, "WebRTC-AddPacingToCongestionWindowPushback")),
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +0100115 relay_bandwidth_cap_("relay_cap", DataRate::PlusInfinity()),
Sebastian Jansson87609be2018-12-05 17:35:35 +0100116 transport_overhead_bytes_per_packet_(0),
117 network_available_(false),
Erik Språng66734372022-03-16 14:20:49 +0100118 congestion_window_size_(DataSize::PlusInfinity()),
119 is_congested_(false),
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200120 retransmission_rate_limiter_(clock, kRetransmitWindowSizeMs),
Sebastian Janssoned50e6c2019-03-01 14:45:21 +0100121 task_queue_(task_queue_factory->CreateTaskQueue(
122 "rtp_send_controller",
Jonas Orelandc7f691a2022-03-09 15:12:07 +0100123 TaskQueueFactory::Priority::NORMAL)),
Erik Språnge486a7b2022-03-15 15:13:25 +0100124 field_trials_(trials) {
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +0100125 ParseFieldTrial({&relay_bandwidth_cap_},
Erik Språnge486a7b2022-03-15 15:13:25 +0100126 trials.Lookup("WebRTC-Bwe-NetworkRouteConstraints"));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100127 initial_config_.constraints = ConvertConstraints(bitrate_config, clock_);
Sebastian Janssondf88cc02019-04-15 15:42:25 +0200128 initial_config_.event_log = event_log;
Erik Språnge486a7b2022-03-15 15:13:25 +0100129 initial_config_.key_value_config = &trials;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100130 RTC_DCHECK(bitrate_config.start_bitrate_bps > 0);
131
Erik Språngf3f3a612022-05-13 15:55:29 +0200132 pacer_.SetPacingRates(DataRate::BitsPerSec(bitrate_config.start_bitrate_bps),
133 DataRate::Zero());
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100134}
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +0100135
136RtpTransportControllerSend::~RtpTransportControllerSend() {
Tommi1050fbc2021-06-03 17:58:28 +0200137 RTC_DCHECK(video_rtp_senders_.empty());
Sebastian Janssonc33c0fc2018-02-22 11:10:18 +0100138}
nissecae45d02017-04-24 05:53:20 -0700139
Stefan Holmer9416ef82018-07-19 10:34:38 +0200140RtpVideoSenderInterface* RtpTransportControllerSend::CreateRtpVideoSender(
Tommi86952822021-11-29 10:26:40 +0100141 const std::map<uint32_t, RtpState>& suspended_ssrcs,
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200142 const std::map<uint32_t, RtpPayloadState>& states,
143 const RtpConfig& rtp_config,
Jiawei Ou55718122018-11-09 13:17:39 -0800144 int rtcp_report_interval_ms,
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200145 Transport* send_transport,
146 const RtpSenderObservers& observers,
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200147 RtcEventLog* event_log,
Benjamin Wright192eeec2018-10-17 17:27:25 -0700148 std::unique_ptr<FecController> fec_controller,
Marina Cioceae77912b2020-02-27 16:16:55 +0100149 const RtpSenderFrameEncryptionConfig& frame_encryption_config,
150 rtc::scoped_refptr<FrameTransformerInterface> frame_transformer) {
Tommi1050fbc2021-06-03 17:58:28 +0200151 RTC_DCHECK_RUN_ON(&main_thread_);
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200152 video_rtp_senders_.push_back(std::make_unique<RtpVideoSender>(
Sebastian Jansson572c60f2019-03-04 18:30:41 +0100153 clock_, suspended_ssrcs, states, rtp_config, rtcp_report_interval_ms,
Oleh Prypine8964902019-03-29 15:33:01 +0000154 send_transport, observers,
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200155 // TODO(holmer): Remove this circular dependency by injecting
156 // the parts of RtpTransportControllerSendInterface that are really used.
Benjamin Wright192eeec2018-10-17 17:27:25 -0700157 this, event_log, &retransmission_rate_limiter_, std::move(fec_controller),
158 frame_encryption_config.frame_encryptor,
Jonas Orelandc7f691a2022-03-09 15:12:07 +0100159 frame_encryption_config.crypto_options, std::move(frame_transformer),
160 field_trials_));
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200161 return video_rtp_senders_.back().get();
162}
163
Stefan Holmer9416ef82018-07-19 10:34:38 +0200164void RtpTransportControllerSend::DestroyRtpVideoSender(
165 RtpVideoSenderInterface* rtp_video_sender) {
Tommi1050fbc2021-06-03 17:58:28 +0200166 RTC_DCHECK_RUN_ON(&main_thread_);
Stefan Holmer9416ef82018-07-19 10:34:38 +0200167 std::vector<std::unique_ptr<RtpVideoSenderInterface>>::iterator it =
Stefan Holmer5ed25af2018-07-18 15:17:14 +0200168 video_rtp_senders_.end();
169 for (it = video_rtp_senders_.begin(); it != video_rtp_senders_.end(); ++it) {
170 if (it->get() == rtp_video_sender) {
171 break;
172 }
173 }
174 RTC_DCHECK(it != video_rtp_senders_.end());
175 video_rtp_senders_.erase(it);
176}
177
Sebastian Jansson16180952018-12-12 16:49:10 +0100178void RtpTransportControllerSend::UpdateControlState() {
179 absl::optional<TargetTransferRate> update = control_handler_->GetUpdate();
180 if (!update)
181 return;
Sebastian Janssonf34116e2019-09-24 17:55:50 +0200182 retransmission_rate_limiter_.SetMaxRate(update->target_rate.bps());
Sebastian Jansson16180952018-12-12 16:49:10 +0100183 // We won't create control_handler_ until we have an observers.
Sebastian Jansson87609be2018-12-05 17:35:35 +0100184 RTC_DCHECK(observer_ != nullptr);
Sebastian Jansson16180952018-12-12 16:49:10 +0100185 observer_->OnTargetTransferRate(*update);
Sebastian Janssone6256052018-05-04 14:08:15 +0200186}
187
Erik Språng66734372022-03-16 14:20:49 +0100188void RtpTransportControllerSend::UpdateCongestedState() {
189 bool congested = transport_feedback_adapter_.GetOutstandingData() >=
190 congestion_window_size_;
191 if (congested != is_congested_) {
192 is_congested_ = congested;
Erik Språngf3f3a612022-05-13 15:55:29 +0200193 pacer_.SetCongested(congested);
Erik Språng66734372022-03-16 14:20:49 +0100194 }
195}
196
Sebastian Janssone6256052018-05-04 14:08:15 +0200197rtc::TaskQueue* RtpTransportControllerSend::GetWorkerQueue() {
198 return &task_queue_;
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100199}
200
nisse76e62b02017-05-31 02:24:52 -0700201PacketRouter* RtpTransportControllerSend::packet_router() {
202 return &packet_router_;
203}
204
Sebastian Janssone1795f42019-07-24 11:38:03 +0200205NetworkStateEstimateObserver*
206RtpTransportControllerSend::network_state_estimate_observer() {
207 return this;
208}
209
nisse76e62b02017-05-31 02:24:52 -0700210TransportFeedbackObserver*
211RtpTransportControllerSend::transport_feedback_observer() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100212 return this;
nisse76e62b02017-05-31 02:24:52 -0700213}
214
Erik Språngaa59eca2019-07-24 14:52:55 +0200215RtpPacketSender* RtpTransportControllerSend::packet_sender() {
Erik Språngf3f3a612022-05-13 15:55:29 +0200216 return &pacer_;
nisse76e62b02017-05-31 02:24:52 -0700217}
218
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200219void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200220 BitrateAllocationLimits limits) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100221 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson93b1ea22019-09-18 18:31:52 +0200222 streams_config_.min_total_allocated_bitrate = limits.min_allocatable_rate;
223 streams_config_.max_padding_rate = limits.max_padding_rate;
224 streams_config_.max_total_allocated_bitrate = limits.max_allocatable_rate;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100225 UpdateStreamsConfig();
Stefan Holmer5c8942a2017-08-22 16:16:44 +0200226}
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100227void RtpTransportControllerSend::SetPacingFactor(float pacing_factor) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100228 RTC_DCHECK_RUN_ON(&task_queue_);
229 streams_config_.pacing_factor = pacing_factor;
230 UpdateStreamsConfig();
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100231}
232void RtpTransportControllerSend::SetQueueTimeLimit(int limit_ms) {
Erik Språngf3f3a612022-05-13 15:55:29 +0200233 pacer_.SetQueueTimeLimit(TimeDelta::Millis(limit_ms));
Sebastian Jansson4c1ffb82018-02-15 16:51:58 +0100234}
Sebastian Janssonf2988552019-10-29 17:18:51 +0100235StreamFeedbackProvider*
236RtpTransportControllerSend::GetStreamFeedbackProvider() {
JT Tehea992f82020-01-15 18:24:20 +0000237 return &feedback_demuxer_;
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100238}
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100239
240void RtpTransportControllerSend::RegisterTargetTransferRateObserver(
241 TargetTransferRateObserver* observer) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100242 task_queue_.PostTask([this, observer] {
243 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson19704ec2018-03-12 15:59:12 +0100244 RTC_DCHECK(observer_ == nullptr);
245 observer_ = observer;
Sebastian Jansson2701bc92018-12-11 15:02:47 +0100246 observer_->OnStartRateUpdate(*initial_config_.constraints.starting_rate);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100247 MaybeCreateControllers();
248 });
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100249}
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +0100250
251bool RtpTransportControllerSend::IsRelevantRouteChange(
252 const rtc::NetworkRoute& old_route,
253 const rtc::NetworkRoute& new_route) const {
254 // TODO(bugs.webrtc.org/11438): Experiment with using more information/
255 // other conditions.
256 bool connected_changed = old_route.connected != new_route.connected;
257 bool route_ids_changed =
258 old_route.local.network_id() != new_route.local.network_id() ||
259 old_route.remote.network_id() != new_route.remote.network_id();
260 if (relay_bandwidth_cap_->IsFinite()) {
261 bool relaying_changed = IsRelayed(old_route) != IsRelayed(new_route);
262 return connected_changed || route_ids_changed || relaying_changed;
263 } else {
264 return connected_changed || route_ids_changed;
265 }
266}
267
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100268void RtpTransportControllerSend::OnNetworkRouteChanged(
Ali Tofigh641a1b12022-05-17 11:48:46 +0200269 absl::string_view transport_name,
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100270 const rtc::NetworkRoute& network_route) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100271 // Check if the network route is connected.
Jonas Oreland71fda362020-03-20 16:11:56 +0100272
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100273 if (!network_route.connected) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100274 // TODO(honghaiz): Perhaps handle this in SignalChannelNetworkState and
275 // consider merging these two methods.
276 return;
277 }
278
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +0100279 absl::optional<BitrateConstraints> relay_constraint_update =
280 ApplyOrLiftRelayCap(IsRelayed(network_route));
281
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100282 // Check whether the network route has changed on each transport.
Ali Tofighc48f9ef2022-08-17 19:20:04 +0200283 auto result = network_routes_.insert(
284 // Explicit conversion of transport_name to std::string here is necessary
285 // to support some platforms that cannot yet deal with implicit
286 // conversion in these types of situations.
287 std::make_pair(std::string(transport_name), network_route));
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100288 auto kv = result.first;
289 bool inserted = result.second;
Jonas Oreland5b6a4d82020-03-24 07:36:52 +0100290 if (inserted || !(kv->second == network_route)) {
291 RTC_LOG(LS_INFO) << "Network route changed on transport " << transport_name
292 << ": new_route = " << network_route.DebugString();
293 if (!inserted) {
294 RTC_LOG(LS_INFO) << "old_route = " << kv->second.DebugString();
295 }
296 }
297
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100298 if (inserted) {
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +0100299 if (relay_constraint_update.has_value()) {
300 UpdateBitrateConstraints(*relay_constraint_update);
301 }
Jakob Ivarssonb4cdd622020-02-13 14:01:26 +0100302 task_queue_.PostTask([this, network_route] {
303 RTC_DCHECK_RUN_ON(&task_queue_);
304 transport_overhead_bytes_per_packet_ = network_route.packet_overhead;
305 });
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100306 // No need to reset BWE if this is the first time the network connects.
307 return;
308 }
Jonas Oreland5b6a4d82020-03-24 07:36:52 +0100309
310 const rtc::NetworkRoute old_route = kv->second;
Jonas Oreland71fda362020-03-20 16:11:56 +0100311 kv->second = network_route;
Jonas Oreland71fda362020-03-20 16:11:56 +0100312
313 // Check if enough conditions of the new/old route has changed
314 // to trigger resetting of bitrates (and a probe).
Christoffer Rodbrob0ca5192020-03-26 09:22:24 +0100315 if (IsRelevantRouteChange(old_route, network_route)) {
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100316 BitrateConstraints bitrate_config = bitrate_configurator_.GetConfig();
Jonas Oreland71fda362020-03-20 16:11:56 +0100317 RTC_LOG(LS_INFO) << "Reset bitrates to min: "
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100318 << bitrate_config.min_bitrate_bps
319 << " bps, start: " << bitrate_config.start_bitrate_bps
320 << " bps, max: " << bitrate_config.max_bitrate_bps
321 << " bps.";
322 RTC_DCHECK_GT(bitrate_config.start_bitrate_bps, 0);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100323
Sebastian Jansson166b45d2019-05-13 11:57:42 +0200324 if (event_log_) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200325 event_log_->Log(std::make_unique<RtcEventRouteChange>(
Sebastian Jansson166b45d2019-05-13 11:57:42 +0200326 network_route.connected, network_route.packet_overhead));
327 }
Sebastian Jansson87609be2018-12-05 17:35:35 +0100328 NetworkRouteChange msg;
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100329 msg.at_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 17:35:35 +0100330 msg.constraints = ConvertConstraints(bitrate_config, clock_);
Sebastian Jansson658f1812020-01-16 10:59:28 +0100331 task_queue_.PostTask([this, msg, network_route] {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100332 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson658f1812020-01-16 10:59:28 +0100333 transport_overhead_bytes_per_packet_ = network_route.packet_overhead;
334 if (reset_feedback_on_route_change_) {
Christoffer Rodbrob0ca5192020-03-26 09:22:24 +0100335 transport_feedback_adapter_.SetNetworkRoute(network_route);
Sebastian Jansson658f1812020-01-16 10:59:28 +0100336 }
Sebastian Jansson87609be2018-12-05 17:35:35 +0100337 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100338 PostUpdates(controller_->OnNetworkRouteChange(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100339 } else {
340 UpdateInitialConstraints(msg.constraints);
341 }
Erik Språng66734372022-03-16 14:20:49 +0100342 is_congested_ = false;
Erik Språngf3f3a612022-05-13 15:55:29 +0200343 pacer_.SetCongested(false);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100344 });
Sebastian Jansson91bb6672018-02-21 13:02:51 +0100345 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100346}
347void RtpTransportControllerSend::OnNetworkAvailability(bool network_available) {
Tommi1050fbc2021-06-03 17:58:28 +0200348 RTC_DCHECK_RUN_ON(&main_thread_);
Harald Alvestrand977b2652019-12-12 13:40:50 +0100349 RTC_LOG(LS_VERBOSE) << "SignalNetworkState "
350 << (network_available ? "Up" : "Down");
Sebastian Jansson87609be2018-12-05 17:35:35 +0100351 NetworkAvailability msg;
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100352 msg.at_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 17:35:35 +0100353 msg.network_available = network_available;
354 task_queue_.PostTask([this, msg]() {
355 RTC_DCHECK_RUN_ON(&task_queue_);
Sebastian Jansson16180952018-12-12 16:49:10 +0100356 if (network_available_ == msg.network_available)
357 return;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100358 network_available_ = msg.network_available;
Sebastian Jansson16180952018-12-12 16:49:10 +0100359 if (network_available_) {
Erik Språngf3f3a612022-05-13 15:55:29 +0200360 pacer_.Resume();
Sebastian Jansson16180952018-12-12 16:49:10 +0100361 } else {
Erik Språngf3f3a612022-05-13 15:55:29 +0200362 pacer_.Pause();
Sebastian Jansson16180952018-12-12 16:49:10 +0100363 }
Erik Språng66734372022-03-16 14:20:49 +0100364 is_congested_ = false;
Erik Språngf3f3a612022-05-13 15:55:29 +0200365 pacer_.SetCongested(false);
Sebastian Jansson16180952018-12-12 16:49:10 +0100366
Sebastian Jansson87609be2018-12-05 17:35:35 +0100367 if (controller_) {
Sebastian Jansson16180952018-12-12 16:49:10 +0100368 control_handler_->SetNetworkAvailability(network_available_);
369 PostUpdates(controller_->OnNetworkAvailability(msg));
370 UpdateControlState();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100371 } else {
372 MaybeCreateControllers();
373 }
374 });
375
Stefan Holmerdbdb3a02018-07-17 16:03:46 +0200376 for (auto& rtp_sender : video_rtp_senders_) {
377 rtp_sender->OnNetworkAvailability(network_available);
378 }
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100379}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100380RtcpBandwidthObserver* RtpTransportControllerSend::GetBandwidthObserver() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100381 return this;
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100382}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100383int64_t RtpTransportControllerSend::GetPacerQueuingDelayMs() const {
Erik Språngf3f3a612022-05-13 15:55:29 +0200384 return pacer_.OldestPacketWaitTime().ms();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100385}
Erik Språng425d6aa2019-07-29 16:38:27 +0200386absl::optional<Timestamp> RtpTransportControllerSend::GetFirstPacketTime()
387 const {
Erik Språngf3f3a612022-05-13 15:55:29 +0200388 return pacer_.FirstSentPacketTime();
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100389}
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100390void RtpTransportControllerSend::EnablePeriodicAlrProbing(bool enable) {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100391 task_queue_.PostTask([this, enable]() {
392 RTC_DCHECK_RUN_ON(&task_queue_);
393 streams_config_.requests_alr_probing = enable;
394 UpdateStreamsConfig();
395 });
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100396}
397void RtpTransportControllerSend::OnSentPacket(
398 const rtc::SentPacket& sent_packet) {
Sebastian Jansson658f1812020-01-16 10:59:28 +0100399 task_queue_.PostTask([this, sent_packet]() {
400 RTC_DCHECK_RUN_ON(&task_queue_);
401 absl::optional<SentPacket> packet_msg =
402 transport_feedback_adapter_.ProcessSentPacket(sent_packet);
Jianhui Daibf287972021-11-24 22:23:21 +0800403 if (packet_msg) {
Erik Språng66734372022-03-16 14:20:49 +0100404 // Only update outstanding data if:
Jianhui Daibf287972021-11-24 22:23:21 +0800405 // 1. Packet feadback is used.
406 // 2. The packet has not yet received an acknowledgement.
407 // 3. It is not a retransmission of an earlier packet.
Erik Språng66734372022-03-16 14:20:49 +0100408 UpdateCongestedState();
Jianhui Daibf287972021-11-24 22:23:21 +0800409 if (controller_)
410 PostUpdates(controller_->OnSentPacket(*packet_msg));
411 }
Sebastian Jansson658f1812020-01-16 10:59:28 +0100412 });
Sebastian Janssone4be6da2018-02-15 16:51:41 +0100413}
sprangdb2a9fc2017-08-09 06:42:32 -0700414
Ying Wang8b279102019-05-27 17:19:08 +0200415void RtpTransportControllerSend::OnReceivedPacket(
Sebastian Jansson607a6f12019-06-13 17:48:53 +0200416 const ReceivedPacket& packet_msg) {
Ying Wang8b279102019-05-27 17:19:08 +0200417 task_queue_.PostTask([this, packet_msg]() {
418 RTC_DCHECK_RUN_ON(&task_queue_);
419 if (controller_)
420 PostUpdates(controller_->OnReceivedPacket(packet_msg));
421 });
422}
423
Christoffer Rodbrob0ca5192020-03-26 09:22:24 +0100424void RtpTransportControllerSend::UpdateBitrateConstraints(
425 const BitrateConstraints& updated) {
426 TargetRateConstraints msg = ConvertConstraints(updated, clock_);
427 task_queue_.PostTask([this, msg]() {
428 RTC_DCHECK_RUN_ON(&task_queue_);
429 if (controller_) {
430 PostUpdates(controller_->OnTargetRateConstraints(msg));
431 } else {
432 UpdateInitialConstraints(msg);
433 }
434 });
435}
436
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100437void RtpTransportControllerSend::SetSdpBitrateParameters(
438 const BitrateConstraints& constraints) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200439 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100440 bitrate_configurator_.UpdateWithSdpParameters(constraints);
441 if (updated.has_value()) {
Christoffer Rodbrob0ca5192020-03-26 09:22:24 +0100442 UpdateBitrateConstraints(*updated);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100443 } else {
444 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100445 << "WebRTC.RtpTransportControllerSend.SetSdpBitrateParameters: "
Jonas Olssonb2b20312020-01-14 12:11:31 +0100446 "nothing to update";
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100447 }
448}
449
450void RtpTransportControllerSend::SetClientBitratePreferences(
Niels Möller0c4f7be2018-05-07 14:01:37 +0200451 const BitrateSettings& preferences) {
Danil Chapovalovb9b146c2018-06-15 12:28:07 +0200452 absl::optional<BitrateConstraints> updated =
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100453 bitrate_configurator_.UpdateWithClientPreferences(preferences);
454 if (updated.has_value()) {
Christoffer Rodbrob0ca5192020-03-26 09:22:24 +0100455 UpdateBitrateConstraints(*updated);
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100456 } else {
457 RTC_LOG(LS_VERBOSE)
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100458 << "WebRTC.RtpTransportControllerSend.SetClientBitratePreferences: "
Jonas Olssonb2b20312020-01-14 12:11:31 +0100459 "nothing to update";
Sebastian Jansson97f61ea2018-02-21 13:01:55 +0100460 }
461}
Alex Narestbcf91802018-06-25 16:08:36 +0200462
Christoffer Rodbro6404cdd2020-03-26 20:37:21 +0100463absl::optional<BitrateConstraints>
464RtpTransportControllerSend::ApplyOrLiftRelayCap(bool is_relayed) {
465 DataRate cap = is_relayed ? relay_bandwidth_cap_ : DataRate::PlusInfinity();
466 return bitrate_configurator_.UpdateWithRelayCap(cap);
467}
468
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200469void RtpTransportControllerSend::OnTransportOverheadChanged(
470 size_t transport_overhead_bytes_per_packet) {
Tommi1050fbc2021-06-03 17:58:28 +0200471 RTC_DCHECK_RUN_ON(&main_thread_);
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200472 if (transport_overhead_bytes_per_packet >= kMaxOverheadBytes) {
473 RTC_LOG(LS_ERROR) << "Transport overhead exceeds " << kMaxOverheadBytes;
474 return;
475 }
476
Erik Språngf3f3a612022-05-13 15:55:29 +0200477 pacer_.SetTransportOverhead(
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100478 DataSize::Bytes(transport_overhead_bytes_per_packet));
Mirko Bonadeie7bc3a32020-01-29 18:45:00 +0000479
Stefan Holmer64be7fa2018-10-04 15:21:55 +0200480 // TODO(holmer): Call AudioRtpSenders when they have been moved to
481 // RtpTransportControllerSend.
482 for (auto& rtp_video_sender : video_rtp_senders_) {
483 rtp_video_sender->OnTransportOverheadChanged(
484 transport_overhead_bytes_per_packet);
485 }
486}
Sebastian Jansson87609be2018-12-05 17:35:35 +0100487
Erik Språngaa59eca2019-07-24 14:52:55 +0200488void RtpTransportControllerSend::AccountForAudioPacketsInPacedSender(
489 bool account_for_audio) {
Erik Språngf3f3a612022-05-13 15:55:29 +0200490 pacer_.SetAccountForAudioPackets(account_for_audio);
Erik Språngaa59eca2019-07-24 14:52:55 +0200491}
492
Sebastian Janssonc3eb9fd2020-01-29 17:42:52 +0100493void RtpTransportControllerSend::IncludeOverheadInPacedSender() {
Erik Språngf3f3a612022-05-13 15:55:29 +0200494 pacer_.SetIncludeOverhead();
Sebastian Janssonc3eb9fd2020-01-29 17:42:52 +0100495}
496
Erik Språng7703f232020-09-14 11:03:13 +0200497void RtpTransportControllerSend::EnsureStarted() {
Etienne Pierre-doray03bce3f2021-03-29 17:36:15 +0000498 if (!pacer_started_) {
499 pacer_started_ = true;
Erik Språngf3f3a612022-05-13 15:55:29 +0200500 pacer_.EnsureStarted();
Erik Språng7703f232020-09-14 11:03:13 +0200501 }
502}
503
Sebastian Jansson87609be2018-12-05 17:35:35 +0100504void RtpTransportControllerSend::OnReceivedEstimatedBitrate(uint32_t bitrate) {
505 RemoteBitrateReport msg;
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100506 msg.receive_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Danil Chapovalovcad3e0e2020-02-17 18:46:07 +0100507 msg.bandwidth = DataRate::BitsPerSec(bitrate);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100508 task_queue_.PostTask([this, msg]() {
509 RTC_DCHECK_RUN_ON(&task_queue_);
510 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100511 PostUpdates(controller_->OnRemoteBitrateReport(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100512 });
513}
514
515void RtpTransportControllerSend::OnReceivedRtcpReceiverReport(
516 const ReportBlockList& report_blocks,
517 int64_t rtt_ms,
518 int64_t now_ms) {
519 task_queue_.PostTask([this, report_blocks, now_ms]() {
520 RTC_DCHECK_RUN_ON(&task_queue_);
521 OnReceivedRtcpReceiverReportBlocks(report_blocks, now_ms);
522 });
523
524 task_queue_.PostTask([this, now_ms, rtt_ms]() {
525 RTC_DCHECK_RUN_ON(&task_queue_);
526 RoundTripTimeUpdate report;
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100527 report.receive_time = Timestamp::Millis(now_ms);
528 report.round_trip_time = TimeDelta::Millis(rtt_ms);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100529 report.smoothed = false;
Christoffer Rodbro4bd31772019-03-27 12:34:21 +0100530 if (controller_ && !report.round_trip_time.IsZero())
Sebastian Jansson16180952018-12-12 16:49:10 +0100531 PostUpdates(controller_->OnRoundTripTimeUpdate(report));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100532 });
533}
534
Erik Språng30a276b2019-04-23 12:00:11 +0200535void RtpTransportControllerSend::OnAddPacket(
536 const RtpPacketSendInfo& packet_info) {
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100537 Timestamp creation_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson658f1812020-01-16 10:59:28 +0100538 task_queue_.PostTask([this, packet_info, creation_time]() {
539 RTC_DCHECK_RUN_ON(&task_queue_);
Tommi6f542d52022-01-24 13:36:40 +0100540 feedback_demuxer_.AddPacket(packet_info);
Sebastian Jansson658f1812020-01-16 10:59:28 +0100541 transport_feedback_adapter_.AddPacket(
542 packet_info,
543 send_side_bwe_with_overhead_ ? transport_overhead_bytes_per_packet_ : 0,
544 creation_time);
545 });
Sebastian Jansson87609be2018-12-05 17:35:35 +0100546}
547
548void RtpTransportControllerSend::OnTransportFeedback(
549 const rtcp::TransportFeedback& feedback) {
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100550 auto feedback_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson658f1812020-01-16 10:59:28 +0100551 task_queue_.PostTask([this, feedback, feedback_time]() {
552 RTC_DCHECK_RUN_ON(&task_queue_);
Tommi6fba6b72022-01-28 09:00:01 +0100553 feedback_demuxer_.OnTransportFeedback(feedback);
Sebastian Jansson658f1812020-01-16 10:59:28 +0100554 absl::optional<TransportPacketsFeedback> feedback_msg =
555 transport_feedback_adapter_.ProcessTransportFeedback(feedback,
556 feedback_time);
Jianhui Daibf287972021-11-24 22:23:21 +0800557 if (feedback_msg) {
558 if (controller_)
559 PostUpdates(controller_->OnTransportPacketsFeedback(*feedback_msg));
560
Erik Språng66734372022-03-16 14:20:49 +0100561 // Only update outstanding data if any packet is first time acked.
562 UpdateCongestedState();
Sebastian Jansson658f1812020-01-16 10:59:28 +0100563 }
Sebastian Jansson658f1812020-01-16 10:59:28 +0100564 });
Sebastian Jansson87609be2018-12-05 17:35:35 +0100565}
566
Sebastian Janssone1795f42019-07-24 11:38:03 +0200567void RtpTransportControllerSend::OnRemoteNetworkEstimate(
568 NetworkStateEstimate estimate) {
Sebastian Jansson0a5ed892019-09-18 15:37:31 +0200569 if (event_log_) {
570 event_log_->Log(std::make_unique<RtcEventRemoteEstimate>(
571 estimate.link_capacity_lower, estimate.link_capacity_upper));
572 }
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100573 estimate.update_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Janssone1795f42019-07-24 11:38:03 +0200574 task_queue_.PostTask([this, estimate] {
575 RTC_DCHECK_RUN_ON(&task_queue_);
576 if (controller_)
Danil Chapovalove34fb872019-10-21 10:51:08 +0200577 PostUpdates(controller_->OnNetworkStateEstimate(estimate));
Sebastian Janssone1795f42019-07-24 11:38:03 +0200578 });
579}
580
Sebastian Jansson87609be2018-12-05 17:35:35 +0100581void RtpTransportControllerSend::MaybeCreateControllers() {
582 RTC_DCHECK(!controller_);
583 RTC_DCHECK(!control_handler_);
584
585 if (!network_available_ || !observer_)
586 return;
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200587 control_handler_ = std::make_unique<CongestionControlHandler>();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100588
589 initial_config_.constraints.at_time =
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100590 Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 17:35:35 +0100591 initial_config_.stream_based_config = streams_config_;
592
593 // TODO(srte): Use fallback controller if no feedback is available.
594 if (controller_factory_override_) {
595 RTC_LOG(LS_INFO) << "Creating overridden congestion controller";
596 controller_ = controller_factory_override_->Create(initial_config_);
597 process_interval_ = controller_factory_override_->GetProcessInterval();
598 } else {
599 RTC_LOG(LS_INFO) << "Creating fallback congestion controller";
600 controller_ = controller_factory_fallback_->Create(initial_config_);
601 process_interval_ = controller_factory_fallback_->GetProcessInterval();
602 }
603 UpdateControllerWithTimeInterval();
604 StartProcessPeriodicTasks();
605}
606
607void RtpTransportControllerSend::UpdateInitialConstraints(
608 TargetRateConstraints new_contraints) {
609 if (!new_contraints.starting_rate)
610 new_contraints.starting_rate = initial_config_.constraints.starting_rate;
611 RTC_DCHECK(new_contraints.starting_rate);
612 initial_config_.constraints = new_contraints;
613}
614
615void RtpTransportControllerSend::StartProcessPeriodicTasks() {
Sebastian Janssonecb68972019-01-18 10:30:54 +0100616 if (!pacer_queue_update_task_.Running()) {
617 pacer_queue_update_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov4423c362019-03-06 18:41:39 +0100618 task_queue_.Get(), kPacerQueueUpdateInterval, [this]() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100619 RTC_DCHECK_RUN_ON(&task_queue_);
Erik Språngf3f3a612022-05-13 15:55:29 +0200620 TimeDelta expected_queue_time = pacer_.ExpectedQueueTime();
Sebastian Jansson16180952018-12-12 16:49:10 +0100621 control_handler_->SetPacerQueue(expected_queue_time);
622 UpdateControlState();
Sebastian Janssonecb68972019-01-18 10:30:54 +0100623 return kPacerQueueUpdateInterval;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100624 });
625 }
Sebastian Janssonecb68972019-01-18 10:30:54 +0100626 controller_task_.Stop();
Sebastian Jansson87609be2018-12-05 17:35:35 +0100627 if (process_interval_.IsFinite()) {
Sebastian Janssonecb68972019-01-18 10:30:54 +0100628 controller_task_ = RepeatingTaskHandle::DelayedStart(
Danil Chapovalov4423c362019-03-06 18:41:39 +0100629 task_queue_.Get(), process_interval_, [this]() {
Sebastian Jansson87609be2018-12-05 17:35:35 +0100630 RTC_DCHECK_RUN_ON(&task_queue_);
631 UpdateControllerWithTimeInterval();
Sebastian Janssonecb68972019-01-18 10:30:54 +0100632 return process_interval_;
Sebastian Jansson87609be2018-12-05 17:35:35 +0100633 });
634 }
635}
636
637void RtpTransportControllerSend::UpdateControllerWithTimeInterval() {
Sebastian Jansson16180952018-12-12 16:49:10 +0100638 RTC_DCHECK(controller_);
639 ProcessInterval msg;
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100640 msg.at_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Christoffer Rodbroc610e262019-01-08 10:49:19 +0100641 if (add_pacing_to_cwin_)
Erik Språngf3f3a612022-05-13 15:55:29 +0200642 msg.pacer_queue = pacer_.QueueSizeData();
Sebastian Jansson16180952018-12-12 16:49:10 +0100643 PostUpdates(controller_->OnProcessInterval(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100644}
645
646void RtpTransportControllerSend::UpdateStreamsConfig() {
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100647 streams_config_.at_time = Timestamp::Millis(clock_->TimeInMilliseconds());
Sebastian Jansson87609be2018-12-05 17:35:35 +0100648 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100649 PostUpdates(controller_->OnStreamsConfig(streams_config_));
650}
651
652void RtpTransportControllerSend::PostUpdates(NetworkControlUpdate update) {
653 if (update.congestion_window) {
Erik Språng66734372022-03-16 14:20:49 +0100654 congestion_window_size_ = *update.congestion_window;
655 UpdateCongestedState();
Sebastian Jansson16180952018-12-12 16:49:10 +0100656 }
657 if (update.pacer_config) {
Erik Språngf3f3a612022-05-13 15:55:29 +0200658 pacer_.SetPacingRates(update.pacer_config->data_rate(),
659 update.pacer_config->pad_rate());
Sebastian Jansson16180952018-12-12 16:49:10 +0100660 }
Per Kjellander88af2032022-05-16 19:58:40 +0200661 if (!update.probe_cluster_configs.empty()) {
662 pacer_.CreateProbeClusters(std::move(update.probe_cluster_configs));
Sebastian Jansson16180952018-12-12 16:49:10 +0100663 }
664 if (update.target_rate) {
665 control_handler_->SetTargetRate(*update.target_rate);
666 UpdateControlState();
667 }
Sebastian Jansson87609be2018-12-05 17:35:35 +0100668}
669
670void RtpTransportControllerSend::OnReceivedRtcpReceiverReportBlocks(
671 const ReportBlockList& report_blocks,
672 int64_t now_ms) {
673 if (report_blocks.empty())
674 return;
675
676 int total_packets_lost_delta = 0;
677 int total_packets_delta = 0;
678
679 // Compute the packet loss from all report blocks.
680 for (const RTCPReportBlock& report_block : report_blocks) {
681 auto it = last_report_blocks_.find(report_block.source_ssrc);
682 if (it != last_report_blocks_.end()) {
683 auto number_of_packets = report_block.extended_highest_sequence_number -
684 it->second.extended_highest_sequence_number;
685 total_packets_delta += number_of_packets;
686 auto lost_delta = report_block.packets_lost - it->second.packets_lost;
687 total_packets_lost_delta += lost_delta;
688 }
689 last_report_blocks_[report_block.source_ssrc] = report_block;
690 }
691 // Can only compute delta if there has been previous blocks to compare to. If
692 // not, total_packets_delta will be unchanged and there's nothing more to do.
693 if (!total_packets_delta)
694 return;
695 int packets_received_delta = total_packets_delta - total_packets_lost_delta;
696 // To detect lost packets, at least one packet has to be received. This check
697 // is needed to avoid bandwith detection update in
698 // VideoSendStreamTest.SuspendBelowMinBitrate
699
700 if (packets_received_delta < 1)
701 return;
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100702 Timestamp now = Timestamp::Millis(now_ms);
Sebastian Jansson87609be2018-12-05 17:35:35 +0100703 TransportLossReport msg;
704 msg.packets_lost_delta = total_packets_lost_delta;
705 msg.packets_received_delta = packets_received_delta;
706 msg.receive_time = now;
707 msg.start_time = last_report_block_time_;
708 msg.end_time = now;
709 if (controller_)
Sebastian Jansson16180952018-12-12 16:49:10 +0100710 PostUpdates(controller_->OnTransportLossReport(msg));
Sebastian Jansson87609be2018-12-05 17:35:35 +0100711 last_report_block_time_ = now;
712}
713
nissecae45d02017-04-24 05:53:20 -0700714} // namespace webrtc