diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/libwebrtc/rtc_base/rate_limiter.cc | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/rtc_base/rate_limiter.cc')
-rw-r--r-- | third_party/libwebrtc/rtc_base/rate_limiter.cc | 69 |
1 files changed, 69 insertions, 0 deletions
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 <limits> + +#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<uint32_t>::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<uint32_t> 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 |