blob: 502a2f74b201ac3edcc9004147332a4ad2d89893 [file] [log] [blame]
Sebastian Janssonf9c5cf62018-02-28 16:04:26 +01001/*
2 * Copyright 2012 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_DATA_RATE_LIMITER_H_
12#define RTC_BASE_DATA_RATE_LIMITER_H_
13
14#include <stddef.h>
15
Mirko Bonadei35214fc2019-09-23 14:54:28 +020016#include "rtc_base/system/rtc_export.h"
17
Sebastian Janssonf9c5cf62018-02-28 16:04:26 +010018namespace rtc {
19
20// Limits the rate of use to a certain maximum quantity per period of
21// time. Use, for example, for simple bandwidth throttling.
22//
23// It's implemented like a diet plan: You have so many calories per
24// day. If you hit the limit, you can't eat any more until the next
25// day.
Mirko Bonadei35214fc2019-09-23 14:54:28 +020026class RTC_EXPORT DataRateLimiter {
Sebastian Janssonf9c5cf62018-02-28 16:04:26 +010027 public:
28 // For example, 100kb per second.
29 DataRateLimiter(size_t max, double period)
30 : max_per_period_(max),
31 period_length_(period),
32 used_in_period_(0),
33 period_start_(0.0),
34 period_end_(period) {}
35 virtual ~DataRateLimiter() {}
36
37 // Returns true if if the desired quantity is available in the
38 // current period (< (max - used)). Once the given time passes the
39 // end of the period, used is set to zero and more use is available.
40 bool CanUse(size_t desired, double time);
41 // Increment the quantity used this period. If past the end of a
42 // period, a new period is started.
43 void Use(size_t used, double time);
44
45 size_t used_in_period() const { return used_in_period_; }
46
47 size_t max_per_period() const { return max_per_period_; }
48
49 private:
50 size_t max_per_period_;
51 double period_length_;
52 size_t used_in_period_;
53 double period_start_;
54 double period_end_;
55};
56} // namespace rtc
57
58#endif // RTC_BASE_DATA_RATE_LIMITER_H_