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.
5 #ifndef MEDIA_FILTERS_VPX_VIDEO_DECODER_H_
6 #define MEDIA_FILTERS_VPX_VIDEO_DECODER_H_
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"
19 class MessageLoopProxy
;
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
{
30 explicit VpxVideoDecoder(
31 const scoped_refptr
<base::MessageLoopProxy
>& message_loop
);
32 virtual ~VpxVideoDecoder();
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
;
52 // Handles (re-)initializing the decoder with a (new) config.
53 // Returns true when initialization was successful.
54 bool ConfigureDecoder(const VideoDecoderConfig
& config
);
58 void DecodeBuffer(const scoped_refptr
<DecoderBuffer
>& buffer
);
59 bool VpxDecode(const scoped_refptr
<DecoderBuffer
>& buffer
,
60 scoped_refptr
<VideoFrame
>* video_frame
);
62 // Reset decoder and call |reset_cb_|.
65 void CopyVpxImageTo(const vpx_image
* vpx_image
,
66 const struct vpx_image
* vpx_image_alpha
,
67 scoped_refptr
<VideoFrame
>* video_frame
);
69 scoped_refptr
<base::MessageLoopProxy
> message_loop_
;
70 base::WeakPtrFactory
<VpxVideoDecoder
> weak_factory_
;
71 base::WeakPtr
<VpxVideoDecoder
> weak_this_
;
76 base::Closure reset_cb_
;
78 VideoDecoderConfig config_
;
80 vpx_codec_ctx
* vpx_codec_
;
81 vpx_codec_ctx
* vpx_codec_alpha_
;
83 DISALLOW_COPY_AND_ASSIGN(VpxVideoDecoder
);
88 #endif // MEDIA_FILTERS_VPX_VIDEO_DECODER_H_