summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
authorjiesun@google.com <jiesun@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-26 21:37:54 +0000
committerjiesun@google.com <jiesun@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-26 21:37:54 +0000
commit5c84b7e13f3525b84f7928e946727b5b8b77899b (patch)
tree44bb458aeb239c69a85a5c505916d1516b5b526e /media/base
parent00ae7a50fe5aa9b15046dff5e805d8cbb1bb4906 (diff)
downloadchromium_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.h44
-rw-r--r--media/base/mock_filters.h10
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() {}