diff options
author | ralphl@chromium.org <ralphl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-26 04:20:48 +0000 |
---|---|---|
committer | ralphl@chromium.org <ralphl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-26 04:20:48 +0000 |
commit | 636cf88fc365a7c62cc3318f149b3919d148f5d0 (patch) | |
tree | 520002c5b36dfbffac1229bddf04b0721981a5f8 /media/base | |
parent | d815db156387600cdad5466be6b172421df420d8 (diff) | |
download | chromium_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.h | 24 | ||||
-rw-r--r-- | media/base/mock_media_filters.h | 81 | ||||
-rw-r--r-- | media/base/pipeline_impl.cc | 2 |
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) && |