diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-10 20:47:13 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-10 20:47:13 +0000 |
commit | fb49c9e221dd702608210c19c98556467cd36400 (patch) | |
tree | a5bf2380b83d39109ebbc132fccb951dcb98c5fd /webkit/media | |
parent | d7867f32ddeb1118191871e2a7cec81bfd9766ad (diff) | |
download | chromium_src-fb49c9e221dd702608210c19c98556467cd36400.zip chromium_src-fb49c9e221dd702608210c19c98556467cd36400.tar.gz chromium_src-fb49c9e221dd702608210c19c98556467cd36400.tar.bz2 |
Use a shared thread for media operations.
This reduces the number of threads created per media element by one.
BUG=61293
R=acolwell@chromium.org, jamesr@chromium.org, jochen@chromium.org
Review URL: https://codereview.chromium.org/15005005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@199531 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/media')
-rw-r--r-- | webkit/media/webmediaplayer_impl.cc | 30 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_impl.h | 2 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_params.cc | 6 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_params.h | 13 |
4 files changed, 29 insertions, 22 deletions
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc index 41fd0b3..43880cb 100644 --- a/webkit/media/webmediaplayer_impl.cc +++ b/webkit/media/webmediaplayer_impl.cc @@ -128,7 +128,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( network_state_(WebMediaPlayer::NetworkStateEmpty), ready_state_(WebMediaPlayer::ReadyStateHaveNothing), main_loop_(base::MessageLoopProxy::current()), - media_thread_("MediaPipeline"), + media_loop_(params.message_loop_proxy()), paused_(true), seeking_(false), playback_rate_(0.0f), @@ -150,9 +150,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( media_log_->AddEvent( media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); - CHECK(media_thread_.Start()); - pipeline_.reset(new media::Pipeline( - media_thread_.message_loop_proxy(), media_log_)); + pipeline_.reset(new media::Pipeline(media_loop_, media_log_)); // Let V8 know we started new thread if we did not do it yet. // Made separate task to avoid deletion of player currently being created. @@ -181,7 +179,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( // Use the null sink if no sink was provided. audio_source_provider_ = new WebAudioSourceProviderImpl( params.audio_renderer_sink() ? params.audio_renderer_sink() : - new media::NullAudioSink(media_thread_.message_loop_proxy())); + new media::NullAudioSink(media_loop_)); } WebMediaPlayerImpl::~WebMediaPlayerImpl() { @@ -1072,7 +1070,7 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) { DCHECK(data_source_); demuxer_.reset(new media::FFmpegDemuxer( - media_thread_.message_loop_proxy(), data_source_.get(), + media_loop_, data_source_.get(), BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""))); } else { DCHECK(!chunk_demuxer_); @@ -1104,15 +1102,13 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) { // Create our audio decoders and renderer. ScopedVector<media::AudioDecoder> audio_decoders; - audio_decoders.push_back(new media::FFmpegAudioDecoder( - media_thread_.message_loop_proxy())); + audio_decoders.push_back(new media::FFmpegAudioDecoder(media_loop_)); if (cmd_line->HasSwitch(switches::kEnableOpusPlayback)) { - audio_decoders.push_back(new media::OpusAudioDecoder( - media_thread_.message_loop_proxy())); + audio_decoders.push_back(new media::OpusAudioDecoder(media_loop_)); } scoped_ptr<media::AudioRenderer> audio_renderer( - new media::AudioRendererImpl(media_thread_.message_loop_proxy(), + new media::AudioRendererImpl(media_loop_, audio_source_provider_, audio_decoders.Pass(), set_decryptor_ready_cb)); @@ -1123,7 +1119,7 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) { if (gpu_factories_) { video_decoders.push_back(new media::GpuVideoDecoder( - media_thread_.message_loop_proxy(), gpu_factories_)); + media_loop_, gpu_factories_)); } // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released @@ -1131,17 +1127,15 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) { #if !defined(MEDIA_DISABLE_LIBVPX) if (cmd_line->HasSwitch(switches::kEnableVp9Playback) || cmd_line->HasSwitch(switches::kEnableVp8AlphaPlayback)) { - video_decoders.push_back(new media::VpxVideoDecoder( - media_thread_.message_loop_proxy())); + video_decoders.push_back(new media::VpxVideoDecoder(media_loop_)); } #endif // !defined(MEDIA_DISABLE_LIBVPX) - video_decoders.push_back(new media::FFmpegVideoDecoder( - media_thread_.message_loop_proxy())); + video_decoders.push_back(new media::FFmpegVideoDecoder(media_loop_)); scoped_ptr<media::VideoRenderer> video_renderer( new media::VideoRendererBase( - media_thread_.message_loop_proxy(), + media_loop_, video_decoders.Pass(), set_decryptor_ready_cb, base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), @@ -1211,8 +1205,6 @@ void WebMediaPlayerImpl::Destroy() { incremented_externally_allocated_memory_ = false; } - media_thread_.Stop(); - // Release any final references now that everything has stopped. pipeline_.reset(); demuxer_.reset(); diff --git a/webkit/media/webmediaplayer_impl.h b/webkit/media/webmediaplayer_impl.h index 3772a8b..16944ae 100644 --- a/webkit/media/webmediaplayer_impl.h +++ b/webkit/media/webmediaplayer_impl.h @@ -280,7 +280,7 @@ class WebMediaPlayerImpl const scoped_refptr<base::MessageLoopProxy> main_loop_; scoped_ptr<media::Pipeline> pipeline_; - base::Thread media_thread_; + scoped_refptr<base::MessageLoopProxy> media_loop_; // The currently selected key system. Empty string means that no key system // has been selected. diff --git a/webkit/media/webmediaplayer_params.cc b/webkit/media/webmediaplayer_params.cc index 6f013b6..4c0f74e 100644 --- a/webkit/media/webmediaplayer_params.cc +++ b/webkit/media/webmediaplayer_params.cc @@ -4,18 +4,22 @@ #include "webkit/media/webmediaplayer_params.h" +#include "base/message_loop_proxy.h" #include "media/base/audio_renderer_sink.h" #include "media/base/media_log.h" namespace webkit_media { WebMediaPlayerParams::WebMediaPlayerParams( + const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy, const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink, const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories, const scoped_refptr<media::MediaLog>& media_log) - : audio_renderer_sink_(audio_renderer_sink), + : message_loop_proxy_(message_loop_proxy), + audio_renderer_sink_(audio_renderer_sink), gpu_factories_(gpu_factories), media_log_(media_log) { + DCHECK(message_loop_proxy); DCHECK(media_log_); } diff --git a/webkit/media/webmediaplayer_params.h b/webkit/media/webmediaplayer_params.h index 5fb2de9..d9a2244 100644 --- a/webkit/media/webmediaplayer_params.h +++ b/webkit/media/webmediaplayer_params.h @@ -8,6 +8,10 @@ #include "base/memory/ref_counted.h" #include "media/filters/gpu_video_decoder.h" +namespace base { +class MessageLoopProxy; +} + namespace media { class AudioRendererSink; class MediaLog; @@ -19,13 +23,19 @@ namespace webkit_media { // to plumb arguments through various abstraction layers. class WebMediaPlayerParams { public: - // |media_log| is the only required parameter; all others may be null. + // |message_loop_proxy| and |media_log| are the only required parameters; + // all others may be null. WebMediaPlayerParams( + const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy, const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink, const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories, const scoped_refptr<media::MediaLog>& media_log); ~WebMediaPlayerParams(); + const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy() const { + return message_loop_proxy_; + } + const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink() const { return audio_renderer_sink_; } @@ -40,6 +50,7 @@ class WebMediaPlayerParams { } private: + scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; scoped_refptr<media::AudioRendererSink> audio_renderer_sink_; scoped_refptr<media::GpuVideoDecoder::Factories> gpu_factories_; scoped_refptr<media::MediaLog> media_log_; |