// Copyright (c) 2012 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/audio_timestamp_helper.h"

#include "base/logging.h"
#include "cobalt/media/base/timestamp_constants.h"

namespace cobalt {
namespace media {

// static
base::TimeDelta AudioTimestampHelper::FramesToTime(int64_t frames,
                                                   int samples_per_second) {
  DCHECK_GE(samples_per_second, 0);
  return base::TimeDelta::FromMicroseconds(
      frames * base::Time::kMicrosecondsPerSecond / samples_per_second);
}

// static
int64_t AudioTimestampHelper::TimeToFrames(base::TimeDelta time,
                                           int samples_per_second) {
  return time.InSecondsF() * samples_per_second;
}

AudioTimestampHelper::AudioTimestampHelper(int samples_per_second)
    : base_timestamp_(kNoTimestamp), frame_count_(0) {
  DCHECK_GT(samples_per_second, 0);
  double fps = samples_per_second;
  microseconds_per_frame_ = base::Time::kMicrosecondsPerSecond / fps;
}

void AudioTimestampHelper::SetBaseTimestamp(base::TimeDelta base_timestamp) {
  base_timestamp_ = base_timestamp;
  frame_count_ = 0;
}

base::TimeDelta AudioTimestampHelper::base_timestamp() const {
  return base_timestamp_;
}

void AudioTimestampHelper::AddFrames(int frame_count) {
  DCHECK_GE(frame_count, 0);
  DCHECK(base_timestamp_ != kNoTimestamp);
  frame_count_ += frame_count;
}

base::TimeDelta AudioTimestampHelper::GetTimestamp() const {
  return ComputeTimestamp(frame_count_);
}

base::TimeDelta AudioTimestampHelper::GetFrameDuration(int frame_count) const {
  DCHECK_GE(frame_count, 0);
  base::TimeDelta end_timestamp = ComputeTimestamp(frame_count_ + frame_count);
  return end_timestamp - GetTimestamp();
}

int64_t AudioTimestampHelper::GetFramesToTarget(base::TimeDelta target) const {
  DCHECK(base_timestamp_ != kNoTimestamp);
  DCHECK(target >= base_timestamp_);

  int64_t delta_in_us = (target - GetTimestamp()).InMicroseconds();
  if (delta_in_us == 0) return 0;

  // Compute a timestamp relative to |base_timestamp_| since timestamps
  // created from |frame_count_| are computed relative to this base.
  // This ensures that the time to frame computation here is the proper inverse
  // of the frame to time computation in ComputeTimestamp().
  base::TimeDelta delta_from_base = target - base_timestamp_;

  // Compute frame count for the time delta. This computation rounds to
  // the nearest whole number of frames.
  double threshold = microseconds_per_frame_ / 2;
  int64_t target_frame_count =
      (delta_from_base.InMicroseconds() + threshold) / microseconds_per_frame_;
  return target_frame_count - frame_count_;
}

base::TimeDelta AudioTimestampHelper::ComputeTimestamp(
    int64_t frame_count) const {
  DCHECK_GE(frame_count, 0);
  DCHECK(base_timestamp_ != kNoTimestamp);
  double frames_us = microseconds_per_frame_ * frame_count;
  return base_timestamp_ + base::TimeDelta::FromMicroseconds(frames_us);
}

}  // namespace media
}  // namespace cobalt
