// 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 MEDIA_BASE_AUDIO_DECODER_H_
#define MEDIA_BASE_AUDIO_DECODER_H_

#include <vector>

#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "media/base/channel_layout.h"
#include "media/base/pipeline_status.h"
#include "media/base/media_export.h"

namespace media {

class Buffer;
class DemuxerStream;

class MEDIA_EXPORT AudioDecoder
    : public base::RefCountedThreadSafe<AudioDecoder> {
 public:
  // Status codes for read operations.
  enum Status {
    kOk,
    kAborted,
    kDecodeError,
  };
  typedef std::vector<scoped_refptr<Buffer> > Buffers;

  // Initialize an AudioDecoder with the given DemuxerStream, executing the
  // callback upon completion.
  // statistics_cb is used to update global pipeline statistics.
  virtual void Initialize(const scoped_refptr<DemuxerStream>& stream,
                          const PipelineStatusCB& status_cb,
                          const StatisticsCB& statistics_cb) = 0;

  // Request samples to be decoded and returned via the provided callback.
  // Only one read may be in flight at any given time.
  //
  // Implementations guarantee that the callback will not be called from within
  // this method.
  //
  // Non-NULL sample buffer pointers will contain decoded audio data or may
  // indicate the end of the stream. A NULL buffer pointer indicates an aborted
  // Read(). This can happen if the DemuxerStream gets flushed and doesn't have
  // any more data to return.
#if !defined(COBALT) && !defined(__LB_SHELL__)
  typedef base::Callback<void(Status, const scoped_refptr<Buffer>&)> ReadCB;
#else   // !defined(COBALT) && !defined(__LB_SHELL__)
  // This is a variant of the above callback that can pass multiple decoded
  // audio buffers at once.  Non-empty sample buffers will contain decoded audio
  // data or may indicate the end of the stream.  Empty buffers indicate an
  // aborted Read(). This can happen if the DemuxerStream gets flushed and
  // doesn't have any more data to return.
  typedef base::Callback<void(Status, const Buffers&)> ReadCB;
#endif  // !defined(COBALT) && !defined(__LB_SHELL__)
  virtual void Read(const ReadCB& read_cb) = 0;

  // Reset decoder state, dropping any queued encoded data.
  virtual void Reset(const base::Closure& closure) = 0;

  // Returns various information about the decoded audio format.
  virtual int bits_per_channel() = 0;
  virtual ChannelLayout channel_layout() = 0;
  virtual int samples_per_second() = 0;

 protected:
  friend class base::RefCountedThreadSafe<AudioDecoder>;
  virtual ~AudioDecoder();
  AudioDecoder();

 private:
  DISALLOW_COPY_AND_ASSIGN(AudioDecoder);
};

}  // namespace media

#endif  // MEDIA_BASE_AUDIO_DECODER_H_
