blob: 82451bd2424c8e44f649345e8c0596aef991c8a5 [file] [log] [blame]
/*
* 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.
*
*/
#ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_
#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_
#include <cstdint>
#include <limits>
#include <list>
#include "webrtc/api/optional.h"
namespace webrtc {
namespace testing {
namespace bwe {
// Average rtt for past |kRttFilterSize| packets should grow by
// |kRttIncreaseThresholdForExpiry| in order to enter PROBE_RTT mode and expire.
// old min_rtt estimate.
const float kRttIncreaseThresholdForExpiry = 2.3f;
const size_t kRttFilterSize = 25;
class MinRttFilter {
public:
// This class implements a simple filter to ensure that PROBE_RTT is only
// entered when RTTs start to increase, instead of fixed 10 second window as
// in orginal BBR design doc, to avoid unnecessary freezes in stream.
MinRttFilter() {}
~MinRttFilter() {}
rtc::Optional<int64_t> min_rtt_ms() { return min_rtt_ms_; }
void AddRttSample(int64_t rtt_ms, int64_t now_ms) {
if (!min_rtt_ms_ || rtt_ms <= *min_rtt_ms_ || MinRttExpired(now_ms)) {
min_rtt_ms_.emplace(rtt_ms);
}
rtt_samples_.push_back(rtt_ms);
if (rtt_samples_.size() > kRttFilterSize)
rtt_samples_.pop_front();
}
// Checks whether or not last RTT values for past |kRttFilterSize| packets
// started to increase, meaning we have to update min_rtt estimate.
bool MinRttExpired(int64_t now_ms) {
if (rtt_samples_.size() < kRttFilterSize || !min_rtt_ms_)
return false;
int64_t sum_of_rtts_ms = 0;
for (int64_t i : rtt_samples_)
sum_of_rtts_ms += i;
if (sum_of_rtts_ms >=
*min_rtt_ms_ * kRttIncreaseThresholdForExpiry * kRttFilterSize) {
rtt_samples_.clear();
return true;
}
return false;
}
private:
rtc::Optional<int64_t> min_rtt_ms_;
std::list<int64_t> rtt_samples_;
};
} // namespace bwe
} // namespace testing
} // namespace webrtc
#endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_