To be able to safely move over to the new code, the revised code is added alongside the old code. Most of the files added in this CL are more or less direct copies of the previous code. This new version of send side congestion controller will be activated under a field trial in a followup CL. Bug: webrtc:8415 Change-Id: I034e583cf891a8f6357119739a1517cc0a4abe88 Reviewed-on: https://webrtc-review.googlesource.com/53322 Commit-Queue: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Björn Terelius <terelius@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22212}
84 lines
2.6 KiB
C++
84 lines
2.6 KiB
C++
/*
|
|
* Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "modules/congestion_controller/rtp/pacer_controller.h"
|
|
|
|
#include "modules/congestion_controller/rtp/network_control/include/network_units.h"
|
|
#include "rtc_base/checks.h"
|
|
#include "rtc_base/logging.h"
|
|
|
|
namespace webrtc {
|
|
|
|
PacerController::PacerController(PacedSender* pacer) : pacer_(pacer) {
|
|
sequenced_checker_.Detach();
|
|
}
|
|
|
|
PacerController::~PacerController() = default;
|
|
|
|
void PacerController::OnCongestionWindow(CongestionWindow congestion_window) {
|
|
RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
|
|
if (congestion_window.enabled) {
|
|
congestion_window_ = congestion_window;
|
|
} else {
|
|
congestion_window_ = rtc::nullopt;
|
|
congested_ = false;
|
|
UpdatePacerState();
|
|
}
|
|
}
|
|
|
|
void PacerController::OnNetworkAvailability(NetworkAvailability msg) {
|
|
RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
|
|
network_available_ = msg.network_available;
|
|
congested_ = false;
|
|
UpdatePacerState();
|
|
}
|
|
|
|
void PacerController::OnNetworkRouteChange(NetworkRouteChange) {
|
|
RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
|
|
congested_ = false;
|
|
UpdatePacerState();
|
|
}
|
|
|
|
void PacerController::OnPacerConfig(PacerConfig msg) {
|
|
RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
|
|
DataRate pacing_rate = msg.data_window / msg.time_window;
|
|
DataRate padding_rate = msg.pad_window / msg.time_window;
|
|
pacer_->SetPacingRates(pacing_rate.bps(), padding_rate.bps());
|
|
}
|
|
|
|
void PacerController::OnProbeClusterConfig(ProbeClusterConfig config) {
|
|
RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
|
|
int64_t bitrate_bps = config.target_data_rate.bps();
|
|
pacer_->CreateProbeCluster(bitrate_bps);
|
|
}
|
|
|
|
void PacerController::OnOutstandingData(OutstandingData msg) {
|
|
RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
|
|
if (congestion_window_.has_value()) {
|
|
congested_ = msg.in_flight_data > congestion_window_->data_window;
|
|
}
|
|
UpdatePacerState();
|
|
}
|
|
|
|
void PacerController::UpdatePacerState() {
|
|
bool pause = congested_ || !network_available_;
|
|
SetPacerState(pause);
|
|
}
|
|
|
|
void PacerController::SetPacerState(bool paused) {
|
|
if (paused && !pacer_paused_)
|
|
pacer_->Pause();
|
|
else if (!paused && pacer_paused_)
|
|
pacer_->Resume();
|
|
pacer_paused_ = paused;
|
|
}
|
|
|
|
} // namespace webrtc
|