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 15 struct vpx_codec_ctx; 16 struct vpx_image; 17 18 namespace base { 19 class MessageLoopProxy; 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::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