summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-23 22:58:34 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-23 22:58:34 +0000
commit976219a862c6764638a793a22f7ffd6da95cc987 (patch)
tree3ff25b05cac912e17687b8e3c27f130881bbf25e /media
parent9f0940b6148b21ef1f7155fd56e31da98ffc2fb0 (diff)
downloadchromium_src-976219a862c6764638a793a22f7ffd6da95cc987.zip
chromium_src-976219a862c6764638a793a22f7ffd6da95cc987.tar.gz
chromium_src-976219a862c6764638a793a22f7ffd6da95cc987.tar.bz2
Preparation work to move AudioRenderer and VideoRenderer out of Filter hierarchy
This is the first CL to move AudioRenderer and VideoRenderer out of Filter hierarchy. In this CL, AudioRenderer and VideoRenderer are moved to their own .h file. AudioRenderer and VideoRenderer is removed from the pipeline. In a follow-up CL, AudioRenderer and VideoRenderer will not use FilterHost to access global playback information. Patch by yujie.mao@intel.com: http://codereview.chromium.org/10407085/ BUG=108341, 108342 TEST=media_unittests, content_unittests, html5 <video> playback, html5 <video> local capture preview git-svn-id: svn://svn.chromium.org/chrome/trunk/src@138642 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/base/filter_collection.cc67
-rw-r--r--media/base/filter_collection.h39
-rw-r--r--media/base/filters.h65
-rw-r--r--media/base/mock_filters.h2
-rw-r--r--media/base/pipeline.cc28
-rw-r--r--media/filters/audio_renderer_impl.h2
-rw-r--r--media/filters/video_renderer_base.h2
-rw-r--r--media/media.gyp2
8 files changed, 62 insertions, 145 deletions
diff --git a/media/base/filter_collection.cc b/media/base/filter_collection.cc
index 205da15..0b10f5f 100644
--- a/media/base/filter_collection.cc
+++ b/media/base/filter_collection.cc
@@ -6,7 +6,10 @@
#include "base/logging.h"
#include "media/base/audio_decoder.h"
+#include "media/base/audio_renderer.h"
+#include "media/base/demuxer.h"
#include "media/base/video_decoder.h"
+#include "media/base/video_renderer.h"
namespace media {
@@ -30,21 +33,26 @@ void FilterCollection::AddVideoDecoder(VideoDecoder* video_decoder) {
video_decoders_.push_back(video_decoder);
}
-void FilterCollection::AddAudioRenderer(AudioRenderer* filter) {
- AddFilter(AUDIO_RENDERER, filter);
+void FilterCollection::AddAudioRenderer(AudioRenderer* audio_renderer) {
+ audio_renderers_.push_back(audio_renderer);
}
-void FilterCollection::AddVideoRenderer(VideoRenderer* filter) {
- AddFilter(VIDEO_RENDERER, filter);
+void FilterCollection::AddVideoRenderer(VideoRenderer* video_renderer) {
+ video_renderers_.push_back(video_renderer);
}
bool FilterCollection::IsEmpty() const {
- return filters_.empty() && audio_decoders_.empty() && video_decoders_.empty();
+ return audio_decoders_.empty() &&
+ video_decoders_.empty() &&
+ audio_renderers_.empty() &&
+ video_renderers_.empty();
}
void FilterCollection::Clear() {
- filters_.clear();
audio_decoders_.clear();
+ video_decoders_.clear();
+ audio_renderers_.clear();
+ video_renderers_.clear();
}
void FilterCollection::SelectAudioDecoder(scoped_refptr<AudioDecoder>* out) {
@@ -65,43 +73,22 @@ void FilterCollection::SelectVideoDecoder(scoped_refptr<VideoDecoder>* out) {
video_decoders_.pop_front();
}
-void FilterCollection::SelectAudioRenderer(
- scoped_refptr<AudioRenderer>* filter_out) {
- SelectFilter<AUDIO_RENDERER>(filter_out);
-}
-
-void FilterCollection::SelectVideoRenderer(
- scoped_refptr<VideoRenderer>* filter_out) {
- SelectFilter<VIDEO_RENDERER>(filter_out);
-}
-
-void FilterCollection::AddFilter(FilterType filter_type,
- Filter* filter) {
- filters_.push_back(FilterListElement(filter_type, filter));
-}
-
-template<FilterCollection::FilterType filter_type, typename F>
-void FilterCollection::SelectFilter(scoped_refptr<F>* filter_out) {
- scoped_refptr<Filter> filter;
- SelectFilter(filter_type, &filter);
- *filter_out = reinterpret_cast<F*>(filter.get());
-}
-
-void FilterCollection::SelectFilter(
- FilterType filter_type,
- scoped_refptr<Filter>* filter_out) {
-
- FilterList::iterator it = filters_.begin();
- while (it != filters_.end()) {
- if (it->first == filter_type)
- break;
- ++it;
+void FilterCollection::SelectAudioRenderer(scoped_refptr<AudioRenderer>* out) {
+ if (audio_renderers_.empty()) {
+ *out = NULL;
+ return;
}
+ *out = audio_renderers_.front();
+ audio_renderers_.pop_front();
+}
- if (it != filters_.end()) {
- *filter_out = it->second.get();
- filters_.erase(it);
+void FilterCollection::SelectVideoRenderer(scoped_refptr<VideoRenderer>* out) {
+ if (video_renderers_.empty()) {
+ *out = NULL;
+ return;
}
+ *out = video_renderers_.front();
+ video_renderers_.pop_front();
}
} // namespace media
diff --git a/media/base/filter_collection.h b/media/base/filter_collection.h
index 0f5e320..d96589b 100644
--- a/media/base/filter_collection.h
+++ b/media/base/filter_collection.h
@@ -8,13 +8,15 @@
#include <list>
#include "base/memory/ref_counted.h"
-#include "media/base/demuxer.h"
-#include "media/base/filters.h"
+#include "media/base/media_export.h"
namespace media {
class AudioDecoder;
+class AudioRenderer;
+class Demuxer;
class VideoDecoder;
+class VideoRenderer;
// This is a collection of Filter objects used to form a media playback
// pipeline. See src/media/base/pipeline.h for more information.
@@ -30,8 +32,8 @@ class MEDIA_EXPORT FilterCollection {
// Adds a filter to the collection.
void AddAudioDecoder(AudioDecoder* audio_decoder);
void AddVideoDecoder(VideoDecoder* video_decoder);
- void AddAudioRenderer(AudioRenderer* filter);
- void AddVideoRenderer(VideoRenderer* filter);
+ void AddAudioRenderer(AudioRenderer* audio_renderer);
+ void AddVideoRenderer(VideoRenderer* video_renderer);
// Is the collection empty?
bool IsEmpty() const;
@@ -45,36 +47,15 @@ class MEDIA_EXPORT FilterCollection {
// Filters are selected in FIFO order.
void SelectAudioDecoder(scoped_refptr<AudioDecoder>* out);
void SelectVideoDecoder(scoped_refptr<VideoDecoder>* out);
- void SelectAudioRenderer(scoped_refptr<AudioRenderer>* filter_out);
- void SelectVideoRenderer(scoped_refptr<VideoRenderer>* filter_out);
+ void SelectAudioRenderer(scoped_refptr<AudioRenderer>* out);
+ void SelectVideoRenderer(scoped_refptr<VideoRenderer>* 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 {
- AUDIO_RENDERER,
- VIDEO_RENDERER,
- };
-
- // List of filters managed by this collection.
- typedef std::pair<FilterType, scoped_refptr<Filter> > FilterListElement;
- typedef std::list<FilterListElement> FilterList;
- FilterList filters_;
scoped_refptr<Demuxer> demuxer_;
std::list<scoped_refptr<AudioDecoder> > audio_decoders_;
std::list<scoped_refptr<VideoDecoder> > video_decoders_;
-
- // Helper function that adds a filter to the filter list.
- void AddFilter(FilterType filter_type, Filter* filter);
-
- // Helper function for SelectXXX() methods. It manages the
- // downcasting and mapping between FilterType and Filter class.
- template<FilterType filter_type, typename F>
- void SelectFilter(scoped_refptr<F>* filter_out);
-
- // Helper function that searches the filters list for a specific filter type.
- void SelectFilter(FilterType filter_type, scoped_refptr<Filter>* filter_out);
+ std::list<scoped_refptr<AudioRenderer> > audio_renderers_;
+ std::list<scoped_refptr<VideoRenderer> > video_renderers_;
DISALLOW_COPY_AND_ASSIGN(FilterCollection);
};
diff --git a/media/base/filters.h b/media/base/filters.h
index 0660663..4b37bd1 100644
--- a/media/base/filters.h
+++ b/media/base/filters.h
@@ -23,25 +23,15 @@
#ifndef MEDIA_BASE_FILTERS_H_
#define MEDIA_BASE_FILTERS_H_
-#include <limits>
-#include <string>
-
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/time.h"
#include "media/base/media_export.h"
#include "media/base/pipeline_status.h"
-#include "media/base/video_frame.h"
namespace media {
-class AudioDecoder;
-class Buffer;
-class Decoder;
-class DemuxerStream;
-class Filter;
class FilterHost;
-class VideoDecoder;
class MEDIA_EXPORT Filter : public base::RefCountedThreadSafe<Filter> {
public:
@@ -105,61 +95,6 @@ class MEDIA_EXPORT Filter : public base::RefCountedThreadSafe<Filter> {
DISALLOW_COPY_AND_ASSIGN(Filter);
};
-class MEDIA_EXPORT VideoRenderer : public Filter {
- public:
- // Used to update the pipeline's clock time. The parameter is the time that
- // the clock should not exceed.
- typedef base::Callback<void(base::TimeDelta)> TimeCB;
-
- // Initialize a VideoRenderer with the given VideoDecoder, executing the
- // callback upon completion.
- virtual void Initialize(const scoped_refptr<VideoDecoder>& decoder,
- const PipelineStatusCB& status_cb,
- const StatisticsCB& statistics_cb,
- const TimeCB& time_cb) = 0;
-
- // Returns true if this filter has received and processed an end-of-stream
- // buffer.
- virtual bool HasEnded() = 0;
-
- protected:
- virtual ~VideoRenderer() {}
-};
-
-class MEDIA_EXPORT AudioRenderer : public Filter {
- public:
- // Used to update the pipeline's clock time. The first parameter is the
- // current time, and the second parameter is the time that the clock must not
- // exceed.
- typedef base::Callback<void(base::TimeDelta, base::TimeDelta)> TimeCB;
-
- // Initialize a AudioRenderer with the given AudioDecoder, executing the
- // |init_cb| upon completion. |underflow_cb| is called when the
- // renderer runs out of data to pass to the audio card during playback.
- // If the |underflow_cb| is called ResumeAfterUnderflow() must be called
- // to resume playback. Pause(), Seek(), or Stop() cancels the underflow
- // condition.
- virtual void Initialize(const scoped_refptr<AudioDecoder>& decoder,
- const PipelineStatusCB& init_cb,
- const base::Closure& underflow_cb,
- const TimeCB& time_cb) = 0;
-
- // Returns true if this filter has received and processed an end-of-stream
- // buffer.
- virtual bool HasEnded() = 0;
-
- // Sets the output volume.
- virtual void SetVolume(float volume) = 0;
-
- // Resumes playback after underflow occurs.
- // |buffer_more_audio| is set to true if you want to increase the size of the
- // decoded audio buffer.
- virtual void ResumeAfterUnderflow(bool buffer_more_audio) = 0;
-
- protected:
- virtual ~AudioRenderer() {}
-};
-
} // namespace media
#endif // MEDIA_BASE_FILTERS_H_
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 32b2333..626392c 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -17,6 +17,7 @@
#include "base/callback.h"
#include "media/base/audio_decoder.h"
#include "media/base/audio_decoder_config.h"
+#include "media/base/audio_renderer.h"
#include "media/base/demuxer.h"
#include "media/base/filters.h"
#include "media/base/filter_collection.h"
@@ -24,6 +25,7 @@
#include "media/base/video_decoder.h"
#include "media/base/video_decoder_config.h"
#include "media/base/video_frame.h"
+#include "media/base/video_renderer.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace media {
diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc
index 623cecf..607cf8c 100644
--- a/media/base/pipeline.cc
+++ b/media/base/pipeline.cc
@@ -16,12 +16,13 @@
#include "base/string_util.h"
#include "base/synchronization/condition_variable.h"
#include "media/base/audio_decoder.h"
+#include "media/base/audio_renderer.h"
#include "media/base/clock.h"
#include "media/base/composite_filter.h"
#include "media/base/filter_collection.h"
-#include "media/base/filters.h"
#include "media/base/media_log.h"
#include "media/base/video_decoder.h"
+#include "media/base/video_renderer.h"
namespace media {
@@ -61,6 +62,8 @@ media::PipelineStatus PipelineStatusNotification::status() {
struct Pipeline::PipelineInitState {
scoped_refptr<AudioDecoder> audio_decoder;
scoped_refptr<VideoDecoder> video_decoder;
+ scoped_refptr<AudioRenderer> audio_renderer;
+ scoped_refptr<VideoRenderer> video_renderer;
scoped_refptr<CompositeFilter> composite;
};
@@ -1117,20 +1120,23 @@ bool Pipeline::InitializeAudioRenderer(
if (!decoder)
return false;
- filter_collection_->SelectAudioRenderer(&audio_renderer_);
- if (!audio_renderer_) {
+ filter_collection_->SelectAudioRenderer(
+ &pipeline_init_state_->audio_renderer);
+ if (!pipeline_init_state_->audio_renderer) {
SetError(PIPELINE_ERROR_REQUIRED_FILTER_MISSING);
return false;
}
- pipeline_init_state_->composite->AddFilter(audio_renderer_);
+ pipeline_init_state_->composite->AddFilter(
+ pipeline_init_state_->audio_renderer);
- audio_renderer_->Initialize(
+ pipeline_init_state_->audio_renderer->Initialize(
decoder,
base::Bind(&Pipeline::OnFilterInitialize, this),
base::Bind(&Pipeline::OnAudioUnderflow, this),
base::Bind(&Pipeline::OnAudioTimeUpdate, this));
+ audio_renderer_ = pipeline_init_state_->audio_renderer;
return true;
}
@@ -1142,19 +1148,23 @@ bool Pipeline::InitializeVideoRenderer(
if (!decoder)
return false;
- filter_collection_->SelectVideoRenderer(&video_renderer_);
- if (!video_renderer_) {
+ filter_collection_->SelectVideoRenderer(
+ &pipeline_init_state_->video_renderer);
+ if (!pipeline_init_state_->video_renderer) {
SetError(PIPELINE_ERROR_REQUIRED_FILTER_MISSING);
return false;
}
- pipeline_init_state_->composite->AddFilter(video_renderer_);
+ pipeline_init_state_->composite->AddFilter(
+ pipeline_init_state_->video_renderer);
- video_renderer_->Initialize(
+ pipeline_init_state_->video_renderer->Initialize(
decoder,
base::Bind(&Pipeline::OnFilterInitialize, this),
base::Bind(&Pipeline::OnUpdateStatistics, this),
base::Bind(&Pipeline::OnVideoTimeUpdate, this));
+
+ video_renderer_ = pipeline_init_state_->video_renderer;
return true;
}
diff --git a/media/filters/audio_renderer_impl.h b/media/filters/audio_renderer_impl.h
index b3c014f..29fc7ce 100644
--- a/media/filters/audio_renderer_impl.h
+++ b/media/filters/audio_renderer_impl.h
@@ -24,9 +24,9 @@
#include "base/synchronization/lock.h"
#include "media/base/audio_decoder.h"
+#include "media/base/audio_renderer.h"
#include "media/base/audio_renderer_sink.h"
#include "media/base/buffers.h"
-#include "media/base/filters.h"
#include "media/filters/audio_renderer_algorithm.h"
namespace media {
diff --git a/media/filters/video_renderer_base.h b/media/filters/video_renderer_base.h
index 983f310..9197b51 100644
--- a/media/filters/video_renderer_base.h
+++ b/media/filters/video_renderer_base.h
@@ -11,10 +11,10 @@
#include "base/synchronization/condition_variable.h"
#include "base/synchronization/lock.h"
#include "base/threading/platform_thread.h"
-#include "media/base/filters.h"
#include "media/base/pipeline_status.h"
#include "media/base/video_decoder.h"
#include "media/base/video_frame.h"
+#include "media/base/video_renderer.h"
namespace media {
diff --git a/media/media.gyp b/media/media.gyp
index f69d300..7d9b4eb 100644
--- a/media/media.gyp
+++ b/media/media.gyp
@@ -125,6 +125,7 @@
'base/audio_decoder.h',
'base/audio_decoder_config.cc',
'base/audio_decoder_config.h',
+ 'base/audio_renderer.h',
'base/bitstream_buffer.h',
'base/buffers.cc',
'base/buffers.h',
@@ -185,6 +186,7 @@
'base/video_decoder_config.h',
'base/video_frame.cc',
'base/video_frame.h',
+ 'base/video_renderer.h',
'base/video_util.cc',
'base/video_util.h',
'crypto/aes_decryptor.cc',