Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright 2011 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 WEBRTC_BASE_BANDWIDTHSMOOTHER_H_
     12 #define WEBRTC_BASE_BANDWIDTHSMOOTHER_H_
     13 
     14 #include "webrtc/base/rollingaccumulator.h"
     15 #include "webrtc/base/timeutils.h"
     16 
     17 namespace rtc {
     18 
     19 // The purpose of BandwidthSmoother is to smooth out bandwidth
     20 // estimations so that 'trstate' messages can be triggered when we
     21 // are "sure" there is sufficient bandwidth.  To avoid frequent fluctuations,
     22 // we take a slightly pessimistic view of our bandwidth.  We only increase
     23 // our estimation when we have sampled bandwidth measurements of values
     24 // at least as large as the current estimation * percent_increase
     25 // for at least time_between_increase time.  If a sampled bandwidth
     26 // is less than our current estimation we immediately decrease our estimation
     27 // to that sampled value.
     28 // We retain the initial bandwidth guess as our current bandwidth estimation
     29 // until we have received (min_sample_count_percent * samples_count_to_average)
     30 // number of samples. Min_sample_count_percent must be in range [0, 1].
     31 class BandwidthSmoother {
     32  public:
     33   BandwidthSmoother(int initial_bandwidth_guess,
     34                     uint32 time_between_increase,
     35                     double percent_increase,
     36                     size_t samples_count_to_average,
     37                     double min_sample_count_percent);
     38 
     39   // Samples a new bandwidth measurement.
     40   // bandwidth is expected to be non-negative.
     41   // returns true if the bandwidth estimation changed
     42   bool Sample(uint32 sample_time, int bandwidth);
     43 
     44   int get_bandwidth_estimation() const {
     45     return bandwidth_estimation_;
     46   }
     47 
     48  private:
     49   uint32 time_between_increase_;
     50   double percent_increase_;
     51   uint32 time_at_last_change_;
     52   int bandwidth_estimation_;
     53   RollingAccumulator<int> accumulator_;
     54   double min_sample_count_percent_;
     55 };
     56 
     57 }  // namespace rtc
     58 
     59 #endif  // WEBRTC_BASE_BANDWIDTHSMOOTHER_H_
     60