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