summaryrefslogtreecommitdiffstats
path: root/webkit/media
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-10 20:47:13 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-10 20:47:13 +0000
commitfb49c9e221dd702608210c19c98556467cd36400 (patch)
treea5bf2380b83d39109ebbc132fccb951dcb98c5fd /webkit/media
parentd7867f32ddeb1118191871e2a7cec81bfd9766ad (diff)
downloadchromium_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.cc30
-rw-r--r--webkit/media/webmediaplayer_impl.h2
-rw-r--r--webkit/media/webmediaplayer_params.cc6
-rw-r--r--webkit/media/webmediaplayer_params.h13
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_;