vpx_video_decoder.h revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
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
15struct vpx_codec_ctx;
16struct vpx_image;
17
18namespace base {
19class SingleThreadTaskRunner;
20}
21
22namespace 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.
28class MEDIA_EXPORT VpxVideoDecoder : public VideoDecoder {
29 public:
30  explicit VpxVideoDecoder(
31      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
32  virtual ~VpxVideoDecoder();
33
34  // VideoDecoder implementation.
35  virtual void Initialize(const VideoDecoderConfig& config,
36                          const PipelineStatusCB& status_cb) OVERRIDE;
37  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
38                      const DecodeCB& decode_cb) OVERRIDE;
39  virtual void Reset(const base::Closure& closure) OVERRIDE;
40  virtual void Stop(const base::Closure& closure) OVERRIDE;
41  virtual bool HasAlpha() const OVERRIDE;
42
43 private:
44  enum DecoderState {
45    kUninitialized,
46    kNormal,
47    kFlushCodec,
48    kDecodeFinished,
49    kError
50  };
51
52  // Handles (re-)initializing the decoder with a (new) config.
53  // Returns true when initialization was successful.
54  bool ConfigureDecoder(const VideoDecoderConfig& config);
55
56  void CloseDecoder();
57
58  void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer);
59  bool VpxDecode(const scoped_refptr<DecoderBuffer>& buffer,
60                 scoped_refptr<VideoFrame>* video_frame);
61
62  // Reset decoder and call |reset_cb_|.
63  void DoReset();
64
65  void CopyVpxImageTo(const vpx_image* vpx_image,
66                      const struct vpx_image* vpx_image_alpha,
67                      scoped_refptr<VideoFrame>* video_frame);
68
69  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
70
71  DecoderState state_;
72
73  DecodeCB decode_cb_;
74  base::Closure reset_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_
93