summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-06 02:23:25 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-06 02:23:25 +0000
commitc1330c817f4c1988bef0da16f0a96a3e1c4a63d5 (patch)
tree6979ebdeff26e9bc876ac8eb6d88914f93337623 /webkit
parentdb1b011b3d7de715c424a374655420780fbc2daf (diff)
downloadchromium_src-c1330c817f4c1988bef0da16f0a96a3e1c4a63d5.zip
chromium_src-c1330c817f4c1988bef0da16f0a96a3e1c4a63d5.tar.gz
chromium_src-c1330c817f4c1988bef0da16f0a96a3e1c4a63d5.tar.bz2
Reland: Use a shared thread for media operations (round 3).
This reduces the number of threads created per media element by one. TBR=jamesr,jochen BUG=61293 Review URL: https://chromiumcodereview.appspot.com/15993018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204386 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r--webkit/mocks/test_media_stream_client.cc30
-rw-r--r--webkit/mocks/test_media_stream_client.h14
-rw-r--r--webkit/renderer/media/webmediaplayer_impl.cc30
-rw-r--r--webkit/renderer/media/webmediaplayer_impl.h2
-rw-r--r--webkit/renderer/media/webmediaplayer_params.cc7
-rw-r--r--webkit/renderer/media/webmediaplayer_params.h13
-rw-r--r--webkit/support/webkit_support.cc11
7 files changed, 40 insertions, 67 deletions
diff --git a/webkit/mocks/test_media_stream_client.cc b/webkit/mocks/test_media_stream_client.cc
index 632f6b39..3065612 100644
--- a/webkit/mocks/test_media_stream_client.cc
+++ b/webkit/mocks/test_media_stream_client.cc
@@ -13,9 +13,6 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaStreamRegistry.h"
#include "webkit/renderer/media/media_stream_audio_renderer.h"
#include "webkit/renderer/media/simple_video_frame_provider.h"
-#include "webkit/renderer/media/webmediaplayer_impl.h"
-#include "webkit/renderer/media/webmediaplayer_ms.h"
-#include "webkit/renderer/media/webmediaplayer_params.h"
using namespace WebKit;
@@ -43,33 +40,6 @@ bool IsMockMediaStreamWithVideo(const WebURL& url) {
namespace webkit_glue {
-WebKit::WebMediaPlayer* CreateMediaPlayer(
- WebFrame* frame,
- const WebURL& url,
- WebMediaPlayerClient* client,
- webkit_media::MediaStreamClient* media_stream_client) {
- if (media_stream_client && media_stream_client->IsMediaStream(url)) {
- return new webkit_media::WebMediaPlayerMS(
- frame,
- client,
- base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(),
- media_stream_client,
- new media::MediaLog());
- }
-
-#if defined(OS_ANDROID)
- return NULL;
-#else
- webkit_media::WebMediaPlayerParams params(
- NULL, NULL, new media::MediaLog());
- return new webkit_media::WebMediaPlayerImpl(
- frame,
- client,
- base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(),
- params);
-#endif
-}
-
TestMediaStreamClient::TestMediaStreamClient() {}
TestMediaStreamClient::~TestMediaStreamClient() {}
diff --git a/webkit/mocks/test_media_stream_client.h b/webkit/mocks/test_media_stream_client.h
index b759f49..60fa4aa 100644
--- a/webkit/mocks/test_media_stream_client.h
+++ b/webkit/mocks/test_media_stream_client.h
@@ -13,26 +13,12 @@
#include "third_party/WebKit/public/platform/WebURL.h"
#include "webkit/renderer/media/media_stream_client.h"
-namespace WebKit {
-class WebFrame;
-class WebMediaPlayer;
-class WebMediaPlayerClient;
-}
-
namespace webkit_media {
class MediaStreamAudioRenderer;
-class MediaStreamClient;
}
namespace webkit_glue {
-// This is used by WebFrameClient::createMediaPlayer().
-WebKit::WebMediaPlayer* CreateMediaPlayer(
- WebKit::WebFrame* frame,
- const WebKit::WebURL& url,
- WebKit::WebMediaPlayerClient* client,
- webkit_media::MediaStreamClient* media_stream_client);
-
class TestMediaStreamClient : public webkit_media::MediaStreamClient {
public:
TestMediaStreamClient();
diff --git a/webkit/renderer/media/webmediaplayer_impl.cc b/webkit/renderer/media/webmediaplayer_impl.cc
index fb78842..13d8b52 100644
--- a/webkit/renderer/media/webmediaplayer_impl.cc
+++ b/webkit/renderer/media/webmediaplayer_impl.cc
@@ -130,7 +130,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),
@@ -153,9 +153,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_.get()));
+ 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.
@@ -185,7 +183,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
audio_source_provider_ = new WebAudioSourceProviderImpl(
params.audio_renderer_sink().get()
? params.audio_renderer_sink()
- : new media::NullAudioSink(media_thread_.message_loop_proxy()));
+ : new media::NullAudioSink(media_loop_));
}
WebMediaPlayerImpl::~WebMediaPlayerImpl() {
@@ -1061,7 +1059,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_);
@@ -1100,15 +1098,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_.get(),
audio_decoders.Pass(),
set_decryptor_ready_cb,
@@ -1120,7 +1116,7 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) {
if (gpu_factories_.get()) {
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
@@ -1128,17 +1124,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)),
@@ -1208,8 +1202,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/renderer/media/webmediaplayer_impl.h b/webkit/renderer/media/webmediaplayer_impl.h
index 04c0fb4..0049369 100644
--- a/webkit/renderer/media/webmediaplayer_impl.h
+++ b/webkit/renderer/media/webmediaplayer_impl.h
@@ -287,7 +287,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/renderer/media/webmediaplayer_params.cc b/webkit/renderer/media/webmediaplayer_params.cc
index 7c6335a..91769d8 100644
--- a/webkit/renderer/media/webmediaplayer_params.cc
+++ b/webkit/renderer/media/webmediaplayer_params.cc
@@ -4,19 +4,22 @@
#include "webkit/renderer/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(media_log_.get());
+ DCHECK(media_log_);
}
WebMediaPlayerParams::~WebMediaPlayerParams() {}
diff --git a/webkit/renderer/media/webmediaplayer_params.h b/webkit/renderer/media/webmediaplayer_params.h
index 893cae7..62a5ce1 100644
--- a/webkit/renderer/media/webmediaplayer_params.h
+++ b/webkit/renderer/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_;
diff --git a/webkit/support/webkit_support.cc b/webkit/support/webkit_support.cc
index ba537a8..51997ec 100644
--- a/webkit/support/webkit_support.cc
+++ b/webkit/support/webkit_support.cc
@@ -206,6 +206,14 @@ class TestEnvironment {
}
#endif
+ scoped_refptr<base::MessageLoopProxy> GetMediaThreadMessageLoopProxy() {
+ if (!media_thread_) {
+ media_thread_.reset(new base::Thread("Media"));
+ CHECK(media_thread_->Start());
+ }
+ return media_thread_->message_loop_proxy();
+ }
+
private:
// Data member at_exit_manager_ will take the ownership of the input
// AtExitManager and manage its lifecycle.
@@ -213,6 +221,8 @@ class TestEnvironment {
scoped_ptr<MessageLoopType> main_message_loop_;
scoped_ptr<TestWebKitPlatformSupport> webkit_platform_support_;
+ scoped_ptr<base::Thread> media_thread_;
+
#if defined(OS_ANDROID)
base::FilePath mock_current_directory_;
#endif
@@ -404,6 +414,7 @@ WebKit::WebMediaPlayer* CreateMediaPlayer(
return NULL;
#else
webkit_media::WebMediaPlayerParams params(
+ test_environment->GetMediaThreadMessageLoopProxy(),
NULL, NULL, new media::MediaLog());
return new webkit_media::WebMediaPlayerImpl(
frame,