xref: /aosp_15_r20/external/webrtc/rtc_base/rate_limiter.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2016 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  */
10 
11 #ifndef RTC_BASE_RATE_LIMITER_H_
12 #define RTC_BASE_RATE_LIMITER_H_
13 
14 #include <stddef.h>
15 #include <stdint.h>
16 
17 #include "rtc_base/rate_statistics.h"
18 #include "rtc_base/synchronization/mutex.h"
19 #include "rtc_base/thread_annotations.h"
20 
21 namespace webrtc {
22 
23 class Clock;
24 
25 // Class used to limit a bitrate, making sure the average does not exceed a
26 // maximum as measured over a sliding window. This class is thread safe; all
27 // methods will acquire (the same) lock befeore executing.
28 class RateLimiter {
29  public:
30   RateLimiter(Clock* clock, int64_t max_window_ms);
31 
32   RateLimiter() = delete;
33   RateLimiter(const RateLimiter&) = delete;
34   RateLimiter& operator=(const RateLimiter&) = delete;
35 
36   ~RateLimiter();
37 
38   // Try to use rate to send bytes. Returns true on success and if so updates
39   // current rate.
40   bool TryUseRate(size_t packet_size_bytes);
41 
42   // Set the maximum bitrate, in bps, that this limiter allows to send.
43   void SetMaxRate(uint32_t max_rate_bps);
44 
45   // Set the window size over which to measure the current bitrate.
46   // For example, irt retransmissions, this is typically the RTT.
47   // Returns true on success and false if window_size_ms is out of range.
48   bool SetWindowSize(int64_t window_size_ms);
49 
50  private:
51   Clock* const clock_;
52   Mutex lock_;
53   RateStatistics current_rate_ RTC_GUARDED_BY(lock_);
54   int64_t window_size_ms_ RTC_GUARDED_BY(lock_);
55   uint32_t max_rate_bps_ RTC_GUARDED_BY(lock_);
56 };
57 
58 }  // namespace webrtc
59 
60 #endif  // RTC_BASE_RATE_LIMITER_H_
61