- add sources.
[platform/framework/web/crosswalk.git] / src / media / filters / ffmpeg_video_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_FILTERS_FFMPEG_VIDEO_DECODER_H_
6 #define MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
7
8 #include <list>
9
10 #include "base/callback.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h"
13 #include "media/base/video_decoder.h"
14 #include "media/base/video_decoder_config.h"
15
16 struct AVCodecContext;
17 struct AVFrame;
18
19 namespace base {
20 class MessageLoopProxy;
21 }
22
23 namespace media {
24
25 class DecoderBuffer;
26 class ScopedPtrAVFreeContext;
27 class ScopedPtrAVFreeFrame;
28
29 class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
30  public:
31   explicit FFmpegVideoDecoder(
32       const scoped_refptr<base::MessageLoopProxy>& message_loop);
33   virtual ~FFmpegVideoDecoder();
34
35   // VideoDecoder implementation.
36   virtual void Initialize(const VideoDecoderConfig& config,
37                           const PipelineStatusCB& status_cb) OVERRIDE;
38   virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
39                       const DecodeCB& decode_cb) OVERRIDE;
40   virtual void Reset(const base::Closure& closure) OVERRIDE;
41   virtual void Stop(const base::Closure& closure) OVERRIDE;
42
43   // Callback called from within FFmpeg to allocate a buffer based on
44   // the dimensions of |codec_context|. See AVCodecContext.get_buffer
45   // documentation inside FFmpeg.
46   int GetVideoBuffer(AVCodecContext *codec_context, AVFrame* frame);
47
48  private:
49   enum DecoderState {
50     kUninitialized,
51     kNormal,
52     kFlushCodec,
53     kDecodeFinished,
54     kError
55   };
56
57   // Handles decoding an unencrypted encoded buffer.
58   void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer);
59   bool FFmpegDecode(const scoped_refptr<DecoderBuffer>& buffer,
60                     scoped_refptr<VideoFrame>* video_frame);
61
62   // Handles (re-)initializing the decoder with a (new) config.
63   // Returns true if initialization was successful.
64   bool ConfigureDecoder();
65
66   // Releases resources associated with |codec_context_| and |av_frame_|
67   // and resets them to NULL.
68   void ReleaseFFmpegResources();
69
70   // Reset decoder and call |reset_cb_|.
71   void DoReset();
72
73   scoped_refptr<base::MessageLoopProxy> message_loop_;
74   base::WeakPtrFactory<FFmpegVideoDecoder> weak_factory_;
75   base::WeakPtr<FFmpegVideoDecoder> weak_this_;
76
77   DecoderState state_;
78
79   DecodeCB decode_cb_;
80   base::Closure reset_cb_;
81
82   // FFmpeg structures owned by this object.
83   scoped_ptr_malloc<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
84   scoped_ptr_malloc<AVFrame, ScopedPtrAVFreeFrame> av_frame_;
85
86   VideoDecoderConfig config_;
87
88   DISALLOW_COPY_AND_ASSIGN(FFmpegVideoDecoder);
89 };
90
91 }  // namespace media
92
93 #endif  // MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_