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