/* * Copyright (c) 2015 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_VIDEO_CODING_UTILITY_MOVING_AVERAGE_H_ #define WEBRTC_MODULES_VIDEO_CODING_UTILITY_MOVING_AVERAGE_H_ #include #include "webrtc/typedefs.h" namespace webrtc { template class MovingAverage { public: MovingAverage(); void AddSample(T sample); bool GetAverage(size_t num_samples, T* average); void Reset(); int size(); private: T sum_; std::list samples_; }; template MovingAverage::MovingAverage() : sum_(static_cast(0)) { } template void MovingAverage::AddSample(T sample) { samples_.push_back(sample); sum_ += sample; } template bool MovingAverage::GetAverage(size_t num_samples, T* avg) { if (num_samples > samples_.size()) return false; // Remove old samples. while (num_samples < samples_.size()) { sum_ -= samples_.front(); samples_.pop_front(); } *avg = sum_ / static_cast(num_samples); return true; } template void MovingAverage::Reset() { sum_ = static_cast(0); samples_.clear(); } template int MovingAverage::size() { return samples_.size(); } } // namespace webrtc #endif // WEBRTC_MODULES_VIDEO_CODING_MOVING_AVERAGE_SCALER_H_