| /* |
| * Copyright (c) 2017 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. |
| * |
| */ |
| |
| #include "webrtc/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.h" |
| |
| namespace webrtc { |
| namespace testing { |
| namespace bwe { |
| |
| const size_t MaxBandwidthFilter::kBandwidthWindowFilterSize; |
| |
| MaxBandwidthFilter::MaxBandwidthFilter() |
| : bandwidth_last_round_bytes_per_ms_(0), |
| max_bandwidth_estimate_bps_(0), |
| rounds_without_growth_(0) {} |
| |
| MaxBandwidthFilter::~MaxBandwidthFilter() {} |
| |
| // For detailed explanation about implementing bandwidth filter this way visit |
| // "Bbr design" doc. |sample_bps| was measured during |round|. |
| void MaxBandwidthFilter::AddBandwidthSample(int64_t sample_bps, int64_t round) { |
| if (bandwidth_samples_[0].first == 0 || |
| sample_bps >= bandwidth_samples_[0].first || |
| round - bandwidth_samples_[2].second >= |
| MaxBandwidthFilter::kBandwidthWindowFilterSize) |
| bandwidth_samples_[0] = bandwidth_samples_[1] = |
| bandwidth_samples_[2] = {sample_bps, round}; |
| if (sample_bps >= bandwidth_samples_[1].first) { |
| bandwidth_samples_[1] = {sample_bps, round}; |
| bandwidth_samples_[2] = bandwidth_samples_[1]; |
| } else { |
| if (sample_bps >= bandwidth_samples_[2].first) |
| bandwidth_samples_[2] = {sample_bps, round}; |
| } |
| if (round - bandwidth_samples_[0].second >= |
| MaxBandwidthFilter::kBandwidthWindowFilterSize) { |
| bandwidth_samples_[0] = bandwidth_samples_[1]; |
| bandwidth_samples_[1] = bandwidth_samples_[2]; |
| bandwidth_samples_[2] = {sample_bps, round}; |
| if (round - bandwidth_samples_[0].second >= |
| MaxBandwidthFilter::kBandwidthWindowFilterSize) { |
| bandwidth_samples_[0] = bandwidth_samples_[1]; |
| bandwidth_samples_[1] = bandwidth_samples_[2]; |
| } |
| max_bandwidth_estimate_bps_ = bandwidth_samples_[0].first; |
| return; |
| } |
| if (bandwidth_samples_[1].first == bandwidth_samples_[0].first && |
| round - bandwidth_samples_[1].second > |
| MaxBandwidthFilter::kBandwidthWindowFilterSize / 4) { |
| bandwidth_samples_[2] = bandwidth_samples_[1] = {sample_bps, round}; |
| max_bandwidth_estimate_bps_ = bandwidth_samples_[0].first; |
| return; |
| } |
| if (bandwidth_samples_[2].first == bandwidth_samples_[1].first && |
| round - bandwidth_samples_[2].second > |
| MaxBandwidthFilter::kBandwidthWindowFilterSize / 2) |
| bandwidth_samples_[2] = {sample_bps, round}; |
| max_bandwidth_estimate_bps_ = bandwidth_samples_[0].first; |
| } |
| |
| bool MaxBandwidthFilter::FullBandwidthReached(float growth_target, |
| int max_rounds_without_growth) { |
| // Minimal bandwidth necessary to assume that better bandwidth can still be |
| // found and full bandwidth is not reached. |
| int64_t minimal_bandwidth = |
| bandwidth_last_round_bytes_per_ms_ * growth_target; |
| if (max_bandwidth_estimate_bps_ >= minimal_bandwidth) { |
| bandwidth_last_round_bytes_per_ms_ = max_bandwidth_estimate_bps_; |
| rounds_without_growth_ = 0; |
| return false; |
| } |
| rounds_without_growth_++; |
| return rounds_without_growth_ >= max_rounds_without_growth; |
| } |
| } // namespace bwe |
| } // namespace testing |
| } // namespace webrtc |