/* * Copyright (c) 2018 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 "modules/audio_processing/aec3/skew_estimator.h" #include namespace webrtc { SkewEstimator::SkewEstimator(size_t skew_history_size_log2) : skew_history_size_log2_(static_cast(skew_history_size_log2)), skew_history_(1ULL << skew_history_size_log2_, 0) {} SkewEstimator::~SkewEstimator() = default; void SkewEstimator::Reset() { skew_ = 0; skew_sum_ = 0; next_index_ = 0; sufficient_skew_stored_ = false; std::fill(skew_history_.begin(), skew_history_.end(), 0); } absl::optional SkewEstimator::GetSkewFromCapture() { --skew_; skew_sum_ += skew_ - skew_history_[next_index_]; skew_history_[next_index_] = skew_; if (++next_index_ == skew_history_.size()) { next_index_ = 0; sufficient_skew_stored_ = true; } const int bias = static_cast(skew_history_.size()) >> 1; const int average = (skew_sum_ + bias) >> skew_history_size_log2_; return sufficient_skew_stored_ ? absl::optional(average) : absl::nullopt; } } // namespace webrtc