// 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.

#ifndef COBALT_MEDIA_BASE_AUDIO_TIMESTAMP_HELPER_H_
#define COBALT_MEDIA_BASE_AUDIO_TIMESTAMP_HELPER_H_

#include "base/basictypes.h"
#include "base/time/time.h"
#include "cobalt/media/base/media_export.h"
#include "starboard/types.h"

namespace cobalt {
namespace media {

// Generates timestamps for a sequence of audio sample frames. This class should
// be used any place timestamps need to be calculated for a sequence of audio
// samples. It helps avoid timestamps inaccuracies caused by rounding/truncation
// in repeated sample count to timestamp conversions.
//
// The class is constructed with samples_per_second information so that it can
// convert audio sample frame counts into timestamps. After the object is
// constructed, SetBaseTimestamp() must be called to specify the starting
// timestamp of the audio sequence. As audio samples are received, their frame
// counts are added using AddFrames(). These frame counts are accumulated by
// this class so GetTimestamp() can be used to determine the timestamp for the
// samples that have been added. GetDuration() calculates the proper duration
// values for samples added to the current timestamp. GetFramesToTarget()
// determines the number of frames that need to be added/removed from the
// accumulated frames to reach a target timestamp.
class MEDIA_EXPORT AudioTimestampHelper {
 public:
  // Returns the time duration of the given number of frames of audio with the
  // given sample rate (in samples per second).
  static base::TimeDelta FramesToTime(int64_t frames, int samples_per_second);

  // Returns the number of frames in the given duration of audio with the given
  // sample rate (in samples per second).
  static int64_t TimeToFrames(base::TimeDelta time, int samples_per_second);

  explicit AudioTimestampHelper(int samples_per_second);

  // Sets the base timestamp to |base_timestamp| and the sets count to 0.
  void SetBaseTimestamp(base::TimeDelta base_timestamp);

  base::TimeDelta base_timestamp() const;
  int64_t frame_count() const { return frame_count_; }

  // Adds |frame_count| to the frame counter.
  // Note: SetBaseTimestamp() must be called with a value other than
  // kNoTimestamp before this method can be called.
  void AddFrames(int frame_count);

  // Get the current timestamp. This value is computed from the base_timestamp()
  // and the number of sample frames that have been added so far.
  base::TimeDelta GetTimestamp() const;

  // Gets the duration if |frame_count| frames were added to the current
  // timestamp reported by GetTimestamp(). This method ensures that
  // (GetTimestamp() + GetFrameDuration(n)) will equal the timestamp that
  // GetTimestamp() will return if AddFrames(n) is called.
  base::TimeDelta GetFrameDuration(int frame_count) const;

  // Returns the number of frames needed to reach the target timestamp.
  // Note: |target| must be >= |base_timestamp_|.
  int64_t GetFramesToTarget(base::TimeDelta target) const;

 private:
  base::TimeDelta ComputeTimestamp(int64_t frame_count) const;

  double microseconds_per_frame_;

  base::TimeDelta base_timestamp_;

  // Number of frames accumulated by AddFrames() calls.
  int64_t frame_count_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(AudioTimestampHelper);
};

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_BASE_AUDIO_TIMESTAMP_HELPER_H_
