Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / media / base / audio_decoder.h
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
16 namespace media {
17
18 class AudioBuffer;
19 class DemuxerStream;
20
21 class 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 for AudioDecoder to return a decoded frame whenever it becomes
34   // available. Only non-EOS frames should be returned via this callback.
35   typedef base::Callback<void(const scoped_refptr<AudioBuffer>&)> OutputCB;
36
37   // Callback for Decode(). Called after the decoder has completed decoding
38   // corresponding DecoderBuffer, indicating that it's ready to accept another
39   // buffer to decode.
40   typedef base::Callback<void(Status)> DecodeCB;
41
42   AudioDecoder();
43   virtual ~AudioDecoder();
44
45   // Initializes an AudioDecoder with the given DemuxerStream, executing the
46   // callback upon completion.
47   //  |statistics_cb| is used to update global pipeline statistics.
48   //  |output_cb| is called for decoded audio buffers (see Decode()).
49   virtual void Initialize(const AudioDecoderConfig& config,
50                           const PipelineStatusCB& status_cb,
51                           const OutputCB& output_cb) = 0;
52
53   // Requests samples to be decoded. Only one decode may be in flight at any
54   // given time. Once the buffer is decoded the decoder calls |decode_cb|.
55   // |output_cb| specified in Initialize() is called for each decoded buffer,
56   // before or after |decode_cb|.
57   //
58   // Implementations guarantee that the callbacks will not be called from within
59   // this method.
60   //
61   // If |buffer| is an EOS buffer then the decoder must be flushed, i.e.
62   // |output_cb| must be called for each frame pending in the queue and
63   // |decode_cb| must be called after that.
64   virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
65                       const DecodeCB& decode_cb) = 0;
66
67   // Resets decoder state. All pending Decode() requests will be finished or
68   // aborted before |closure| is called.
69   virtual void Reset(const base::Closure& closure) = 0;
70
71   // Stops decoder, fires any pending callbacks and sets the decoder to an
72   // uninitialized state. An AudioDecoder cannot be re-initialized after it has
73   // been stopped. DecodeCB and OutputCB may still be called for older buffers
74   // if they were scheduled before this method is called.
75   // Note that if Initialize() is pending or has finished successfully, Stop()
76   // must be called before destructing the decoder.
77   virtual void Stop() = 0;
78
79  private:
80   DISALLOW_COPY_AND_ASSIGN(AudioDecoder);
81 };
82
83 }  // namespace media
84
85 #endif  // MEDIA_BASE_AUDIO_DECODER_H_