Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / media / filters / vpx_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_VPX_VIDEO_DECODER_H_
6 #define MEDIA_FILTERS_VPX_VIDEO_DECODER_H_
7
8 #include "base/callback.h"
9 #include "media/base/demuxer_stream.h"
10 #include "media/base/video_decoder.h"
11 #include "media/base/video_decoder_config.h"
12 #include "media/base/video_frame.h"
13 #include "media/base/video_frame_pool.h"
14
15 struct vpx_codec_ctx;
16 struct vpx_image;
17
18 namespace base {
19 class SingleThreadTaskRunner;
20 }
21
22 namespace media {
23
24 // Libvpx video decoder wrapper.
25 // Note: VpxVideoDecoder accepts only YV12A VP8 content or VP9 content. This is
26 // done to avoid usurping FFmpeg for all vp8 decoding, because the FFmpeg VP8
27 // decoder is faster than the libvpx VP8 decoder.
28 class MEDIA_EXPORT VpxVideoDecoder : public VideoDecoder {
29  public:
30   explicit VpxVideoDecoder(
31       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
32   ~VpxVideoDecoder() override;
33
34   // VideoDecoder implementation.
35   std::string GetDisplayName() const override;
36   void Initialize(const VideoDecoderConfig& config,
37                   bool low_delay,
38                   const PipelineStatusCB& status_cb,
39                   const OutputCB& output_cb) override;
40   void Decode(const scoped_refptr<DecoderBuffer>& buffer,
41               const DecodeCB& decode_cb) override;
42   void Reset(const base::Closure& closure) override;
43
44  private:
45   enum DecoderState {
46     kUninitialized,
47     kNormal,
48     kFlushCodec,
49     kDecodeFinished,
50     kError
51   };
52
53   // Handles (re-)initializing the decoder with a (new) config.
54   // Returns true when initialization was successful.
55   bool ConfigureDecoder(const VideoDecoderConfig& config);
56
57   void CloseDecoder();
58
59   void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer);
60   bool VpxDecode(const scoped_refptr<DecoderBuffer>& buffer,
61                  scoped_refptr<VideoFrame>* video_frame);
62
63   void CopyVpxImageTo(const vpx_image* vpx_image,
64                       const struct vpx_image* vpx_image_alpha,
65                       scoped_refptr<VideoFrame>* video_frame);
66
67   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
68
69   DecoderState state_;
70
71   OutputCB output_cb_;
72
73   // TODO(xhwang): Merge DecodeBuffer() into Decode() and remove this.
74   DecodeCB decode_cb_;
75
76   VideoDecoderConfig config_;
77
78   vpx_codec_ctx* vpx_codec_;
79   vpx_codec_ctx* vpx_codec_alpha_;
80
81   // Memory pool used for VP9 decoding.
82   class MemoryPool;
83   scoped_refptr<MemoryPool> memory_pool_;
84
85   VideoFramePool frame_pool_;
86
87   DISALLOW_COPY_AND_ASSIGN(VpxVideoDecoder);
88 };
89
90 }  // namespace media
91
92 #endif  // MEDIA_FILTERS_VPX_VIDEO_DECODER_H_