|  | /* | 
|  | *  Copyright 2011 The WebRTC Project Authors. All rights reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef WEBRTC_BASE_BANDWIDTHSMOOTHER_H_ | 
|  | #define WEBRTC_BASE_BANDWIDTHSMOOTHER_H_ | 
|  |  | 
|  | #include "webrtc/base/rollingaccumulator.h" | 
|  | #include "webrtc/base/timeutils.h" | 
|  |  | 
|  | namespace rtc { | 
|  |  | 
|  | // The purpose of BandwidthSmoother is to smooth out bandwidth | 
|  | // estimations so that 'trstate' messages can be triggered when we | 
|  | // are "sure" there is sufficient bandwidth.  To avoid frequent fluctuations, | 
|  | // we take a slightly pessimistic view of our bandwidth.  We only increase | 
|  | // our estimation when we have sampled bandwidth measurements of values | 
|  | // at least as large as the current estimation * percent_increase | 
|  | // for at least time_between_increase time.  If a sampled bandwidth | 
|  | // is less than our current estimation we immediately decrease our estimation | 
|  | // to that sampled value. | 
|  | // We retain the initial bandwidth guess as our current bandwidth estimation | 
|  | // until we have received (min_sample_count_percent * samples_count_to_average) | 
|  | // number of samples. Min_sample_count_percent must be in range [0, 1]. | 
|  | class BandwidthSmoother { | 
|  | public: | 
|  | BandwidthSmoother(int initial_bandwidth_guess, | 
|  | uint32_t time_between_increase, | 
|  | double percent_increase, | 
|  | size_t samples_count_to_average, | 
|  | double min_sample_count_percent); | 
|  | ~BandwidthSmoother(); | 
|  |  | 
|  | // Samples a new bandwidth measurement. | 
|  | // bandwidth is expected to be non-negative. | 
|  | // returns true if the bandwidth estimation changed | 
|  | bool Sample(uint32_t sample_time, int bandwidth); | 
|  |  | 
|  | int get_bandwidth_estimation() const { | 
|  | return bandwidth_estimation_; | 
|  | } | 
|  |  | 
|  | private: | 
|  | uint32_t time_between_increase_; | 
|  | double percent_increase_; | 
|  | uint32_t time_at_last_change_; | 
|  | int bandwidth_estimation_; | 
|  | RollingAccumulator<int> accumulator_; | 
|  | double min_sample_count_percent_; | 
|  | }; | 
|  |  | 
|  | }  // namespace rtc | 
|  |  | 
|  | #endif  // WEBRTC_BASE_BANDWIDTHSMOOTHER_H_ |