1 /* 2 * libjingle 3 * Copyright 2011, Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifndef TALK_BASE_BANDWIDTHSMOOTHER_H_ 29 #define TALK_BASE_BANDWIDTHSMOOTHER_H_ 30 31 #include "talk/base/rollingaccumulator.h" 32 #include "talk/base/timeutils.h" 33 34 namespace talk_base { 35 36 // The purpose of BandwidthSmoother is to smooth out bandwidth 37 // estimations so that 'trstate' messages can be triggered when we 38 // are "sure" there is sufficient bandwidth. To avoid frequent fluctuations, 39 // we take a slightly pessimistic view of our bandwidth. We only increase 40 // our estimation when we have sampled bandwidth measurements of values 41 // at least as large as the current estimation * percent_increase 42 // for at least time_between_increase time. If a sampled bandwidth 43 // is less than our current estimation we immediately decrease our estimation 44 // to that sampled value. 45 // We retain the initial bandwidth guess as our current bandwidth estimation 46 // until we have received (min_sample_count_percent * samples_count_to_average) 47 // number of samples. Min_sample_count_percent must be in range [0, 1]. 48 class BandwidthSmoother { 49 public: 50 BandwidthSmoother(int initial_bandwidth_guess, 51 uint32 time_between_increase, 52 double percent_increase, 53 size_t samples_count_to_average, 54 double min_sample_count_percent); 55 56 // Samples a new bandwidth measurement. 57 // bandwidth is expected to be non-negative. 58 // returns true if the bandwidth estimation changed 59 bool Sample(uint32 sample_time, int bandwidth); 60 61 int get_bandwidth_estimation() const { 62 return bandwidth_estimation_; 63 } 64 65 private: 66 uint32 time_between_increase_; 67 double percent_increase_; 68 uint32 time_at_last_change_; 69 int bandwidth_estimation_; 70 RollingAccumulator<int> accumulator_; 71 double min_sample_count_percent_; 72 }; 73 74 } // namespace talk_base 75 76 #endif // TALK_BASE_BANDWIDTHSMOOTHER_H_ 77