summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
authorralphl@chromium.org <ralphl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-26 04:20:48 +0000
committerralphl@chromium.org <ralphl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-26 04:20:48 +0000
commit636cf88fc365a7c62cc3318f149b3919d148f5d0 (patch)
tree520002c5b36dfbffac1229bddf04b0721981a5f8 /media/base
parentd815db156387600cdad5466be6b172421df420d8 (diff)
downloadchromium_src-636cf88fc365a7c62cc3318f149b3919d148f5d0.zip
chromium_src-636cf88fc365a7c62cc3318f149b3919d148f5d0.tar.gz
chromium_src-636cf88fc365a7c62cc3318f149b3919d148f5d0.tar.bz2
Ability for demuxer clients to get to FFmpeg's AVStream object exposed as an extended interface through DemuxerStream object.
DemuxerStream now derives from base::RefCountedThreadSafe. Review URL: http://codereview.chromium.org/42521 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12537 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base')
-rw-r--r--media/base/filters.h24
-rw-r--r--media/base/mock_media_filters.h81
-rw-r--r--media/base/pipeline_impl.cc2
3 files changed, 64 insertions, 43 deletions
diff --git a/media/base/filters.h b/media/base/filters.h
index 3776c72..7ceb9e8 100644
--- a/media/base/filters.h
+++ b/media/base/filters.h
@@ -147,11 +147,11 @@ class Demuxer : public MediaFilter {
virtual size_t GetNumberOfStreams() = 0;
// Returns the stream for the given index, NULL otherwise
- virtual DemuxerStream* GetStream(int stream_id) = 0;
+ virtual scoped_refptr<DemuxerStream> GetStream(int stream_id) = 0;
};
-class DemuxerStream {
+class DemuxerStream : public base::RefCountedThreadSafe<DemuxerStream> {
public:
// Returns the MediaFormat for this filter.
virtual const MediaFormat* GetMediaFormat() = 0;
@@ -159,7 +159,27 @@ class DemuxerStream {
// Schedules a read and takes ownership of the given buffer.
virtual void Read(Assignable<Buffer>* buffer) = 0;
+ // Given a class that supports the |Interface| and a related static method
+ // interface_id(), which returns a const char*, this method returns true if
+ // the class returns an interface pointer and assigns the pointer to
+ // |interface_out|. Otherwise this method returns false.
+ template <class Interface>
+ bool QueryInterface(scoped_refptr<Interface>* interface_out) {
+ void* i = QueryInterface(Interface::interface_id());
+ *interface_out = reinterpret_cast<Interface*>(i);
+ return (NULL != i);
+ };
+
protected:
+ // Optional method that is implemented by filters that support extended
+ // interfaces. The filter should return a pointer to the interface
+ // associated with the |interface_id| string if they support it, otherwise
+ // return NULL to indicate the interface is unknown. The derived filter
+ // should NOT AddRef() the interface. The DemuxerStream::QueryInterface()
+ // public template function will assign the interface to a scoped_refptr<>.
+ virtual void* QueryInterface(const char* interface_id) { return NULL; }
+
+ friend class base::RefCountedThreadSafe<DemuxerStream>;
virtual ~DemuxerStream() {}
};
diff --git a/media/base/mock_media_filters.h b/media/base/mock_media_filters.h
index 5a3c6bf..4f12c00 100644
--- a/media/base/mock_media_filters.h
+++ b/media/base/mock_media_filters.h
@@ -195,6 +195,39 @@ class MockDataSource : public DataSource {
//------------------------------------------------------------------------------
+class MockDemuxerStream : public DemuxerStream {
+ public:
+ MockDemuxerStream(const MockFilterConfig* config, bool is_audio) {
+ if (is_audio) {
+ media_format_.SetAsString(MediaFormat::kMimeType,
+ config->compressed_audio_mime_type);
+ } else {
+ media_format_.SetAsString(MediaFormat::kMimeType,
+ config->compressed_video_mime_type);
+ media_format_.SetAsInteger(MediaFormat::kWidth, config->video_width);
+ media_format_.SetAsInteger(MediaFormat::kHeight, config->video_height);
+ }
+ }
+
+ // Implementation of DemuxerStream.
+ virtual const MediaFormat* GetMediaFormat() {
+ return &media_format_;
+ }
+
+ virtual void Read(Assignable<Buffer>* buffer) {
+ NOTREACHED(); // TODO(ralphl): fix me!!
+ }
+
+ private:
+ virtual ~MockDemuxerStream() {}
+
+ MediaFormat media_format_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockDemuxerStream);
+};
+
+//------------------------------------------------------------------------------
+
class MockDemuxer : public Demuxer {
public:
static FilterFactory* CreateFactory(const MockFilterConfig* config) {
@@ -204,8 +237,8 @@ class MockDemuxer : public Demuxer {
explicit MockDemuxer(const MockFilterConfig* config)
: config_(config),
- mock_audio_stream_(config, true),
- mock_video_stream_(config, false) {
+ mock_audio_stream_(new MockDemuxerStream(config, true)),
+ mock_video_stream_(new MockDemuxerStream(config, false)) {
}
// Implementation of MediaFilter.
@@ -228,18 +261,18 @@ class MockDemuxer : public Demuxer {
return num_streams;
}
- virtual DemuxerStream* GetStream(int stream_id) {
+ virtual scoped_refptr<DemuxerStream> GetStream(int stream_id) {
switch (stream_id) {
case 0:
if (config_->has_audio) {
- return &mock_audio_stream_;
+ return mock_audio_stream_;
} else if (config_->has_video) {
- return &mock_video_stream_;
+ return mock_video_stream_;
}
break;
case 1:
if (config_->has_audio && config_->has_video) {
- return &mock_video_stream_;
+ return mock_video_stream_;
}
break;
}
@@ -250,41 +283,9 @@ class MockDemuxer : public Demuxer {
private:
virtual ~MockDemuxer() {}
- // Internal class implements DemuxerStream interface.
- class MockDemuxerStream : public DemuxerStream {
- public:
- MockDemuxerStream(const MockFilterConfig* config, bool is_audio) {
- if (is_audio) {
- media_format_.SetAsString(MediaFormat::kMimeType,
- config->compressed_audio_mime_type);
- } else {
- media_format_.SetAsString(MediaFormat::kMimeType,
- config->compressed_video_mime_type);
- media_format_.SetAsInteger(MediaFormat::kWidth, config->video_width);
- media_format_.SetAsInteger(MediaFormat::kHeight, config->video_height);
- }
- }
-
- virtual ~MockDemuxerStream() {}
-
- // Implementation of DemuxerStream.
- virtual const MediaFormat* GetMediaFormat() {
- return &media_format_;
- }
-
- virtual void Read(Assignable<Buffer>* buffer) {
- NOTREACHED(); // TODO(ralphl): fix me!!
- }
-
- private:
- MediaFormat media_format_;
-
- DISALLOW_COPY_AND_ASSIGN(MockDemuxerStream);
- };
-
const MockFilterConfig* config_;
- MockDemuxerStream mock_audio_stream_;
- MockDemuxerStream mock_video_stream_;
+ scoped_refptr<DemuxerStream> mock_audio_stream_;
+ scoped_refptr<DemuxerStream> mock_video_stream_;
DISALLOW_COPY_AND_ASSIGN(MockDemuxer);
};
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index 67f4b9c..3e3a40d 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -418,7 +418,7 @@ void PipelineThread::Render(FilterFactory* filter_factory, Demuxer* demuxer) {
const std::string major_mime_type = Decoder::major_mime_type();
const int num_outputs = demuxer->GetNumberOfStreams();
for (int i = 0; i < num_outputs; ++i) {
- DemuxerStream* demuxer_stream = demuxer->GetStream(i);
+ scoped_refptr<DemuxerStream> demuxer_stream = demuxer->GetStream(i);
const MediaFormat* stream_format = demuxer_stream->GetMediaFormat();
std::string value;
if (stream_format->GetAsString(MediaFormat::kMimeType, &value) &&