// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cobalt/media/base/moving_average.h"

#include <algorithm>

namespace cobalt {
namespace media {

MovingAverage::MovingAverage(size_t depth)
    : depth_(depth), count_(0), samples_(depth_), square_sum_us_(0) {}

MovingAverage::~MovingAverage() {}

void MovingAverage::AddSample(base::TimeDelta sample) {
  // |samples_| is zero-initialized, so |oldest| is also zero before |count_|
  // exceeds |depth_|.
  base::TimeDelta& oldest = samples_[count_++ % depth_];
  total_ += sample - oldest;
  square_sum_us_ += sample.InMicroseconds() * sample.InMicroseconds() -
                    oldest.InMicroseconds() * oldest.InMicroseconds();
  oldest = sample;
}

base::TimeDelta MovingAverage::Average() const {
  DCHECK_GT(count_, 0u);

  // TODO(dalecurtis): Consider limiting |depth| to powers of two so that we can
  // replace the integer divide with a bit shift operation.

  return total_ / std::min(static_cast<uint64_t>(depth_), count_);
}

base::TimeDelta MovingAverage::Deviation() const {
  DCHECK_GT(count_, 0u);

  const double size = std::min(static_cast<uint64_t>(depth_), count_);
  const double average_us = total_.InMicroseconds() / size;
  double sqr_deviation_us = square_sum_us_ / size - average_us * average_us;
  if (sqr_deviation_us < 0) sqr_deviation_us = 0;

  return base::TimeDelta::FromMicroseconds(sqrt(sqr_deviation_us));
}

void MovingAverage::Reset() {
  count_ = 0;
  total_ = base::TimeDelta();
  square_sum_us_ = 0;
  std::fill(samples_.begin(), samples_.end(), base::TimeDelta());
}

}  // namespace media
}  // namespace cobalt
