summaryrefslogtreecommitdiffstats
path: root/media/base
diff options
context:
space:
mode:
authoracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-15 17:13:08 +0000
committeracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-15 17:13:08 +0000
commit35f3e67adf323b55cab5775a503afec9cf6e87da (patch)
treeeeddbd8aacab093c582855834cbed86296074495 /media/base
parenta64245db66a97ef119dd0b159bb93a71dd770d67 (diff)
downloadchromium_src-35f3e67adf323b55cab5775a503afec9cf6e87da.zip
chromium_src-35f3e67adf323b55cab5775a503afec9cf6e87da.tar.gz
chromium_src-35f3e67adf323b55cab5775a503afec9cf6e87da.tar.bz2
Move FilterType into MediaFilterCollection
MediaFilterCollection is the only code that uses FilterType now so I'm moving the enum into that class and removing all references from the MediaFilter & derived classes. BUG=61823 TEST=No new functionality. Existing tests pass. Review URL: http://codereview.chromium.org/4653005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@66125 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/base')
-rw-r--r--media/base/filters.cc24
-rw-r--r--media/base/filters.h34
-rw-r--r--media/base/media_filter_collection.cc71
-rw-r--r--media/base/media_filter_collection.h43
-rw-r--r--media/base/media_filter_collection_unittest.cc36
-rw-r--r--media/base/mock_filters.h12
-rw-r--r--media/base/pipeline_impl.cc12
7 files changed, 131 insertions, 101 deletions
diff --git a/media/base/filters.cc b/media/base/filters.cc
index 0773b89..100af78 100644
--- a/media/base/filters.cc
+++ b/media/base/filters.cc
@@ -93,14 +93,6 @@ bool DataSource::IsUrlSupported(const std::string& url) {
return true;
}
-FilterType DataSource::filter_type() const {
- return static_filter_type();
-}
-
-FilterType Demuxer::filter_type() const {
- return static_filter_type();
-}
-
bool Demuxer::requires_message_loop() const {
return true;
}
@@ -109,10 +101,6 @@ const char* Demuxer::message_loop_name() const {
return "DemuxerThread";
}
-FilterType AudioDecoder::filter_type() const {
- return static_filter_type();
-}
-
const char* AudioDecoder::major_mime_type() const {
return mime_type::kMajorTypeAudio;
}
@@ -125,18 +113,10 @@ const char* AudioDecoder::message_loop_name() const {
return "AudioDecoderThread";
}
-FilterType AudioRenderer::filter_type() const {
- return static_filter_type();
-}
-
const char* AudioRenderer::major_mime_type() const {
return mime_type::kMajorTypeAudio;
}
-FilterType VideoDecoder::filter_type() const {
- return static_filter_type();
-}
-
const char* VideoDecoder::major_mime_type() const {
return mime_type::kMajorTypeVideo;
}
@@ -149,10 +129,6 @@ const char* VideoDecoder::message_loop_name() const {
return "VideoDecoderThread";
}
-FilterType VideoRenderer::filter_type() const {
- return static_filter_type();
-}
-
const char* VideoRenderer::major_mime_type() const {
return mime_type::kMajorTypeVideo;
}
diff --git a/media/base/filters.h b/media/base/filters.h
index bec7d39..8c3d757 100644
--- a/media/base/filters.h
+++ b/media/base/filters.h
@@ -43,18 +43,6 @@ class DemuxerStream;
class FilterHost;
class MediaFilter;
-// Identifies the type of filter implementation. Each filter has to be one of
-// the following types. This is used to identify filter object during
-// initialization of pipeline.
-enum FilterType {
- FILTER_DATA_SOURCE,
- FILTER_DEMUXER,
- FILTER_AUDIO_DECODER,
- FILTER_VIDEO_DECODER,
- FILTER_AUDIO_RENDERER,
- FILTER_VIDEO_RENDERER
-};
-
// Used for completing asynchronous methods.
typedef Callback0::Type FilterCallback;
@@ -62,10 +50,6 @@ class MediaFilter : public base::RefCountedThreadSafe<MediaFilter> {
public:
MediaFilter();
- // Return the type of this filter. All implementor has to provide this
- // method.
- virtual FilterType filter_type() const = 0;
-
// Return the major mime type for this filter.
virtual const char* major_mime_type() const;
@@ -146,9 +130,6 @@ class DataSource : public MediaFilter {
virtual bool IsUrlSupported(const std::string& url);
- static FilterType static_filter_type() { return FILTER_DATA_SOURCE; }
- virtual FilterType filter_type() const;
-
// Initialize a DataSource for the given URL, executing the callback upon
// completion.
virtual void Initialize(const std::string& url, FilterCallback* callback) = 0;
@@ -173,9 +154,6 @@ class DataSource : public MediaFilter {
class Demuxer : public MediaFilter {
public:
- static FilterType static_filter_type() { return FILTER_DEMUXER; }
- virtual FilterType filter_type() const;
-
virtual bool requires_message_loop() const;
virtual const char* message_loop_name() const;
@@ -232,9 +210,6 @@ class DemuxerStream : public base::RefCountedThreadSafe<DemuxerStream> {
class VideoDecoder : public MediaFilter {
public:
- static FilterType static_filter_type() { return FILTER_VIDEO_DECODER; }
- virtual FilterType filter_type() const;
-
virtual const char* major_mime_type() const;
virtual bool requires_message_loop() const;
virtual const char* message_loop_name() const;
@@ -280,9 +255,6 @@ class VideoDecoder : public MediaFilter {
class AudioDecoder : public MediaFilter {
public:
- static FilterType static_filter_type() { return FILTER_AUDIO_DECODER; }
- virtual FilterType filter_type() const;
-
virtual const char* major_mime_type() const;
virtual bool requires_message_loop() const;
virtual const char* message_loop_name() const;
@@ -322,9 +294,6 @@ class AudioDecoder : public MediaFilter {
class VideoRenderer : public MediaFilter {
public:
- static FilterType static_filter_type() { return FILTER_VIDEO_RENDERER; }
- virtual FilterType filter_type() const;
-
virtual const char* major_mime_type() const;
// Initialize a VideoRenderer with the given VideoDecoder, executing the
@@ -339,9 +308,6 @@ class VideoRenderer : public MediaFilter {
class AudioRenderer : public MediaFilter {
public:
- static FilterType static_filter_type() { return FILTER_AUDIO_RENDERER; }
- virtual FilterType filter_type() const;
-
virtual const char* major_mime_type() const;
// Initialize a AudioRenderer with the given AudioDecoder, executing the
diff --git a/media/base/media_filter_collection.cc b/media/base/media_filter_collection.cc
index 2c90412..a1380c4 100644
--- a/media/base/media_filter_collection.cc
+++ b/media/base/media_filter_collection.cc
@@ -9,8 +9,28 @@ namespace media {
MediaFilterCollection::MediaFilterCollection() {
}
-void MediaFilterCollection::AddFilter(MediaFilter* filter) {
- filters_.push_back(filter);
+void MediaFilterCollection::AddDataSource(DataSource* filter) {
+ AddFilter(DATA_SOURCE, filter);
+}
+
+void MediaFilterCollection::AddDemuxer(Demuxer* filter) {
+ AddFilter(DEMUXER, filter);
+}
+
+void MediaFilterCollection::AddVideoDecoder(VideoDecoder* filter) {
+ AddFilter(VIDEO_DECODER, filter);
+}
+
+void MediaFilterCollection::AddAudioDecoder(AudioDecoder* filter) {
+ AddFilter(AUDIO_DECODER, filter);
+}
+
+void MediaFilterCollection::AddVideoRenderer(VideoRenderer* filter) {
+ AddFilter(VIDEO_RENDERER, filter);
+}
+
+void MediaFilterCollection::AddAudioRenderer(AudioRenderer* filter) {
+ AddFilter(AUDIO_RENDERER, filter);
}
bool MediaFilterCollection::IsEmpty() const {
@@ -21,19 +41,60 @@ void MediaFilterCollection::Clear() {
filters_.clear();
}
+void MediaFilterCollection::SelectDataSource(
+ scoped_refptr<DataSource>* filter_out) {
+ SelectFilter<DATA_SOURCE>(filter_out);
+}
+
+void MediaFilterCollection::SelectDemuxer(scoped_refptr<Demuxer>* filter_out) {
+ SelectFilter<DEMUXER>(filter_out);
+}
+
+void MediaFilterCollection::SelectVideoDecoder(
+ scoped_refptr<VideoDecoder>* filter_out) {
+ SelectFilter<VIDEO_DECODER>(filter_out);
+}
+
+void MediaFilterCollection::SelectAudioDecoder(
+ scoped_refptr<AudioDecoder>* filter_out) {
+ SelectFilter<AUDIO_DECODER>(filter_out);
+}
+
+void MediaFilterCollection::SelectVideoRenderer(
+ scoped_refptr<VideoRenderer>* filter_out) {
+ SelectFilter<VIDEO_RENDERER>(filter_out);
+}
+
+void MediaFilterCollection::SelectAudioRenderer(
+ scoped_refptr<AudioRenderer>* filter_out) {
+ SelectFilter<AUDIO_RENDERER>(filter_out);
+}
+
+void MediaFilterCollection::AddFilter(FilterType filter_type,
+ MediaFilter* filter) {
+ filters_.push_back(FilterListElement(filter_type, filter));
+}
+
+template<MediaFilterCollection::FilterType filter_type, class Filter>
+void MediaFilterCollection::SelectFilter(scoped_refptr<Filter>* filter_out) {
+ scoped_refptr<MediaFilter> filter;
+ SelectFilter(filter_type, &filter);
+ *filter_out = reinterpret_cast<Filter*>(filter.get());
+}
+
void MediaFilterCollection::SelectFilter(
FilterType filter_type,
scoped_refptr<MediaFilter>* filter_out) {
- std::list<scoped_refptr<MediaFilter> >::iterator it = filters_.begin();
+ FilterList::iterator it = filters_.begin();
while (it != filters_.end()) {
- if ((*it)->filter_type() == filter_type)
+ if (it->first == filter_type)
break;
++it;
}
if (it != filters_.end()) {
- *filter_out = it->get();
+ *filter_out = it->second.get();
filters_.erase(it);
}
}
diff --git a/media/base/media_filter_collection.h b/media/base/media_filter_collection.h
index 31ea69c..c4a403a 100644
--- a/media/base/media_filter_collection.h
+++ b/media/base/media_filter_collection.h
@@ -19,7 +19,12 @@ class MediaFilterCollection {
MediaFilterCollection();
// Adds a filter to the collection.
- void AddFilter(MediaFilter* filter);
+ void AddDataSource(DataSource* filter);
+ void AddDemuxer(Demuxer* filter);
+ void AddVideoDecoder(VideoDecoder* filter);
+ void AddAudioDecoder(AudioDecoder* filter);
+ void AddVideoRenderer(VideoRenderer* filter);
+ void AddAudioRenderer(AudioRenderer* filter);
// Is the collection empty?
bool IsEmpty() const;
@@ -30,16 +35,38 @@ class MediaFilterCollection {
// Selects a filter of the specified type from the collection.
// If the required filter cannot be found, NULL is returned.
// If a filter is returned it is removed from the collection.
- template <class Filter>
- void SelectFilter(scoped_refptr<Filter>* filter_out) {
- scoped_refptr<MediaFilter> filter;
- SelectFilter(Filter::static_filter_type(), &filter);
- *filter_out = reinterpret_cast<Filter*>(filter.get());
- }
+ void SelectDataSource(scoped_refptr<DataSource>* filter_out);
+ void SelectDemuxer(scoped_refptr<Demuxer>* filter_out);
+ void SelectVideoDecoder(scoped_refptr<VideoDecoder>* filter_out);
+ void SelectAudioDecoder(scoped_refptr<AudioDecoder>* filter_out);
+ void SelectVideoRenderer(scoped_refptr<VideoRenderer>* filter_out);
+ void SelectAudioRenderer(scoped_refptr<AudioRenderer>* filter_out);
private:
+ // Identifies the type of filter implementation. Each filter has to be one of
+ // the following types. This is used to mark, identify, and support
+ // downcasting of different filter types stored in the filters_ list.
+ enum FilterType {
+ DATA_SOURCE,
+ DEMUXER,
+ AUDIO_DECODER,
+ VIDEO_DECODER,
+ AUDIO_RENDERER,
+ VIDEO_RENDERER
+ };
+
// List of filters managed by this collection.
- std::list<scoped_refptr<MediaFilter> > filters_;
+ typedef std::pair<FilterType, scoped_refptr<MediaFilter> > FilterListElement;
+ typedef std::list<FilterListElement> FilterList;
+ FilterList filters_;
+
+ // Helper function that adds a filter to the filter list.
+ void AddFilter(FilterType filter_type, MediaFilter* filter);
+
+ // Helper function for SelectXXX() methods. It manages the
+ // downcasting and mapping between FilterType and Filter class.
+ template<FilterType filter_type, class Filter>
+ void SelectFilter(scoped_refptr<Filter>* filter_out);
// Helper function that searches the filters list for a specific
// filter type.
diff --git a/media/base/media_filter_collection_unittest.cc b/media/base/media_filter_collection_unittest.cc
index d974b4f..523123b 100644
--- a/media/base/media_filter_collection_unittest.cc
+++ b/media/base/media_filter_collection_unittest.cc
@@ -23,7 +23,7 @@ class MediaFilterCollectionTest : public ::testing::Test {
TEST_F(MediaFilterCollectionTest, TestIsEmptyAndClear) {
EXPECT_TRUE(collection_.IsEmpty());
- collection_.AddFilter(mock_filters_.data_source());
+ collection_.AddDataSource(mock_filters_.data_source());
EXPECT_FALSE(collection_.IsEmpty());
@@ -32,41 +32,41 @@ TEST_F(MediaFilterCollectionTest, TestIsEmptyAndClear) {
EXPECT_TRUE(collection_.IsEmpty());
}
-TEST_F(MediaFilterCollectionTest, SelectFilter) {
+TEST_F(MediaFilterCollectionTest, SelectXXXMethods) {
scoped_refptr<AudioDecoder> audio_decoder;
scoped_refptr<DataSource> data_source;
- collection_.AddFilter(mock_filters_.data_source());
+ collection_.AddDataSource(mock_filters_.data_source());
EXPECT_FALSE(collection_.IsEmpty());
// Verify that the data source will not be returned if we
// ask for a different type.
- collection_.SelectFilter(&audio_decoder);
+ collection_.SelectAudioDecoder(&audio_decoder);
EXPECT_FALSE(audio_decoder);
EXPECT_FALSE(collection_.IsEmpty());
// Verify that we can actually retrieve the data source
// and that it is removed from the collection.
- collection_.SelectFilter(&data_source);
+ collection_.SelectDataSource(&data_source);
EXPECT_TRUE(data_source);
EXPECT_TRUE(collection_.IsEmpty());
// Add a data source and audio decoder.
- collection_.AddFilter(mock_filters_.data_source());
- collection_.AddFilter(mock_filters_.audio_decoder());
+ collection_.AddDataSource(mock_filters_.data_source());
+ collection_.AddAudioDecoder(mock_filters_.audio_decoder());
// Verify that we can select the audio decoder.
- collection_.SelectFilter(&audio_decoder);
+ collection_.SelectAudioDecoder(&audio_decoder);
EXPECT_TRUE(audio_decoder);
EXPECT_FALSE(collection_.IsEmpty());
// Verify that we can't select it again since only one has been added.
- collection_.SelectFilter(&audio_decoder);
+ collection_.SelectAudioDecoder(&audio_decoder);
EXPECT_FALSE(audio_decoder);
// Verify that we can select the data source and that doing so will
// empty the collection again.
- collection_.SelectFilter(&data_source);
+ collection_.SelectDataSource(&data_source);
EXPECT_TRUE(collection_.IsEmpty());
}
@@ -76,23 +76,23 @@ TEST_F(MediaFilterCollectionTest, MultipleFiltersOfSameType) {
scoped_refptr<DataSource> data_source;
- collection_.AddFilter(data_source_a.get());
- collection_.AddFilter(data_source_b.get());
+ collection_.AddDataSource(data_source_a.get());
+ collection_.AddDataSource(data_source_b.get());
- // Verify that first SelectFilter() returns data_source_a.
- collection_.SelectFilter(&data_source);
+ // Verify that first SelectDataSource() returns data_source_a.
+ collection_.SelectDataSource(&data_source);
EXPECT_TRUE(data_source);
EXPECT_EQ(data_source, data_source_a);
EXPECT_FALSE(collection_.IsEmpty());
- // Verify that second SelectFilter() returns data_source_b.
- collection_.SelectFilter(&data_source);
+ // Verify that second SelectDataSource() returns data_source_b.
+ collection_.SelectDataSource(&data_source);
EXPECT_TRUE(data_source);
EXPECT_EQ(data_source, data_source_b);
EXPECT_TRUE(collection_.IsEmpty());
- // Verify that third SelectFilter returns nothing.
- collection_.SelectFilter(&data_source);
+ // Verify that third SelectDataSource() returns nothing.
+ collection_.SelectDataSource(&data_source);
EXPECT_FALSE(data_source);
}
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index ba15293..af7c0c5 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -293,13 +293,13 @@ class MockFilterCollection {
MediaFilterCollection* collection = new MediaFilterCollection();
if (include_data_source) {
- collection->AddFilter(data_source_);
+ collection->AddDataSource(data_source_);
}
- collection->AddFilter(demuxer_);
- collection->AddFilter(video_decoder_);
- collection->AddFilter(audio_decoder_);
- collection->AddFilter(video_renderer_);
- collection->AddFilter(audio_renderer_);
+ collection->AddDemuxer(demuxer_);
+ collection->AddVideoDecoder(video_decoder_);
+ collection->AddAudioDecoder(audio_decoder_);
+ collection->AddVideoRenderer(video_renderer_);
+ collection->AddAudioRenderer(audio_renderer_);
return collection;
}
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc
index 7f17ff8..7765cd0 100644
--- a/media/base/pipeline_impl.cc
+++ b/media/base/pipeline_impl.cc
@@ -954,7 +954,7 @@ void PipelineImpl::InitializeDataSource() {
scoped_refptr<DataSource> data_source;
while (true) {
- filter_collection_->SelectFilter(&data_source);
+ filter_collection_->SelectDataSource(&data_source);
if (!data_source || data_source->IsUrlSupported(url_))
break;
}
@@ -979,7 +979,7 @@ void PipelineImpl::InitializeDemuxer(
CHECK(data_source);
- filter_collection_->SelectFilter(&demuxer);
+ filter_collection_->SelectDemuxer(&demuxer);
if (!demuxer) {
SetError(PIPELINE_ERROR_REQUIRED_FILTER_MISSING);
return;
@@ -1001,7 +1001,7 @@ bool PipelineImpl::InitializeAudioDecoder(
if (stream) {
scoped_refptr<AudioDecoder> audio_decoder;
- filter_collection_->SelectFilter(&audio_decoder);
+ filter_collection_->SelectAudioDecoder(&audio_decoder);
if (audio_decoder) {
PrepareFilter(audio_decoder);
@@ -1028,7 +1028,7 @@ bool PipelineImpl::InitializeVideoDecoder(
if (stream) {
scoped_refptr<VideoDecoder> video_decoder;
- filter_collection_->SelectFilter(&video_decoder);
+ filter_collection_->SelectVideoDecoder(&video_decoder);
if (video_decoder) {
PrepareFilter(video_decoder);
@@ -1050,7 +1050,7 @@ bool PipelineImpl::InitializeAudioRenderer(
DCHECK(IsPipelineOk());
if (decoder) {
- filter_collection_->SelectFilter(&audio_renderer_);
+ filter_collection_->SelectAudioRenderer(&audio_renderer_);
if (audio_renderer_) {
PrepareFilter(audio_renderer_);
@@ -1070,7 +1070,7 @@ bool PipelineImpl::InitializeVideoRenderer(
DCHECK(IsPipelineOk());
if (decoder) {
- filter_collection_->SelectFilter(&video_renderer_);
+ filter_collection_->SelectVideoRenderer(&video_renderer_);
if (video_renderer_) {
PrepareFilter(video_renderer_);