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 "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