rate_limiter.h 1.9 KB

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