From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- third_party/libwebrtc/rtc_base/rate_limiter.cc | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 third_party/libwebrtc/rtc_base/rate_limiter.cc (limited to 'third_party/libwebrtc/rtc_base/rate_limiter.cc') diff --git a/third_party/libwebrtc/rtc_base/rate_limiter.cc b/third_party/libwebrtc/rtc_base/rate_limiter.cc new file mode 100644 index 0000000000..0f3f343aed --- /dev/null +++ b/third_party/libwebrtc/rtc_base/rate_limiter.cc @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2016 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 "rtc_base/rate_limiter.h" + +#include + +#include "absl/types/optional.h" +#include "system_wrappers/include/clock.h" + +namespace webrtc { + +RateLimiter::RateLimiter(Clock* clock, int64_t max_window_ms) + : clock_(clock), + current_rate_(max_window_ms, RateStatistics::kBpsScale), + window_size_ms_(max_window_ms), + max_rate_bps_(std::numeric_limits::max()) {} + +RateLimiter::~RateLimiter() {} + +// Usage note: This class is intended be usable in a scenario where different +// threads may call each of the the different method. For instance, a network +// thread trying to send data calling TryUseRate(), the bandwidth estimator +// calling SetMaxRate() and a timed maintenance thread periodically updating +// the RTT. +bool RateLimiter::TryUseRate(size_t packet_size_bytes) { + MutexLock lock(&lock_); + int64_t now_ms = clock_->TimeInMilliseconds(); + absl::optional current_rate = current_rate_.Rate(now_ms); + if (current_rate) { + // If there is a current rate, check if adding bytes would cause maximum + // bitrate target to be exceeded. If there is NOT a valid current rate, + // allow allocating rate even if target is exceeded. This prevents + // problems + // at very low rates, where for instance retransmissions would never be + // allowed due to too high bitrate caused by a single packet. + + size_t bitrate_addition_bps = + (packet_size_bytes * 8 * 1000) / window_size_ms_; + if (*current_rate + bitrate_addition_bps > max_rate_bps_) + return false; + } + + current_rate_.Update(packet_size_bytes, now_ms); + return true; +} + +void RateLimiter::SetMaxRate(uint32_t max_rate_bps) { + MutexLock lock(&lock_); + max_rate_bps_ = max_rate_bps; +} + +// Set the window size over which to measure the current bitrate. +// For retransmissions, this is typically the RTT. +bool RateLimiter::SetWindowSize(int64_t window_size_ms) { + MutexLock lock(&lock_); + window_size_ms_ = window_size_ms; + return current_rate_.SetWindowSize(window_size_ms, + clock_->TimeInMilliseconds()); +} + +} // namespace webrtc -- cgit v1.2.3