blob: d290816a2c5c3c1320eff885a75dbbb9eb2667c9 [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
16namespace rtc {
17
18// Limits the rate of use to a certain maximum quantity per period of
19// time. Use, for example, for simple bandwidth throttling.
20//
21// It's implemented like a diet plan: You have so many calories per
22// day. If you hit the limit, you can't eat any more until the next
23// day.
24class DataRateLimiter {
25 public:
26 // For example, 100kb per second.
27 DataRateLimiter(size_t max, double period)
28 : max_per_period_(max),
29 period_length_(period),
30 used_in_period_(0),
31 period_start_(0.0),
32 period_end_(period) {}
33 virtual ~DataRateLimiter() {}
34
35 // Returns true if if the desired quantity is available in the
36 // current period (< (max - used)). Once the given time passes the
37 // end of the period, used is set to zero and more use is available.
38 bool CanUse(size_t desired, double time);
39 // Increment the quantity used this period. If past the end of a
40 // period, a new period is started.
41 void Use(size_t used, double time);
42
43 size_t used_in_period() const { return used_in_period_; }
44
45 size_t max_per_period() const { return max_per_period_; }
46
47 private:
48 size_t max_per_period_;
49 double period_length_;
50 size_t used_in_period_;
51 double period_start_;
52 double period_end_;
53};
54} // namespace rtc
55
56#endif // RTC_BASE_DATA_RATE_LIMITER_H_