Home | History | Annotate | Download | only in filters
      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