diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-06 02:23:25 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-06 02:23:25 +0000 |
commit | c1330c817f4c1988bef0da16f0a96a3e1c4a63d5 (patch) | |
tree | 6979ebdeff26e9bc876ac8eb6d88914f93337623 /webkit | |
parent | db1b011b3d7de715c424a374655420780fbc2daf (diff) | |
download | chromium_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.cc | 30 | ||||
-rw-r--r-- | webkit/mocks/test_media_stream_client.h | 14 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_impl.cc | 30 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_impl.h | 2 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_params.cc | 7 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_params.h | 13 | ||||
-rw-r--r-- | webkit/support/webkit_support.cc | 11 |
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, |