ffmpeg_video_decoder.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_decoder.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/video_decoder_config.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "media/base/video_frame_pool.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVCodecContext;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVFrame;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DecoderBuffer;
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class ScopedPtrAVFreeContext;
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class ScopedPtrAVFreeFrame;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit FFmpegVideoDecoder(
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<base::MessageLoopProxy>& message_loop);
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~FFmpegVideoDecoder();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // VideoDecoder implementation.
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Initialize(const VideoDecoderConfig& config,
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          const PipelineStatusCB& status_cb) OVERRIDE;
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                      const DecodeCB& decode_cb) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Reset(const base::Closure& closure) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Stop(const base::Closure& closure) OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback called from within FFmpeg to allocate a buffer based on
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the dimensions of |codec_context|. See AVCodecContext.get_buffer
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // documentation inside FFmpeg.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetVideoBuffer(AVCodecContext *codec_context, AVFrame* frame);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum DecoderState {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kUninitialized,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kNormal,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlushCodec,
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    kDecodeFinished,
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    kError
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handles decoding an unencrypted encoded buffer.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer);
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool FFmpegDecode(const scoped_refptr<DecoderBuffer>& buffer,
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    scoped_refptr<VideoFrame>* video_frame);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles (re-)initializing the decoder with a (new) config.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if initialization was successful.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ConfigureDecoder();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Releases resources associated with |codec_context_| and |av_frame_|
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and resets them to NULL.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseFFmpegResources();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset decoder and call |reset_cb_|.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoReset();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::WeakPtrFactory<FFmpegVideoDecoder> weak_factory_;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::WeakPtr<FFmpegVideoDecoder> weak_this_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecoderState state_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DecodeCB decode_cb_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure reset_cb_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FFmpeg structures owned by this object.
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr_malloc<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr_malloc<AVFrame, ScopedPtrAVFreeFrame> av_frame_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  VideoDecoderConfig config_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  VideoFramePool frame_pool_;
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FFmpegVideoDecoder);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
97