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