diff options
author | jiesun@google.com <jiesun@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-26 21:37:54 +0000 |
---|---|---|
committer | jiesun@google.com <jiesun@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-26 21:37:54 +0000 |
commit | 5c84b7e13f3525b84f7928e946727b5b8b77899b (patch) | |
tree | 44bb458aeb239c69a85a5c505916d1516b5b526e /media/base | |
parent | 00ae7a50fe5aa9b15046dff5e805d8cbb1bb4906 (diff) | |
download | chromium_src-5c84b7e13f3525b84f7928e946727b5b8b77899b.zip chromium_src-5c84b7e13f3525b84f7928e946727b5b8b77899b.tar.gz chromium_src-5c84b7e13f3525b84f7928e946727b5b8b77899b.tar.bz2 |
refactoring decoder interface
1. install permanent buffer exchange callback.
2. render provide buffer in read=>fillthisbuffer.
3. for ffmpeg path, the provided buffer is just dummy. it had no relation to decoded buffer. so as to keep the code almost same.
Review URL: http://codereview.chromium.org/2101022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48328 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base')
-rw-r--r-- | media/base/filters.h | 44 | ||||
-rw-r--r-- | media/base/mock_filters.h | 10 |
2 files changed, 44 insertions, 10 deletions
diff --git a/media/base/filters.h b/media/base/filters.h index 980e700..c4da5d9 100644 --- a/media/base/filters.h +++ b/media/base/filters.h @@ -265,10 +265,24 @@ class VideoDecoder : public MediaFilter { // Returns the MediaFormat for this filter. virtual const MediaFormat& media_format() = 0; - // Schedules a read. Decoder takes ownership of the callback. - // - // TODO(scherkus): switch Read() callback to scoped_refptr<>. - virtual void Read(Callback1<VideoFrame*>::Type* read_callback) = 0; + // |set_fill_buffer_done_callback| install permanent callback from downstream + // filter (i.e. Renderer). The callback is used to deliver video frames at + // runtime to downstream filter + typedef Callback1<scoped_refptr<VideoFrame> >::Type FillBufferDoneCallback; + void set_fill_buffer_done_callback(FillBufferDoneCallback* callback) { + fill_buffer_done_callback_.reset(callback); + } + FillBufferDoneCallback* fill_buffer_done_callback() { + return fill_buffer_done_callback_.get(); + } + + // Render provides an output buffer for Decoder to write to. These buffers + // will be recycled to renderer by fill_buffer_done_callback_; + // We could also pass empty pointer here to let decoder provide buffers pool. + virtual void FillThisBuffer(scoped_refptr<VideoFrame> frame) = 0; + + private: + scoped_ptr<FillBufferDoneCallback> fill_buffer_done_callback_; }; @@ -289,10 +303,24 @@ class AudioDecoder : public MediaFilter { // Returns the MediaFormat for this filter. virtual const MediaFormat& media_format() = 0; - // Schedules a read. Decoder takes ownership of the callback. - // - // TODO(scherkus): switch Read() callback to scoped_refptr<>. - virtual void Read(Callback1<Buffer*>::Type* read_callback) = 0; + // |set_fill_buffer_done_callback| install permanent callback from downstream + // filter (i.e. Renderer). The callback is used to deliver buffers at + // runtime to downstream filter. + typedef Callback1<scoped_refptr<Buffer> >::Type FillBufferDoneCallback; + void set_fill_buffer_done_callback(FillBufferDoneCallback* callback) { + fill_buffer_done_callback_.reset(callback); + } + FillBufferDoneCallback* fill_buffer_done_callback() { + return fill_buffer_done_callback_.get(); + } + + // Render provides an output buffer for Decoder to write to. These buffers + // will be recycled to renderer by fill_buffer_done_callback_; + // We could also pass empty pointer here to let decoder provide buffers pool. + virtual void FillThisBuffer(scoped_refptr<Buffer> buffer) = 0; + + private: + scoped_ptr<FillBufferDoneCallback> fill_buffer_done_callback_; }; diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h index 7f49fcf..9aeaeec 100644 --- a/media/base/mock_filters.h +++ b/media/base/mock_filters.h @@ -18,6 +18,7 @@ #include "base/callback.h" #include "media/base/factory.h" #include "media/base/filters.h" +#include "media/base/video_frame.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { @@ -170,7 +171,7 @@ class MockVideoDecoder : public VideoDecoder { MOCK_METHOD2(Initialize, void(DemuxerStream* stream, FilterCallback* callback)); MOCK_METHOD0(media_format, const MediaFormat&()); - MOCK_METHOD1(Read, void(Callback1<VideoFrame*>::Type* read_callback)); + MOCK_METHOD1(FillThisBuffer, void(scoped_refptr<VideoFrame>)); protected: virtual ~MockVideoDecoder() {} @@ -193,7 +194,12 @@ class MockAudioDecoder : public AudioDecoder { MOCK_METHOD2(Initialize, void(DemuxerStream* stream, FilterCallback* callback)); MOCK_METHOD0(media_format, const MediaFormat&()); - MOCK_METHOD1(Read, void(Callback1<Buffer*>::Type* read_callback)); + MOCK_METHOD1(FillThisBuffer, void(scoped_refptr<Buffer>)); + + // change to public to allow unittest for access; + FillBufferDoneCallback* fill_buffer_done_callback() { + return AudioDecoder::fill_buffer_done_callback(); + } protected: virtual ~MockAudioDecoder() {} |