1 /* 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 16 #include "rtc_base/system/rtc_export.h" 17 18 namespace 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. 26 class RTC_EXPORT DataRateLimiter { 27 public: 28 // For example, 100kb per second. DataRateLimiter(size_t max,double period)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) {} ~DataRateLimiter()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 used_in_period()45 size_t used_in_period() const { return used_in_period_; } 46 max_per_period()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_ 59