audio_decoder.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// found in the LICENSE file.
4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#ifndef MEDIA_BASE_AUDIO_DECODER_H_
6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#define MEDIA_BASE_AUDIO_DECODER_H_
7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include <string>
9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "base/callback.h"
11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "base/memory/ref_counted.h"
12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "media/base/audio_decoder_config.h"
13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "media/base/channel_layout.h"
14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "media/base/decoder_buffer.h"
15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "media/base/media_export.h"
16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "media/base/pipeline_status.h"
17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectnamespace media {
19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectclass AudioBuffer;
21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectclass DemuxerStream;
22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectclass MEDIA_EXPORT AudioDecoder {
24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public:
25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Status codes for decode operations.
26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // TODO(rileya): Now that both AudioDecoder and VideoDecoder Status enums
27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // match, break them into a decoder_status.h.
28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  enum Status {
29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    kOk,  // We're all good.
30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    kAborted,  // We aborted as a result of Reset() or destruction.
31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    kDecodeError,  // A decoding error occurred.
32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    kDecryptError  // Decrypting error happened.
33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  };
34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Callback for AudioDecoder to return a decoded frame whenever it becomes
36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // available. Only non-EOS frames should be returned via this callback.
37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  typedef base::Callback<void(const scoped_refptr<AudioBuffer>&)> OutputCB;
38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Callback for Decode(). Called after the decoder has completed decoding
40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // corresponding DecoderBuffer, indicating that it's ready to accept another
41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // buffer to decode.
42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  typedef base::Callback<void(Status)> DecodeCB;
43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
44d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath  AudioDecoder();
45d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath
46d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath  // Fires any pending callbacks, stops and destroys the decoder.
47d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath  // Note: Since this is a destructor, |this| will be destroyed after this call.
48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Make sure the callbacks fired from this call doesn't post any task that
49d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath  // depends on |this|.
50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  virtual ~AudioDecoder();
51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Returns the name of the decoder for logging purpose.
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  virtual std::string GetDisplayName() const = 0;
54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Initializes an AudioDecoder with the given DemuxerStream, executing the
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // callback upon completion.
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  //  |statistics_cb| is used to update global pipeline statistics.
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  //  |output_cb| is called for decoded audio buffers (see Decode()).
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  virtual void Initialize(const AudioDecoderConfig& config,
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                          const PipelineStatusCB& status_cb,
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                          const OutputCB& output_cb) = 0;
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Requests samples to be decoded. Only one decode may be in flight at any
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // given time. Once the buffer is decoded the decoder calls |decode_cb|.
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // |output_cb| specified in Initialize() is called for each decoded buffer,
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // before or after |decode_cb|.
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  //
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Implementations guarantee that the callbacks will not be called from within
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // this method.
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  //
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // If |buffer| is an EOS buffer then the decoder must be flushed, i.e.
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // |output_cb| must be called for each frame pending in the queue and
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // |decode_cb| must be called after that.
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                      const DecodeCB& decode_cb) = 0;
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Resets decoder state. All pending Decode() requests will be finished or
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // aborted before |closure| is called.
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  virtual void Reset(const base::Closure& closure) = 0;
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private:
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  DISALLOW_COPY_AND_ASSIGN(AudioDecoder);
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project};
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}  // namespace media
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#endif  // MEDIA_BASE_AUDIO_DECODER_H_
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project