audio_decoder.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_BASE_AUDIO_DECODER_H_
6#define MEDIA_BASE_AUDIO_DECODER_H_
7
8#include "base/callback.h"
9#include "base/memory/ref_counted.h"
10#include "media/base/audio_decoder_config.h"
11#include "media/base/channel_layout.h"
12#include "media/base/decoder_buffer.h"
13#include "media/base/media_export.h"
14#include "media/base/pipeline_status.h"
15
16namespace media {
17
18class AudioBuffer;
19class DemuxerStream;
20
21class MEDIA_EXPORT AudioDecoder {
22 public:
23  // Status codes for decode operations.
24  // TODO(rileya): Now that both AudioDecoder and VideoDecoder Status enums
25  // match, break them into a decoder_status.h.
26  enum Status {
27    kOk,  // We're all good.
28    kAborted,  // We aborted as a result of Stop() or Reset().
29    kDecodeError,  // A decoding error occurred.
30    kDecryptError  // Decrypting error happened.
31  };
32
33  // Callback to return decoded buffers.
34  typedef base::Callback<void(const scoped_refptr<AudioBuffer>&)> OutputCB;
35
36  // Callback for Decode(). Called after the decoder has completed decoding
37  // corresponding DecoderBuffer, indicating that it's ready to accept another
38  // buffer to decode.
39  typedef base::Callback<void(Status)> DecodeCB;
40
41  AudioDecoder();
42  virtual ~AudioDecoder();
43
44  // Initializes an AudioDecoder with the given DemuxerStream, executing the
45  // callback upon completion.
46  //  |statistics_cb| is used to update global pipeline statistics.
47  //  |output_cb| is called for decoded audio buffers (see Decode()).
48  virtual void Initialize(const AudioDecoderConfig& config,
49                          const PipelineStatusCB& status_cb,
50                          const OutputCB& output_cb) = 0;
51
52  // Requests samples to be decoded. Only one decode may be in flight at any
53  // given time. Once the buffer is decoded the decoder calls |decode_cb|.
54  // |output_cb| specified in Initialize() is called for each decoded buffer,
55  // before or after |decode_cb|.
56  //
57  // Implementations guarantee that the callbacks will not be called from within
58  // this method.
59  //
60  // If |buffer| is an EOS buffer then the decoder must be flushed, i.e.
61  // |output_cb| must be called for each frame pending in the queue and
62  // |decode_cb| must be called after that.
63  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
64                      const DecodeCB& decode_cb) = 0;
65
66  // Resets decoder state. All pending Decode() requests will be finished or
67  // aborted before |closure| is called.
68  virtual void Reset(const base::Closure& closure) = 0;
69
70  // Stops decoder, fires any pending callbacks and sets the decoder to an
71  // uninitialized state. An AudioDecoder cannot be re-initialized after it has
72  // been stopped. DecodeCB and OutputCB may still be called for older buffers
73  // if they were scheduled before this method is called.
74  // Note that if Initialize() is pending or has finished successfully, Stop()
75  // must be called before destructing the decoder.
76  virtual void Stop() = 0;
77
78 private:
79  DISALLOW_COPY_AND_ASSIGN(AudioDecoder);
80};
81
82}  // namespace media
83
84#endif  // MEDIA_BASE_AUDIO_DECODER_H_
85