// Copyright (c) 2011 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_FILTERS_AUDIO_FILE_READER_H_
#define COBALT_MEDIA_FILTERS_AUDIO_FILE_READER_H_

#include <memory>

#include "base/basictypes.h"
#include "cobalt/media/base/audio_codecs.h"
#include "cobalt/media/base/media_export.h"
#include "cobalt/media/filters/ffmpeg_glue.h"

struct AVCodecContext;
struct AVPacket;
struct AVStream;

namespace base {
class TimeDelta;
}

namespace cobalt {
namespace media {

class AudioBus;
class FFmpegURLProtocol;

class MEDIA_EXPORT AudioFileReader {
 public:
  // Audio file data will be read using the given protocol.
  // The AudioFileReader does not take ownership of |protocol| and
  // simply maintains a weak reference to it.
  explicit AudioFileReader(FFmpegURLProtocol* protocol);
  virtual ~AudioFileReader();

  // Open() reads the audio data format so that the sample_rate(),
  // channels(), GetDuration(), and GetNumberOfFrames() methods can be called.
  // It returns |true| on success.
  bool Open();
  void Close();

  // After a call to Open(), attempts to fully fill |audio_bus| with decoded
  // audio data.  Any unfilled frames will be zeroed out.
  // |audio_data| must be of the same size as channels().
  // The audio data will be decoded as floating-point linear PCM with
  // a nominal range of -1.0 -> +1.0.
  // Returns the number of sample-frames actually read which will always be
  // <= audio_bus->frames()
  int Read(AudioBus* audio_bus);

  // These methods can be called once Open() has been called.
  int channels() const { return channels_; }
  int sample_rate() const { return sample_rate_; }

  // Please note that GetDuration() and GetNumberOfFrames() attempt to be
  // accurate, but are only estimates.  For some encoded formats, the actual
  // duration of the file can only be determined once all the file data has been
  // read. The Read() method returns the actual number of sample-frames it has
  // read.
  base::TimeDelta GetDuration() const;
  int GetNumberOfFrames() const;

  // The methods below are helper methods which allow AudioFileReader to double
  // as a test utility for demuxing audio files.
  // --------------------------------------------------------------------------

  // Similar to Open() but does not initialize the decoder.
  bool OpenDemuxerForTesting();

  // Returns true if a packet could be demuxed from the first audio stream in
  // the file, |output_packet| will contain the demuxed packet then.
  bool ReadPacketForTesting(AVPacket* output_packet);

  // Seeks to the given point and returns true if successful.  |seek_time| will
  // be converted to the stream's time base automatically.
  bool SeekForTesting(base::TimeDelta seek_time);

  const AVStream* GetAVStreamForTesting() const;
  const AVCodecContext* codec_context_for_testing() const {
    return codec_context_;
  }

 private:
  bool OpenDemuxer();
  bool OpenDecoder();
  bool ReadPacket(AVPacket* output_packet);

  std::unique_ptr<FFmpegGlue> glue_;
  AVCodecContext* codec_context_;
  int stream_index_;
  FFmpegURLProtocol* protocol_;
  AudioCodec audio_codec_;
  int channels_;
  int sample_rate_;

  // AVSampleFormat initially requested; not Chrome's SampleFormat.
  int av_sample_format_;

  DISALLOW_COPY_AND_ASSIGN(AudioFileReader);
};

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_FILTERS_AUDIO_FILE_READER_H_
