/* * 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 "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(DataSize congestion_window) { RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_); if (congestion_window.IsFinite()) pacer_->SetCongestionWindow(congestion_window.bytes()); else pacer_->SetCongestionWindow(PacedSender::kNoCongestionWindow); } void PacerController::OnNetworkAvailability(NetworkAvailability msg) { RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_); network_available_ = msg.network_available; pacer_->UpdateOutstandingData(0); SetPacerState(!msg.network_available); } void PacerController::OnNetworkRouteChange(NetworkRouteChange) { RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_); pacer_->UpdateOutstandingData(0); } 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(DataSize in_flight_data) { RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_); pacer_->UpdateOutstandingData(in_flight_data.bytes()); } void PacerController::SetPacerState(bool paused) { if (paused && !pacer_paused_) pacer_->Pause(); else if (!paused && pacer_paused_) pacer_->Resume(); pacer_paused_ = paused; } } // namespace webrtc