Cast: Skip receiver log messages with time delta that can't be encoded.
[chromium-blink-merge.git] / media / filters / ffmpeg_video_decoder.h
blob07cf2be2475eca53e6b2add3fdbaa8b4574a1731
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.
5 #ifndef MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
6 #define MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_
8 #include <list>
10 #include "base/callback.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h"
13 #include "media/base/video_decoder.h"
14 #include "media/base/video_decoder_config.h"
15 #include "media/base/video_frame_pool.h"
17 struct AVCodecContext;
18 struct AVFrame;
20 namespace base {
21 class SingleThreadTaskRunner;
24 namespace media {
26 class DecoderBuffer;
27 class ScopedPtrAVFreeContext;
28 class ScopedPtrAVFreeFrame;
30 class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
31 public:
32 explicit FFmpegVideoDecoder(
33 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
34 virtual ~FFmpegVideoDecoder();
36 // VideoDecoder implementation.
37 virtual void Initialize(const VideoDecoderConfig& config,
38 const PipelineStatusCB& status_cb) OVERRIDE;
39 virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
40 const DecodeCB& decode_cb) OVERRIDE;
41 virtual void Reset(const base::Closure& closure) OVERRIDE;
42 virtual void Stop(const base::Closure& closure) OVERRIDE;
44 // Callback called from within FFmpeg to allocate a buffer based on
45 // the dimensions of |codec_context|. See AVCodecContext.get_buffer
46 // documentation inside FFmpeg.
47 int GetVideoBuffer(AVCodecContext *codec_context, AVFrame* frame);
49 private:
50 enum DecoderState {
51 kUninitialized,
52 kNormal,
53 kFlushCodec,
54 kDecodeFinished,
55 kError
58 // Handles decoding an unencrypted encoded buffer.
59 void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer);
60 bool FFmpegDecode(const scoped_refptr<DecoderBuffer>& buffer,
61 scoped_refptr<VideoFrame>* video_frame);
63 // Handles (re-)initializing the decoder with a (new) config.
64 // Returns true if initialization was successful.
65 bool ConfigureDecoder();
67 // Releases resources associated with |codec_context_| and |av_frame_|
68 // and resets them to NULL.
69 void ReleaseFFmpegResources();
71 // Reset decoder and call |reset_cb_|.
72 void DoReset();
74 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
75 base::WeakPtrFactory<FFmpegVideoDecoder> weak_factory_;
76 base::WeakPtr<FFmpegVideoDecoder> weak_this_;
78 DecoderState state_;
80 DecodeCB decode_cb_;
81 base::Closure reset_cb_;
83 // FFmpeg structures owned by this object.
84 scoped_ptr_malloc<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
85 scoped_ptr_malloc<AVFrame, ScopedPtrAVFreeFrame> av_frame_;
87 VideoDecoderConfig config_;
89 VideoFramePool frame_pool_;
91 DISALLOW_COPY_AND_ASSIGN(FFmpegVideoDecoder);
94 } // namespace media
96 #endif // MEDIA_FILTERS_FFMPEG_VIDEO_DECODER_H_