vpx_video_decoder.h revision 558790d6acca3451cf3a6b497803a5f07d0bec58
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 "base/memory/weak_ptr.h"
10#include "media/base/demuxer_stream.h"
11#include "media/base/video_decoder.h"
12#include "media/base/video_decoder_config.h"
13#include "media/base/video_frame.h"
14
15struct vpx_codec_ctx;
16struct vpx_image;
17
18namespace base {
19class MessageLoopProxy;
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::MessageLoopProxy>& message_loop);
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::MessageLoopProxy> message_loop_;
70  base::WeakPtrFactory<VpxVideoDecoder> weak_factory_;
71  base::WeakPtr<VpxVideoDecoder> weak_this_;
72
73  DecoderState state_;
74
75  DecodeCB decode_cb_;
76  base::Closure reset_cb_;
77
78  VideoDecoderConfig config_;
79
80  vpx_codec_ctx* vpx_codec_;
81  vpx_codec_ctx* vpx_codec_alpha_;
82
83  DISALLOW_COPY_AND_ASSIGN(VpxVideoDecoder);
84};
85
86}  // namespace media
87
88#endif  // MEDIA_FILTERS_VPX_VIDEO_DECODER_H_
89