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 15 struct vpx_codec_ctx; 16 struct vpx_image; 17 18 namespace base { 19 class SingleThreadTaskRunner; 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::SingleThreadTaskRunner>& task_runner); 32 virtual ~VpxVideoDecoder(); 33 34 // VideoDecoder implementation. 35 virtual std::string GetDisplayName() const OVERRIDE; 36 virtual void Initialize(const VideoDecoderConfig& config, 37 bool low_delay, 38 const PipelineStatusCB& status_cb, 39 const OutputCB& output_cb) OVERRIDE; 40 virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer, 41 const DecodeCB& decode_cb) OVERRIDE; 42 virtual void Reset(const base::Closure& closure) OVERRIDE; 43 44 private: 45 enum DecoderState { 46 kUninitialized, 47 kNormal, 48 kFlushCodec, 49 kDecodeFinished, 50 kError 51 }; 52 53 // Handles (re-)initializing the decoder with a (new) config. 54 // Returns true when initialization was successful. 55 bool ConfigureDecoder(const VideoDecoderConfig& config); 56 57 void CloseDecoder(); 58 59 void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer); 60 bool VpxDecode(const scoped_refptr<DecoderBuffer>& buffer, 61 scoped_refptr<VideoFrame>* video_frame); 62 63 void CopyVpxImageTo(const vpx_image* vpx_image, 64 const struct vpx_image* vpx_image_alpha, 65 scoped_refptr<VideoFrame>* video_frame); 66 67 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 68 69 DecoderState state_; 70 71 OutputCB output_cb_; 72 73 // TODO(xhwang): Merge DecodeBuffer() into Decode() and remove this. 74 DecodeCB decode_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