/*
 *  Copyright (c) 2016 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/audio_processing/test/performance_timer.h"

#include <math.h>

#include <numeric>

#include "webrtc/rtc_base/checks.h"

namespace webrtc {
namespace test {

PerformanceTimer::PerformanceTimer(int num_frames_to_process)
    : clock_(webrtc::Clock::GetRealTimeClock()) {
  timestamps_us_.reserve(num_frames_to_process);
}

PerformanceTimer::~PerformanceTimer() = default;

void PerformanceTimer::StartTimer() {
  start_timestamp_us_ = rtc::Optional<int64_t>(clock_->TimeInMicroseconds());
}

void PerformanceTimer::StopTimer() {
  RTC_DCHECK(start_timestamp_us_);
  timestamps_us_.push_back(clock_->TimeInMicroseconds() - *start_timestamp_us_);
}

double PerformanceTimer::GetDurationAverage() const {
  return GetDurationAverage(0);
}

double PerformanceTimer::GetDurationStandardDeviation() const {
  return GetDurationStandardDeviation(0);
}

double PerformanceTimer::GetDurationAverage(
    size_t number_of_warmup_samples) const {
  RTC_DCHECK_GT(timestamps_us_.size(), number_of_warmup_samples);
  const size_t number_of_samples =
      timestamps_us_.size() - number_of_warmup_samples;
  return static_cast<double>(
             std::accumulate(timestamps_us_.begin() + number_of_warmup_samples,
                             timestamps_us_.end(), static_cast<int64_t>(0))) /
         number_of_samples;
}

double PerformanceTimer::GetDurationStandardDeviation(
    size_t number_of_warmup_samples) const {
  RTC_DCHECK_GT(timestamps_us_.size(), number_of_warmup_samples);
  const size_t number_of_samples =
      timestamps_us_.size() - number_of_warmup_samples;
  RTC_DCHECK_GT(number_of_samples, 0);
  double average_duration = GetDurationAverage(number_of_warmup_samples);

  double variance = std::accumulate(
      timestamps_us_.begin() + number_of_warmup_samples, timestamps_us_.end(),
      0.0, [average_duration](const double& a, const int64_t& b) {
        return a + (b - average_duration) * (b - average_duration);
      });

  return sqrt(variance / number_of_samples);
}

}  // namespace test
}  // namespace webrtc
