diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-31 20:52:24 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-31 20:52:24 +0000 |
commit | f9ac67759c31da2ed8e1d8e2e2295908451a63c5 (patch) | |
tree | 9dca6a587d45283c2776dc2827fa967fe535518c | |
parent | 39407f7216e7a09375776be3e074549094a8adf2 (diff) | |
download | chromium_src-f9ac67759c31da2ed8e1d8e2e2295908451a63c5.zip chromium_src-f9ac67759c31da2ed8e1d8e2e2295908451a63c5.tar.gz chromium_src-f9ac67759c31da2ed8e1d8e2e2295908451a63c5.tar.bz2 |
Revert 203429 "Reland: Use a shared thread for media operations."
> Reland: Use a shared thread for media operations.
>
> This reduces the number of threads created per media element by one.
>
> BUG=61293
> TBR=acolwell, jamesr, jochen
>
> Review URL: https://codereview.chromium.org/15649017
It's still causing some memory corruption.
TBR=scherkus@chromium.org
Review URL: https://codereview.chromium.org/16266006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@203470 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/public/test/layouttest_support.h | 11 | ||||
-rw-r--r-- | content/renderer/render_thread_impl.cc | 10 | ||||
-rw-r--r-- | content/renderer/render_thread_impl.h | 8 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 1 | ||||
-rw-r--r-- | content/shell/renderer/DEPS | 3 | ||||
-rw-r--r-- | content/shell/renderer/webkit_test_runner.cc | 29 | ||||
-rw-r--r-- | content/test/layouttest_support.cc | 4 | ||||
-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 | 6 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_params.h | 13 | ||||
-rw-r--r-- | webkit/support/webkit_support.cc | 11 |
14 files changed, 68 insertions, 104 deletions
diff --git a/content/public/test/layouttest_support.h b/content/public/test/layouttest_support.h index 21a34503..ed490ec 100644 --- a/content/public/test/layouttest_support.h +++ b/content/public/test/layouttest_support.h @@ -6,7 +6,6 @@ #define CONTENT_PUBLIC_TEST_LAYOUTTEST_SUPPORT_H_ #include "base/callback_forward.h" -#include "base/memory/ref_counted.h" namespace WebKit { class WebGamepads; @@ -17,10 +16,6 @@ namespace WebTestRunner { class WebTestProxyBase; } -namespace base { -class MessageLoopProxy; -} - namespace content { class RenderView; @@ -69,12 +64,6 @@ void EnableAutoResizeMode(RenderView* render_view, void DisableAutoResizeMode(RenderView* render_view, const WebKit::WebSize& new_size); -// Return the thread on which media operations should run. -// -// TODO(scherkus): We should be using RenderViewImpl::createMediaPlayer(), see -// http://crbug.com/239826 -scoped_refptr<base::MessageLoopProxy> GetMediaThreadMessageLoopProxy(); - } // namespace content #endif // CONTENT_PUBLIC_TEST_LAYOUTTEST_SUPPORT_H_ diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index b83ec91..386e442 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -1329,16 +1329,6 @@ RenderThreadImpl::GetFileThreadMessageLoopProxy() { return file_thread_->message_loop_proxy(); } -scoped_refptr<base::MessageLoopProxy> -RenderThreadImpl::GetMediaThreadMessageLoopProxy() { - DCHECK(message_loop() == MessageLoop::current()); - if (!media_thread_) { - media_thread_.reset(new base::Thread("Media")); - media_thread_->Start(); - } - return media_thread_->message_loop_proxy(); -} - void RenderThreadImpl::SetFlingCurveParameters( const std::vector<float>& new_touchpad, const std::vector<float>& new_touchscreen) { diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index abdc4d6..a7d615b 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h @@ -263,11 +263,6 @@ class CONTENT_EXPORT RenderThreadImpl : public RenderThread, // on the renderer's main thread. scoped_refptr<base::MessageLoopProxy> GetFileThreadMessageLoopProxy(); - // Returns a MessageLoopProxy instance corresponding to the message loop - // of the thread on which media operations should be run. Must be called - // on the renderer's main thread. - scoped_refptr<base::MessageLoopProxy> GetMediaThreadMessageLoopProxy(); - // Causes the idle handler to skip sending idle notifications // on the two next scheduled calls, so idle notifications are // not sent for at least one notification delay. @@ -438,9 +433,6 @@ class CONTENT_EXPORT RenderThreadImpl : public RenderThread, // May be null if overridden by ContentRendererClient. scoped_ptr<base::Thread> compositor_thread_; - // Thread for running multimedia operations (e.g., video decoding). - scoped_ptr<base::Thread> media_thread_; - // Will point to appropriate MessageLoopProxy after initialization, // regardless of whether |compositor_thread_| is overriden. scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy_; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index a51c5a2..2a8fc58 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -2837,7 +2837,6 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( } webkit_media::WebMediaPlayerParams params( - RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), sink, gpu_factories, new RenderMediaLog()); WebMediaPlayer* media_player = GetContentClient()->renderer()->OverrideCreateWebMediaPlayer( diff --git a/content/shell/renderer/DEPS b/content/shell/renderer/DEPS deleted file mode 100644 index 47de12f..0000000 --- a/content/shell/renderer/DEPS +++ /dev/null @@ -1,3 +0,0 @@ -include_rules = [ - "+media/base", # For media::MediaLog. -] diff --git a/content/shell/renderer/webkit_test_runner.cc b/content/shell/renderer/webkit_test_runner.cc index 707440d..aa98a2d 100644 --- a/content/shell/renderer/webkit_test_runner.cc +++ b/content/shell/renderer/webkit_test_runner.cc @@ -25,7 +25,6 @@ #include "content/shell/common/shell_messages.h" #include "content/shell/common/webkit_test_helpers.h" #include "content/shell/renderer/shell_render_process_observer.h" -#include "media/base/media_log.h" #include "net/base/net_errors.h" #include "net/base/net_util.h" #include "skia/ext/platform_canvas.h" @@ -61,9 +60,6 @@ #include "webkit/common/webpreferences.h" #include "webkit/glue/webkit_glue.h" #include "webkit/mocks/test_media_stream_client.h" -#include "webkit/renderer/media/webmediaplayer_impl.h" -#include "webkit/renderer/media/webmediaplayer_ms.h" -#include "webkit/renderer/media/webmediaplayer_params.h" using WebKit::Platform; using WebKit::WebArrayBufferView; @@ -539,29 +535,8 @@ WebMediaPlayer* WebKitTestRunner::createWebMediaPlayer( test_media_stream_client_.reset( new webkit_glue::TestMediaStreamClient()); } - - if (test_media_stream_client_->IsMediaStream(url)) { - return new webkit_media::WebMediaPlayerMS( - frame, - client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(), - test_media_stream_client_.get(), - new media::MediaLog()); - } - -#if defined(OS_ANDROID) - return NULL; -#else - // TODO(scherkus): Use RenderViewImpl::createMediaPlayer() instead of - // duplicating code here, see http://crbug.com/239826 - webkit_media::WebMediaPlayerParams params( - GetMediaThreadMessageLoopProxy(), NULL, NULL, new media::MediaLog()); - return new webkit_media::WebMediaPlayerImpl( - frame, - client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(), - params); -#endif + return webkit_glue::CreateMediaPlayer( + frame, url, client, test_media_stream_client_.get()); } // RenderViewObserver -------------------------------------------------------- diff --git a/content/test/layouttest_support.cc b/content/test/layouttest_support.cc index 15251ed..100ce3d 100644 --- a/content/test/layouttest_support.cc +++ b/content/test/layouttest_support.cc @@ -111,8 +111,4 @@ void DisableAutoResizeMode(RenderView* render_view, const WebSize& new_size) { ->DisableAutoResizeForTesting(new_size); } -scoped_refptr<base::MessageLoopProxy> GetMediaThreadMessageLoopProxy() { - return RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(); -} - } // namespace content diff --git a/webkit/mocks/test_media_stream_client.cc b/webkit/mocks/test_media_stream_client.cc index 3065612..632f6b39 100644 --- a/webkit/mocks/test_media_stream_client.cc +++ b/webkit/mocks/test_media_stream_client.cc @@ -13,6 +13,9 @@ #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; @@ -40,6 +43,33 @@ 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 60fa4aa..b759f49 100644 --- a/webkit/mocks/test_media_stream_client.h +++ b/webkit/mocks/test_media_stream_client.h @@ -13,12 +13,26 @@ #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 2f06d8a..d277105 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_loop_(params.message_loop_proxy()), + media_thread_("MediaPipeline"), paused_(true), seeking_(false), playback_rate_(0.0f), @@ -153,7 +153,9 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( media_log_->AddEvent( media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); - pipeline_.reset(new media::Pipeline(media_loop_, media_log_)); + CHECK(media_thread_.Start()); + pipeline_.reset(new media::Pipeline( + media_thread_.message_loop_proxy(), 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. @@ -182,7 +184,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_loop_)); + new media::NullAudioSink(media_thread_.message_loop_proxy())); } WebMediaPlayerImpl::~WebMediaPlayerImpl() { @@ -1053,7 +1055,7 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) { DCHECK(data_source_); demuxer_.reset(new media::FFmpegDemuxer( - media_loop_, data_source_.get(), + media_thread_.message_loop_proxy(), data_source_.get(), BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""))); } else { DCHECK(!chunk_demuxer_); @@ -1086,13 +1088,15 @@ 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_loop_)); + audio_decoders.push_back(new media::FFmpegAudioDecoder( + media_thread_.message_loop_proxy())); if (cmd_line->HasSwitch(switches::kEnableOpusPlayback)) { - audio_decoders.push_back(new media::OpusAudioDecoder(media_loop_)); + audio_decoders.push_back(new media::OpusAudioDecoder( + media_thread_.message_loop_proxy())); } scoped_ptr<media::AudioRenderer> audio_renderer( - new media::AudioRendererImpl(media_loop_, + new media::AudioRendererImpl(media_thread_.message_loop_proxy(), audio_source_provider_, audio_decoders.Pass(), set_decryptor_ready_cb)); @@ -1103,7 +1107,7 @@ void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) { if (gpu_factories_) { video_decoders.push_back(new media::GpuVideoDecoder( - media_loop_, gpu_factories_)); + media_thread_.message_loop_proxy(), gpu_factories_)); } // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released @@ -1111,15 +1115,17 @@ 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_loop_)); + video_decoders.push_back(new media::VpxVideoDecoder( + media_thread_.message_loop_proxy())); } #endif // !defined(MEDIA_DISABLE_LIBVPX) - video_decoders.push_back(new media::FFmpegVideoDecoder(media_loop_)); + video_decoders.push_back(new media::FFmpegVideoDecoder( + media_thread_.message_loop_proxy())); scoped_ptr<media::VideoRenderer> video_renderer( new media::VideoRendererBase( - media_loop_, + media_thread_.message_loop_proxy(), video_decoders.Pass(), set_decryptor_ready_cb, base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), @@ -1189,6 +1195,8 @@ 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 0049369..04c0fb4 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_; - scoped_refptr<base::MessageLoopProxy> media_loop_; + base::Thread media_thread_; // 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 3592494..d33c12b 100644 --- a/webkit/renderer/media/webmediaplayer_params.cc +++ b/webkit/renderer/media/webmediaplayer_params.cc @@ -4,22 +4,18 @@ #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) - : message_loop_proxy_(message_loop_proxy), - audio_renderer_sink_(audio_renderer_sink), + : 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/renderer/media/webmediaplayer_params.h b/webkit/renderer/media/webmediaplayer_params.h index 62a5ce1..893cae7 100644 --- a/webkit/renderer/media/webmediaplayer_params.h +++ b/webkit/renderer/media/webmediaplayer_params.h @@ -8,10 +8,6 @@ #include "base/memory/ref_counted.h" #include "media/filters/gpu_video_decoder.h" -namespace base { -class MessageLoopProxy; -} - namespace media { class AudioRendererSink; class MediaLog; @@ -23,19 +19,13 @@ namespace webkit_media { // to plumb arguments through various abstraction layers. class WebMediaPlayerParams { public: - // |message_loop_proxy| and |media_log| are the only required parameters; - // all others may be null. + // |media_log| is the only required parameter; 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_; } @@ -50,7 +40,6 @@ 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 7be38f7..059586c 100644 --- a/webkit/support/webkit_support.cc +++ b/webkit/support/webkit_support.cc @@ -210,14 +210,6 @@ 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. @@ -226,8 +218,6 @@ class TestEnvironment { scoped_ptr<TestWebKitPlatformSupport> webkit_platform_support_; scoped_ptr<TestWebIDBFactory> idb_factory_; - scoped_ptr<base::Thread> media_thread_; - #if defined(OS_ANDROID) base::FilePath mock_current_directory_; #endif @@ -419,7 +409,6 @@ WebKit::WebMediaPlayer* CreateMediaPlayer( return NULL; #else webkit_media::WebMediaPlayerParams params( - test_environment->GetMediaThreadMessageLoopProxy(), NULL, NULL, new media::MediaLog()); return new webkit_media::WebMediaPlayerImpl( frame, |