ffmpeg_audio_decoder.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_FILTERS_FFMPEG_AUDIO_DECODER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_FILTERS_FFMPEG_AUDIO_DECODER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_decoder.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/demuxer_stream.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "media/base/media_log.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/sample_format.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/ffmpeg/ffmpeg_deleters.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVCodecContext; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVFrame; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass AudioDiscardHelper; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DecoderBuffer; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT FFmpegAudioDecoder : public AudioDecoder { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FFmpegAudioDecoder( 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const LogCB& log_cb); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FFmpegAudioDecoder(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AudioDecoder implementation. 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Initialize(const AudioDecoderConfig& config, 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const PipelineStatusCB& status_cb, 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const OutputCB& output_cb) OVERRIDE; 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer, 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const DecodeCB& decode_cb) OVERRIDE; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Reset(const base::Closure& closure) OVERRIDE; 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual void Stop() OVERRIDE; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enum DecoderState { 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kUninitialized, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kNormal, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kDecodeFinished, 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) kError 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Reset decoder and call |reset_cb_|. 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DoReset(); 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Handles decoding an unencrypted encoded buffer. 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer, 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const DecodeCB& decode_cb); 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool FFmpegDecode(const scoped_refptr<DecoderBuffer>& buffer); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Handles (re-)initializing the decoder with a (new) config. 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if initialization was successful. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ConfigureDecoder(); 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Releases resources associated with |codec_context_| and |av_frame_| 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // and resets them to NULL. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReleaseFFmpegResources(); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ResetTimestampState(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OutputCB output_cb_; 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DecoderState state_; 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // FFmpeg structures owned by this object. 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context_; 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<AVFrame, ScopedPtrAVFreeFrame> av_frame_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch AudioDecoderConfig config_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AVSampleFormat initially requested; not Chrome's SampleFormat. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int av_sample_format_; 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<AudioDiscardHelper> discard_helper_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LogCB log_cb_; 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_IMPLICIT_CONSTRUCTORS(FFmpegAudioDecoder); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_FILTERS_FFMPEG_AUDIO_DECODER_H_ 97