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