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_FFMPEG_VIDEO_DECODER_H_
      6 #define MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
      7 
      8 #include <list>
      9 
     10 #include "base/callback.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "media/base/video_decoder.h"
     13 #include "media/base/video_decoder_config.h"
     14 #include "media/base/video_frame_pool.h"
     15 #include "media/ffmpeg/ffmpeg_deleters.h"
     16 
     17 struct AVCodecContext;
     18 struct AVFrame;
     19 
     20 namespace base {
     21 class SingleThreadTaskRunner;
     22 }
     23 
     24 namespace media {
     25 
     26 class DecoderBuffer;
     27 
     28 class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
     29  public:
     30   explicit FFmpegVideoDecoder(
     31       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
     32   virtual ~FFmpegVideoDecoder();
     33 
     34   // Allow decoding of individual NALU. Entire frames are required by default.
     35   // Disables low-latency mode. Must be called before Initialize().
     36   void set_decode_nalus(bool decode_nalus) { decode_nalus_ = decode_nalus; }
     37 
     38   // VideoDecoder implementation.
     39   virtual void Initialize(const VideoDecoderConfig& config,
     40                           bool low_delay,
     41                           const PipelineStatusCB& status_cb,
     42                           const OutputCB& output_cb) OVERRIDE;
     43   virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
     44                       const DecodeCB& decode_cb) OVERRIDE;
     45   virtual void Reset(const base::Closure& closure) OVERRIDE;
     46   virtual void Stop() OVERRIDE;
     47 
     48   // Callback called from within FFmpeg to allocate a buffer based on
     49   // the dimensions of |codec_context|. See AVCodecContext.get_buffer2
     50   // documentation inside FFmpeg.
     51   int GetVideoBuffer(struct AVCodecContext* codec_context,
     52                      AVFrame* frame,
     53                      int flags);
     54 
     55  private:
     56   enum DecoderState {
     57     kUninitialized,
     58     kNormal,
     59     kDecodeFinished,
     60     kError
     61   };
     62 
     63   // Handles decoding an unencrypted encoded buffer.
     64   bool FFmpegDecode(const scoped_refptr<DecoderBuffer>& buffer,
     65                     bool* has_produced_frame);
     66 
     67   // Handles (re-)initializing the decoder with a (new) config.
     68   // Returns true if initialization was successful.
     69   bool ConfigureDecoder(bool low_delay);
     70 
     71   // Releases resources associated with |codec_context_| and |av_frame_|
     72   // and resets them to NULL.
     73   void ReleaseFFmpegResources();
     74 
     75   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
     76 
     77   DecoderState state_;
     78 
     79   OutputCB output_cb_;
     80 
     81   // FFmpeg structures owned by this object.
     82   scoped_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
     83   scoped_ptr<AVFrame, ScopedPtrAVFreeFrame> av_frame_;
     84 
     85   VideoDecoderConfig config_;
     86 
     87   VideoFramePool frame_pool_;
     88 
     89   bool decode_nalus_;
     90 
     91   DISALLOW_COPY_AND_ASSIGN(FFmpegVideoDecoder);
     92 };
     93 
     94 }  // namespace media
     95 
     96 #endif  // MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
     97