| Index: media/filters/ffmpeg_video_decoder.h
|
| diff --git a/media/filters/ffmpeg_video_decoder.h b/media/filters/ffmpeg_video_decoder.h
|
| index 65c4b75e425ce6520b534569cd5eb41b0144ca3d..92b6e78490c9d19e4e8a7cd27b9e35bf9bcd53b2 100644
|
| --- a/media/filters/ffmpeg_video_decoder.h
|
| +++ b/media/filters/ffmpeg_video_decoder.h
|
| @@ -7,6 +7,8 @@
|
|
|
| #include "base/gtest_prod_util.h"
|
| #include "base/time.h"
|
| +#include "media/base/factory.h"
|
| +#include "media/base/filters.h"
|
| #include "media/base/pts_heap.h"
|
| #include "media/base/video_frame.h"
|
| #include "media/filters/decoder_base.h"
|
| @@ -18,7 +20,7 @@ namespace media {
|
|
|
| class VideoDecodeEngine;
|
|
|
| -class FFmpegVideoDecoder : public DecoderBase<VideoDecoder, VideoFrame> {
|
| +class FFmpegVideoDecoder : public VideoDecoder {
|
| public:
|
| explicit FFmpegVideoDecoder(VideoDecodeEngine* engine);
|
| virtual ~FFmpegVideoDecoder();
|
| @@ -26,16 +28,17 @@ class FFmpegVideoDecoder : public DecoderBase<VideoDecoder, VideoFrame> {
|
| static FilterFactory* CreateFactory();
|
| static bool IsMediaFormatSupported(const MediaFormat& media_format);
|
|
|
| - protected:
|
| - virtual void DoInitialize(DemuxerStream* demuxer_stream, bool* success,
|
| - Task* done_cb);
|
| - virtual void DoStop(Task* done_cb);
|
| - virtual void DoSeek(base::TimeDelta time, Task* done_cb);
|
| - virtual void DoDecode(Buffer* input);
|
| + // MediaFilter implementation.
|
| + virtual void Stop(FilterCallback* callback);
|
| + virtual void Seek(base::TimeDelta time, FilterCallback* callback);
|
| + virtual void Flush(FilterCallback* callback);
|
|
|
| - protected:
|
| - virtual void OnEmptyBufferDone(scoped_refptr<Buffer> buffer);
|
| - virtual void FillThisBuffer(scoped_refptr<VideoFrame> frame);
|
| + // Decoder implementation.
|
| + virtual void Initialize(DemuxerStream* demuxer_stream,
|
| + FilterCallback* callback);
|
| + virtual const MediaFormat& media_format() { return media_format_; }
|
| + virtual void FillThisBuffer(scoped_refptr<VideoFrame> video_frame);
|
| + virtual bool ProvidesBuffer();
|
|
|
| private:
|
| friend class FilterFactoryImpl1<FFmpegVideoDecoder, VideoDecodeEngine*>;
|
| @@ -58,26 +61,29 @@ class FFmpegVideoDecoder : public DecoderBase<VideoDecoder, VideoFrame> {
|
| };
|
|
|
| enum DecoderState {
|
| + kUnInitialized,
|
| kNormal,
|
| kFlushCodec,
|
| kDecodeFinished,
|
| + kStopped
|
| };
|
|
|
| - // Implement DecoderBase template methods.
|
| - virtual void EnqueueVideoFrame(const scoped_refptr<VideoFrame>& video_frame);
|
| + void OnInitializeComplete(FilterCallback* done_cb);
|
| + void OnStopComplete(FilterCallback* callback);
|
| + void OnFlushComplete(FilterCallback* callback);
|
| + void OnSeekComplete(FilterCallback* callback);
|
| + void OnReadComplete(Buffer* buffer);
|
|
|
| - // Create an empty video frame and queue it.
|
| - virtual void EnqueueEmptyFrame();
|
| + // TODO(jiesun): until demuxer pass scoped_refptr<Buffer>: we could not merge
|
| + // this with OnReadComplete
|
| + void OnReadCompleteTask(scoped_refptr<Buffer> buffer);
|
|
|
| - // Methods that pickup after the decode engine has finished its action.
|
| - virtual void OnInitializeComplete(bool* success /* Not owned */,
|
| - Task* done_cb);
|
| -
|
| - virtual void OnDecodeComplete(scoped_refptr<VideoFrame> video_frame);
|
| + virtual void OnEngineEmptyBufferDone(scoped_refptr<Buffer> buffer);
|
| + virtual void OnEngineFillBufferDone(scoped_refptr<VideoFrame> video_frame);
|
|
|
| // Attempt to get the PTS and Duration for this frame by examining the time
|
| // info provided via packet stream (stored in |pts_heap|), or the info
|
| - // writen into the AVFrame itself. If no data is available in either, then
|
| + // written into the AVFrame itself. If no data is available in either, then
|
| // attempt to generate a best guess of the pts based on the last known pts.
|
| //
|
| // Data inside the AVFrame (if provided) is trusted the most, followed
|
| @@ -88,16 +94,13 @@ class FFmpegVideoDecoder : public DecoderBase<VideoDecoder, VideoFrame> {
|
| const TimeTuple& last_pts,
|
| const VideoFrame* frame);
|
|
|
| - // Signals the pipeline that a decode error occurs, and moves the decoder
|
| - // into the kDecodeFinished state.
|
| - virtual void SignalPipelineError();
|
| -
|
| // Injection point for unittest to provide a mock engine. Takes ownership of
|
| // the provided engine.
|
| virtual void SetVideoDecodeEngineForTest(VideoDecodeEngine* engine);
|
|
|
| size_t width_;
|
| size_t height_;
|
| + MediaFormat media_format_;
|
|
|
| PtsHeap pts_heap_; // Heap of presentation timestamps.
|
| TimeTuple last_pts_;
|
| @@ -105,6 +108,15 @@ class FFmpegVideoDecoder : public DecoderBase<VideoDecoder, VideoFrame> {
|
| DecoderState state_;
|
| scoped_ptr<VideoDecodeEngine> decode_engine_;
|
|
|
| + // Tracks the number of asynchronous reads issued to |demuxer_stream_|.
|
| + // Using size_t since it is always compared against deque::size().
|
| + size_t pending_reads_;
|
| + // Tracks the number of asynchronous reads issued from renderer.
|
| + size_t pending_requests_;
|
| +
|
| + // Pointer to the demuxer stream that will feed us compressed buffers.
|
| + scoped_refptr<DemuxerStream> demuxer_stream_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(FFmpegVideoDecoder);
|
| };
|
|
|
|
|