| /* |
| * 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_ |