diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-02 17:47:57 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-02 17:47:57 +0000 |
commit | e82b2bd016395079f0f9c8080d3499dc9bccd347 (patch) | |
tree | ea29237902b246668fc1b82c632f25a646d3cb1a | |
parent | 693845e44965a358274812ff75aa23ca80625658 (diff) | |
download | chromium_src-e82b2bd016395079f0f9c8080d3499dc9bccd347.zip chromium_src-e82b2bd016395079f0f9c8080d3499dc9bccd347.tar.gz chromium_src-e82b2bd016395079f0f9c8080d3499dc9bccd347.tar.bz2 |
Vanquish the remnants of media::MessageLoopFactory.
Now that media code runs on a single thread we no longer need to worry about creating additional threads at runtime.
To make changes like this easier in the future, webkit_media::WebMediaPlayerParams is introduced to avoid plumbing parameters through Chrome's various abstraction layers.
BUG=116873
Review URL: https://codereview.chromium.org/11468033
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174808 0039d316-1c4b-4281-b951-d872f2087c98
22 files changed, 196 insertions, 316 deletions
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index eb60f95..b8b01ce 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc @@ -381,12 +381,7 @@ ChromeContentRendererClient::OverrideCreateWebMediaPlayer( WebKit::WebFrame* frame, WebKit::WebMediaPlayerClient* client, base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - media::FilterCollection* collection, - WebKit::WebAudioSourceProvider* audio_source_provider, - media::AudioRendererSink* audio_renderer_sink, - media::MessageLoopFactory* message_loop_factory, - webkit_media::MediaStreamClient* media_stream_client, - media::MediaLog* media_log) { + const webkit_media::WebMediaPlayerParams& params) { #if defined(OS_ANDROID) // Chromium for Android doesn't support prerender yet. return NULL; @@ -394,9 +389,8 @@ ChromeContentRendererClient::OverrideCreateWebMediaPlayer( if (!prerender::PrerenderHelper::IsPrerendering(render_view)) return NULL; - return new prerender::PrerenderWebMediaPlayer(render_view, frame, client, - delegate, collection, audio_source_provider, audio_renderer_sink, - message_loop_factory, media_stream_client, media_log); + return new prerender::PrerenderWebMediaPlayer( + render_view, frame, client, delegate, params); #endif } diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index 339e286..088e5c3 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h @@ -27,10 +27,6 @@ class Dispatcher; class Extension; } -namespace media { -class AudioRendererSink; -} - namespace prerender { class PrerenderDispatcher; } @@ -80,12 +76,7 @@ class ChromeContentRendererClient : public content::ContentRendererClient { WebKit::WebFrame* frame, WebKit::WebMediaPlayerClient* client, base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - media::FilterCollection* collection, - WebKit::WebAudioSourceProvider* audio_source_provider, - media::AudioRendererSink* audio_renderer_sink, - media::MessageLoopFactory* message_loop_factory, - webkit_media::MediaStreamClient* media_stream_client, - media::MediaLog* media_log) OVERRIDE; + const webkit_media::WebMediaPlayerParams& params) OVERRIDE; virtual bool RunIdleHandlerWhenWidgetsHidden() OVERRIDE; virtual bool AllowPopup() OVERRIDE; virtual bool ShouldFork(WebKit::WebFrame* frame, diff --git a/chrome/renderer/prerender/prerender_webmediaplayer.cc b/chrome/renderer/prerender/prerender_webmediaplayer.cc index 54b6dd7..21912cb 100644 --- a/chrome/renderer/prerender/prerender_webmediaplayer.cc +++ b/chrome/renderer/prerender/prerender_webmediaplayer.cc @@ -6,9 +6,6 @@ #include "chrome/common/prerender_messages.h" #include "content/public/renderer/render_view.h" -#include "media/base/filter_collection.h" -#include "media/base/media_log.h" -#include "media/base/pipeline.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURL.h" #include "webkit/media/webmediaplayer_delegate.h" @@ -19,22 +16,9 @@ PrerenderWebMediaPlayer::PrerenderWebMediaPlayer( WebKit::WebFrame* frame, WebKit::WebMediaPlayerClient* client, base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - media::FilterCollection* collection, - WebKit::WebAudioSourceProvider* audio_source_provider, - media::AudioRendererSink* audio_renderer_sink, - media::MessageLoopFactory* message_loop_factory, - webkit_media::MediaStreamClient* media_stream_client, - media::MediaLog* media_log) + const webkit_media::WebMediaPlayerParams& params) : RenderViewObserver(render_view), - WebMediaPlayerImpl(frame, - client, - delegate, - collection, - audio_source_provider, - audio_renderer_sink, - message_loop_factory, - media_stream_client, - media_log), + WebMediaPlayerImpl(frame, client, delegate, params), is_prerendering_(true), url_loaded_(false), cors_mode_(CORSModeUnspecified) { diff --git a/chrome/renderer/prerender/prerender_webmediaplayer.h b/chrome/renderer/prerender/prerender_webmediaplayer.h index 7541ef6..dbd184c 100644 --- a/chrome/renderer/prerender/prerender_webmediaplayer.h +++ b/chrome/renderer/prerender/prerender_webmediaplayer.h @@ -8,14 +8,8 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "content/public/renderer/render_view_observer.h" -#include "media/base/audio_renderer_sink.h" #include "webkit/media/webmediaplayer_impl.h" -namespace webkit_media { -class MediaStreamClient; -class WebMediaPlayerDelegate; -} - namespace prerender { // Substitute for WebMediaPlayerImpl to be used in prerendered pages. Defers @@ -29,12 +23,7 @@ class PrerenderWebMediaPlayer WebKit::WebFrame* frame, WebKit::WebMediaPlayerClient* client, base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - media::FilterCollection* collection, - WebKit::WebAudioSourceProvider* audio_source_provider, - media::AudioRendererSink* audio_renderer_sink, - media::MessageLoopFactory* message_loop_factory, - webkit_media::MediaStreamClient* media_stream_client, - media::MediaLog* media_log); + const webkit_media::WebMediaPlayerParams& params); virtual ~PrerenderWebMediaPlayer(); // WebMediaPlayerImpl methods: diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc index a62995f..beb5892 100644 --- a/content/public/renderer/content_renderer_client.cc +++ b/content/public/renderer/content_renderer_client.cc @@ -38,17 +38,12 @@ bool ContentRendererClient::HasErrorPage(int http_status_code, } webkit_media::WebMediaPlayerImpl* - ContentRendererClient::OverrideCreateWebMediaPlayer( - RenderView* render_view, - WebKit::WebFrame* frame, - WebKit::WebMediaPlayerClient* client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - media::FilterCollection* collection, - WebKit::WebAudioSourceProvider* audio_source_provider, - media::AudioRendererSink* audio_renderer_sink, - media::MessageLoopFactory* message_loop_factory, - webkit_media::MediaStreamClient* media_stream_client, - media::MediaLog* media_log) { +ContentRendererClient::OverrideCreateWebMediaPlayer( + RenderView* render_view, + WebKit::WebFrame* frame, + WebKit::WebMediaPlayerClient* client, + base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, + const webkit_media::WebMediaPlayerParams& params) { return NULL; } diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h index 06ad7c3..94f5dd9 100644 --- a/content/public/renderer/content_renderer_client.h +++ b/content/public/renderer/content_renderer_client.h @@ -22,7 +22,6 @@ class GURL; class SkBitmap; namespace WebKit { -class WebAudioSourceProvider; class WebFrame; class WebMediaPlayerClient; class WebPlugin; @@ -38,17 +37,10 @@ class PpapiInterfaceFactoryManager; struct WebPluginInfo; } -namespace media { -class AudioRendererSink; -class FilterCollection; -class MediaLog; -class MessageLoopFactory; -} - namespace webkit_media { -class MediaStreamClient; class WebMediaPlayerDelegate; class WebMediaPlayerImpl; +class WebMediaPlayerParams; } namespace content { @@ -122,12 +114,7 @@ class CONTENT_EXPORT ContentRendererClient { WebKit::WebFrame* frame, WebKit::WebMediaPlayerClient* client, base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - media::FilterCollection* collection, - WebKit::WebAudioSourceProvider* audio_source_provider, - media::AudioRendererSink* audio_renderer_sink, - media::MessageLoopFactory* message_loop_factory, - webkit_media::MediaStreamClient* media_stream_client, - media::MediaLog* media_log); + const webkit_media::WebMediaPlayerParams& params); // Returns true if the renderer process should schedule the idle handler when // all widgets are hidden. diff --git a/content/renderer/media/renderer_gpu_video_decoder_factories.cc b/content/renderer/media/renderer_gpu_video_decoder_factories.cc index c1b8435..cdd5804 100644 --- a/content/renderer/media/renderer_gpu_video_decoder_factories.cc +++ b/content/renderer/media/renderer_gpu_video_decoder_factories.cc @@ -220,4 +220,9 @@ void RendererGpuVideoDecoderFactories::AsyncCreateSharedMemory( waiter->Signal(); } +scoped_refptr<base::MessageLoopProxy> +RendererGpuVideoDecoderFactories::GetMessageLoop() { + return message_loop_; +} + } // namespace content diff --git a/content/renderer/media/renderer_gpu_video_decoder_factories.h b/content/renderer/media/renderer_gpu_video_decoder_factories.h index 8f607bb..5512562 100644 --- a/content/renderer/media/renderer_gpu_video_decoder_factories.h +++ b/content/renderer/media/renderer_gpu_video_decoder_factories.h @@ -40,20 +40,18 @@ class CONTENT_EXPORT RendererGpuVideoDecoderFactories const scoped_refptr<base::MessageLoopProxy>& message_loop, WebGraphicsContext3DCommandBufferImpl* wgc3dcbi); + // media::GpuVideoDecoder::Factories implementation. virtual media::VideoDecodeAccelerator* CreateVideoDecodeAccelerator( media::VideoCodecProfile profile, media::VideoDecodeAccelerator::Client* client) OVERRIDE; - virtual bool CreateTextures(int32 count, const gfx::Size& size, std::vector<uint32>* texture_ids, uint32 texture_target) OVERRIDE; - virtual void DeleteTexture(uint32 texture_id) OVERRIDE; - virtual void ReadPixels(uint32 texture_id, uint32 texture_target, const gfx::Size& size, void* pixels) OVERRIDE; - virtual base::SharedMemory* CreateSharedMemory(size_t size) OVERRIDE; + virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() OVERRIDE; protected: friend class base::RefCountedThreadSafe<RendererGpuVideoDecoderFactories>; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 87f363f..8f70fc6 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -115,7 +115,6 @@ #include "content/renderer/websharedworker_proxy.h" #include "media/base/filter_collection.h" #include "media/base/media_switches.h" -#include "media/base/message_loop_factory.h" #include "media/filters/audio_renderer_impl.h" #include "media/filters/gpu_video_decoder.h" #include "net/base/data_url.h" @@ -202,6 +201,7 @@ #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" #include "webkit/media/webmediaplayer_impl.h" #include "webkit/media/webmediaplayer_ms.h" +#include "webkit/media/webmediaplayer_params.h" #include "webkit/plugins/npapi/plugin_list.h" #include "webkit/plugins/npapi/plugin_utils.h" #include "webkit/plugins/npapi/webplugin_delegate.h" @@ -2615,9 +2615,6 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( resource_context, gpu_channel_host, routing_id_)); #endif - media::MessageLoopFactory* message_loop_factory = - new media::MessageLoopFactory(); - media::FilterCollection* collection = new media::FilterCollection(); RenderMediaLog* render_media_log = new RenderMediaLog(); RenderAudioSourceProvider* audio_source_provider = NULL; @@ -2628,6 +2625,7 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( audio_source_provider = new RenderAudioSourceProvider(routing_id_); } + scoped_refptr<media::GpuVideoDecoder::Factories> gpu_factories; WebGraphicsContext3DCommandBufferImpl* context3d = NULL; if (!cmd_line->HasSwitch(switches::kDisableAcceleratedVideoDecode)) context3d = RenderThreadImpl::current()->GetGpuVDAContext3D(); @@ -2640,24 +2638,19 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( GpuChannelHost* gpu_channel_host = RenderThreadImpl::current()->EstablishGpuChannelSync( CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE); - collection->GetVideoDecoders()->push_back(new media::GpuVideoDecoder( - message_loop_factory->GetMessageLoop( - media::MessageLoopFactory::kPipeline), - factories_loop, - new RendererGpuVideoDecoderFactories( - gpu_channel_host, factories_loop, context3d))); + gpu_factories = new RendererGpuVideoDecoderFactories( + gpu_channel_host, factories_loop, context3d); } + webkit_media::WebMediaPlayerParams params( + audio_source_provider, audio_source_provider, gpu_factories, + media_stream_impl_, render_media_log); WebMediaPlayer* media_player = GetContentClient()->renderer()->OverrideCreateWebMediaPlayer( - this, frame, client, AsWeakPtr(), collection, audio_source_provider, - audio_source_provider, message_loop_factory, media_stream_impl_, - render_media_log); + this, frame, client, AsWeakPtr(), params); if (!media_player) { media_player = new webkit_media::WebMediaPlayerImpl( - frame, client, AsWeakPtr(), collection, audio_source_provider, - audio_source_provider, message_loop_factory, media_stream_impl_, - render_media_log); + frame, client, AsWeakPtr(), params); } return media_player; } diff --git a/media/base/message_loop_factory.cc b/media/base/message_loop_factory.cc deleted file mode 100644 index 597ff13..0000000 --- a/media/base/message_loop_factory.cc +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/base/message_loop_factory.h" - -#include "base/threading/thread.h" - -namespace media { - -MessageLoopFactory::MessageLoopFactory() {} - -MessageLoopFactory::~MessageLoopFactory() { - for (ThreadList::reverse_iterator it = threads_.rbegin(); - it != threads_.rend(); ++it) { - base::Thread* thread = it->second; - thread->Stop(); - delete thread; - } - threads_.clear(); -} - -scoped_refptr<base::MessageLoopProxy> MessageLoopFactory::GetMessageLoop( - Type type) { - return GetThread(type)->message_loop_proxy(); -} - -base::Thread* MessageLoopFactory::GetThread(Type type) { - base::AutoLock auto_lock(lock_); - for (ThreadList::iterator it = threads_.begin(); it != threads_.end(); ++it) { - if (it->first == type) - return it->second; - } - - const char* name = NULL; - switch (type) { - case kPipeline: - name = "MediaPipeline"; - break; - } - - base::Thread* thread = new base::Thread(name); - CHECK(thread->Start()) << "Failed to start thread: " << name; - threads_.push_back(std::make_pair(type, thread)); - return thread; -} - -} // namespace media diff --git a/media/base/message_loop_factory.h b/media/base/message_loop_factory.h deleted file mode 100644 index 0989174..0000000 --- a/media/base/message_loop_factory.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_MESSAGE_LOOP_FACTORY_H_ -#define MEDIA_BASE_MESSAGE_LOOP_FACTORY_H_ - -#include <list> -#include <string> - -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" -#include "base/message_loop_proxy.h" -#include "base/synchronization/lock.h" -#include "media/base/media_export.h" - -class MessageLoop; - -namespace base { -class Thread; -} - -namespace media { - -// Factory object that manages named MessageLoops. -// -// TODO(scherkus): replace this with something simpler http://crbug.com/116873 -class MEDIA_EXPORT MessageLoopFactory { - public: - enum Type { - kPipeline - }; - - MessageLoopFactory(); - - // Get the message loop proxy associated with |type|. A new MessageLoopProxy - // is created if the factory doesn't have one associated with |type|. - scoped_refptr<base::MessageLoopProxy> GetMessageLoop(Type type); - - private: - // Restrict who can delete the factory to scoped_ptr<>. scoped_ptr<> uses - // base::DefaultDeleter. - friend struct base::DefaultDeleter<MessageLoopFactory>; - ~MessageLoopFactory(); - - // Returns the thread associated with |type| creating a new thread if needed. - base::Thread* GetThread(Type type); - - // Lock used to serialize access for the following data members. - base::Lock lock_; - - // List of pairs of created threads and their types. We use a list to ensure - // threads are stopped & deleted in reverse order of creation. - typedef std::list<std::pair<Type, base::Thread*> > ThreadList; - ThreadList threads_; - - DISALLOW_COPY_AND_ASSIGN(MessageLoopFactory); -}; - -} // namespace media - -#endif // MEDIA_BASE_MESSAGE_LOOP_FACTORY_H_ diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc index b05698a..b2e5670 100644 --- a/media/filters/gpu_video_decoder.cc +++ b/media/filters/gpu_video_decoder.cc @@ -51,11 +51,10 @@ GpuVideoDecoder::BufferData::BufferData( GpuVideoDecoder::BufferData::~BufferData() {} GpuVideoDecoder::GpuVideoDecoder( - const scoped_refptr<base::MessageLoopProxy>& gvd_loop_proxy, - const scoped_refptr<base::MessageLoopProxy>& vda_loop_proxy, + const scoped_refptr<base::MessageLoopProxy>& message_loop, const scoped_refptr<Factories>& factories) - : gvd_loop_proxy_(gvd_loop_proxy), - vda_loop_proxy_(vda_loop_proxy), + : gvd_loop_proxy_(message_loop), + vda_loop_proxy_(factories->GetMessageLoop()), factories_(factories), state_(kNormal), demuxer_read_in_progress_(false), diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h index 6c1fec3..ae51189 100644 --- a/media/filters/gpu_video_decoder.h +++ b/media/filters/gpu_video_decoder.h @@ -55,13 +55,15 @@ class MEDIA_EXPORT GpuVideoDecoder // Close()ing the returned pointer. virtual base::SharedMemory* CreateSharedMemory(size_t size) = 0; + // Returns the message loop the VideoDecodeAccelerator runs on. + virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() = 0; + protected: friend class base::RefCountedThreadSafe<Factories>; virtual ~Factories(); }; - GpuVideoDecoder(const scoped_refptr<base::MessageLoopProxy>& gvd_loop_proxy, - const scoped_refptr<base::MessageLoopProxy>& vda_loop_proxy, + GpuVideoDecoder(const scoped_refptr<base::MessageLoopProxy>& message_loop, const scoped_refptr<Factories>& factories); // VideoDecoder implementation. diff --git a/media/media.gyp b/media/media.gyp index 89b1ecb..05b35cc 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -227,8 +227,6 @@ 'base/media_switches.cc', 'base/media_switches.h', 'base/media_win.cc', - 'base/message_loop_factory.cc', - 'base/message_loop_factory.h', 'base/multi_channel_resampler.cc', 'base/multi_channel_resampler.h', 'base/pipeline.cc', diff --git a/media/tools/player_x11/player_x11.cc b/media/tools/player_x11/player_x11.cc index 8c76e17..0a7477c 100644 --- a/media/tools/player_x11/player_x11.cc +++ b/media/tools/player_x11/player_x11.cc @@ -20,7 +20,6 @@ #include "media/base/media.h" #include "media/base/media_log.h" #include "media/base/media_switches.h" -#include "media/base/message_loop_factory.h" #include "media/base/pipeline.h" #include "media/base/video_frame.h" #include "media/filters/audio_renderer_impl.h" @@ -106,8 +105,7 @@ bool InitPipeline(const scoped_refptr<base::MessageLoopProxy>& message_loop, const PaintCB& paint_cb, bool /* enable_audio */, scoped_refptr<media::Pipeline>* pipeline, - MessageLoop* paint_message_loop, - media::MessageLoopFactory* message_loop_factory) { + MessageLoop* paint_message_loop) { // Create our filter factories. scoped_ptr<media::FilterCollection> collection( new media::FilterCollection()); @@ -259,13 +257,10 @@ int main(int argc, char** argv) { return 1; // Initialize the pipeline thread and the pipeline. - scoped_ptr<media::MessageLoopFactory> message_loop_factory( - new media::MessageLoopFactory()); - scoped_ptr<base::Thread> thread; - scoped_refptr<media::Pipeline> pipeline; MessageLoop message_loop; - thread.reset(new base::Thread("PipelineThread")); - thread->Start(); + base::Thread media_thread("MediaThread"); + media_thread.Start(); + scoped_refptr<media::Pipeline> pipeline; PaintCB paint_cb; if (command_line->HasSwitch("use-gl")) { @@ -280,9 +275,9 @@ int main(int argc, char** argv) { new DataSourceLogger(CreateFileDataSource(filename), command_line->HasSwitch("streaming"))); - if (InitPipeline(thread->message_loop_proxy(), data_source, + if (InitPipeline(media_thread.message_loop_proxy(), data_source, paint_cb, command_line->HasSwitch("audio"), - &pipeline, &message_loop, message_loop_factory.get())) { + &pipeline, &message_loop)) { // Main loop of the application. g_running = true; @@ -294,9 +289,7 @@ int main(int argc, char** argv) { } // Cleanup tasks. - message_loop_factory.reset(); - - thread->Stop(); + media_thread.Stop(); // Release callback which releases video renderer. Do this before cleaning up // X below since the video renderer has some X cleanup duties as well. diff --git a/webkit/media/webkit_media.gypi b/webkit/media/webkit_media.gypi index d7cd618..ea4bc88 100644 --- a/webkit/media/webkit_media.gypi +++ b/webkit/media/webkit_media.gypi @@ -80,6 +80,8 @@ 'webmediaplayer_impl.h', 'webmediaplayer_ms.cc', 'webmediaplayer_ms.h', + 'webmediaplayer_params.cc', + 'webmediaplayer_params.h', 'webmediaplayer_proxy.cc', 'webmediaplayer_proxy.h', 'webmediaplayer_util.cc', diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc index 23b7f42..a17cd0f 100644 --- a/webkit/media/webmediaplayer_impl.cc +++ b/webkit/media/webmediaplayer_impl.cc @@ -35,6 +35,7 @@ #include "webkit/media/buffered_data_source.h" #include "webkit/media/filter_helpers.h" #include "webkit/media/webmediaplayer_delegate.h" +#include "webkit/media/webmediaplayer_params.h" #include "webkit/media/webmediaplayer_proxy.h" #include "webkit/media/webmediaplayer_util.h" #include "webkit/media/webvideoframe_impl.h" @@ -120,18 +121,13 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( WebKit::WebFrame* frame, WebKit::WebMediaPlayerClient* client, base::WeakPtr<WebMediaPlayerDelegate> delegate, - media::FilterCollection* collection, - WebKit::WebAudioSourceProvider* audio_source_provider, - media::AudioRendererSink* audio_renderer_sink, - media::MessageLoopFactory* message_loop_factory, - MediaStreamClient* media_stream_client, - media::MediaLog* media_log) + const WebMediaPlayerParams& params) : frame_(frame), network_state_(WebMediaPlayer::NetworkStateEmpty), ready_state_(WebMediaPlayer::ReadyStateHaveNothing), main_loop_(MessageLoop::current()), - filter_collection_(collection), - message_loop_factory_(message_loop_factory), + filter_collection_(new media::FilterCollection()), + media_thread_("MediaPipeline"), paused_(true), seeking_(false), playback_rate_(0.0f), @@ -140,24 +136,22 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( client_(client), proxy_(new WebMediaPlayerProxy(main_loop_->message_loop_proxy(), this)), delegate_(delegate), - media_stream_client_(media_stream_client), - media_log_(media_log), + media_stream_client_(params.media_stream_client()), + media_log_(params.media_log()), accelerated_compositing_reported_(false), incremented_externally_allocated_memory_(false), - audio_source_provider_(audio_source_provider), - audio_renderer_sink_(audio_renderer_sink), + audio_source_provider_(params.audio_source_provider()), is_local_source_(false), supports_save_(true), starting_(false) { media_log_->AddEvent( media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); - scoped_refptr<base::MessageLoopProxy> pipeline_message_loop = - message_loop_factory_->GetMessageLoop( - media::MessageLoopFactory::kPipeline); - pipeline_ = new media::Pipeline(pipeline_message_loop, media_log_); + CHECK(media_thread_.Start()); + pipeline_ = new media::Pipeline( + media_thread_.message_loop_proxy(), media_log_); - // Let V8 know we started new thread if we did not did it yet. + // 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. // Also, delaying GC until after player starts gets rid of starting lag -- // collection happens in parallel with playing. @@ -184,10 +178,18 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( base::Unretained(decryptor_.get())); } + // Create the GPU video decoder if factories were provided. + if (params.gpu_factories()) { + filter_collection_->GetVideoDecoders()->push_back( + new media::GpuVideoDecoder( + media_thread_.message_loop_proxy(), + params.gpu_factories())); + } + // Create default video renderer. scoped_refptr<media::VideoRendererBase> video_renderer = new media::VideoRendererBase( - pipeline_message_loop, + media_thread_.message_loop_proxy(), set_decryptor_ready_cb, base::Bind(&WebMediaPlayerProxy::Repaint, proxy_), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), @@ -196,6 +198,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( proxy_->set_frame_provider(video_renderer); // Create default audio renderer using the null sink if no sink was provided. + scoped_refptr<media::AudioRendererSink> audio_renderer_sink = + params.audio_renderer_sink(); if (!audio_renderer_sink) audio_renderer_sink = new media::NullAudioSink(); @@ -267,13 +271,9 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) { SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); - scoped_refptr<base::MessageLoopProxy> message_loop = - message_loop_factory_->GetMessageLoop( - media::MessageLoopFactory::kPipeline); - // Media streams pipelines can start immediately. if (BuildMediaStreamCollection(url, media_stream_client_, - message_loop, + media_thread_.message_loop_proxy(), filter_collection_.get())) { supports_save_ = false; StartPipeline(); @@ -288,7 +288,7 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) { base::Bind(&LogMediaSourceError, media_log_)); BuildMediaSourceCollection(chunk_demuxer_, - message_loop, + media_thread_.message_loop_proxy(), filter_collection_.get()); supports_save_ = false; StartPipeline(); @@ -309,7 +309,7 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) { is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); BuildDefaultCollection(proxy_->data_source(), - message_loop, + media_thread_.message_loop_proxy(), filter_collection_.get()); } @@ -1194,7 +1194,7 @@ void WebMediaPlayerImpl::Destroy() { incremented_externally_allocated_memory_ = false; } - message_loop_factory_.reset(); + media_thread_.Stop(); // And then detach the proxy, it may live on the render thread for a little // longer until all the tasks are finished. diff --git a/webkit/media/webmediaplayer_impl.h b/webkit/media/webmediaplayer_impl.h index dc02de3..bb81c7c 100644 --- a/webkit/media/webmediaplayer_impl.h +++ b/webkit/media/webmediaplayer_impl.h @@ -54,10 +54,10 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/message_loop.h" +#include "base/threading/thread.h" #include "googleurl/src/gurl.h" #include "media/base/audio_renderer_sink.h" #include "media/base/decryptor.h" -#include "media/base/message_loop_factory.h" #include "media/base/pipeline.h" #include "skia/ext/platform_canvas.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebAudioSourceProvider.h" @@ -69,12 +69,10 @@ class RenderAudioSourceProvider; namespace WebKit { -class WebAudioSourceProvider; class WebFrame; } namespace media { -class AudioRendererSink; class ChunkDemuxer; class MediaLog; } @@ -83,6 +81,7 @@ namespace webkit_media { class MediaStreamClient; class WebMediaPlayerDelegate; +class WebMediaPlayerParams; class WebMediaPlayerProxy; class WebMediaPlayerImpl @@ -90,37 +89,14 @@ class WebMediaPlayerImpl public MessageLoop::DestructionObserver, public base::SupportsWeakPtr<WebMediaPlayerImpl> { public: - // Construct a WebMediaPlayerImpl with reference to the client, and media - // filter collection. By providing the filter collection the implementor can - // provide more specific media filters that does resource loading and - // rendering. + // Constructs a WebMediaPlayer implementation using Chromium's media stack. // - // WebMediaPlayerImpl comes packaged with the following media filters: - // - URL fetching - // - Demuxing - // - Software audio/video decoding - // - Video rendering - // - // Clients are expected to add their platform-specific audio rendering media - // filter if they wish to hear any sound coming out the speakers, otherwise - // audio data is discarded and media plays back based on wall clock time. - // - // When calling this, the |audio_source_provider| and - // |audio_renderer_sink| arguments should be the same object. - // - // TODO(scherkus): Remove WebAudioSourceProvider parameter once we - // refactor RenderAudioSourceProvider to live under webkit/media/ - // instead of content/renderer/, see http://crbug.com/136442 - - WebMediaPlayerImpl(WebKit::WebFrame* frame, - WebKit::WebMediaPlayerClient* client, - base::WeakPtr<WebMediaPlayerDelegate> delegate, - media::FilterCollection* collection, - WebKit::WebAudioSourceProvider* audio_source_provider, - media::AudioRendererSink* audio_renderer_sink, - media::MessageLoopFactory* message_loop_factory, - MediaStreamClient* media_stream_client, - media::MediaLog* media_log); + // |delegate| may be null. + WebMediaPlayerImpl( + WebKit::WebFrame* frame, + WebKit::WebMediaPlayerClient* client, + base::WeakPtr<WebMediaPlayerDelegate> delegate, + const WebMediaPlayerParams& params); virtual ~WebMediaPlayerImpl(); virtual void load(const WebKit::WebURL& url, CORSMode cors_mode); @@ -305,13 +281,12 @@ class WebMediaPlayerImpl scoped_ptr<media::FilterCollection> filter_collection_; scoped_refptr<media::Pipeline> pipeline_; + base::Thread media_thread_; // The currently selected key system. Empty string means that no key system // has been selected. WebKit::WebString current_key_system_; - scoped_ptr<media::MessageLoopFactory> message_loop_factory_; - // Playback state. // // TODO(scherkus): we have these because Pipeline favours the simplicity of a @@ -352,8 +327,6 @@ class WebMediaPlayerImpl WebKit::WebAudioSourceProvider* audio_source_provider_; - scoped_refptr<media::AudioRendererSink> audio_renderer_sink_; - bool is_local_source_; bool supports_save_; diff --git a/webkit/media/webmediaplayer_params.cc b/webkit/media/webmediaplayer_params.cc new file mode 100644 index 0000000..b860531 --- /dev/null +++ b/webkit/media/webmediaplayer_params.cc @@ -0,0 +1,28 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "webkit/media/webmediaplayer_params.h" + +#include "media/base/audio_renderer_sink.h" +#include "media/base/media_log.h" + +namespace webkit_media { + +WebMediaPlayerParams::WebMediaPlayerParams( + WebKit::WebAudioSourceProvider* audio_source_provider, + const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink, + const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories, + MediaStreamClient* media_stream_client, + const scoped_refptr<media::MediaLog>& media_log) + : audio_source_provider_(audio_source_provider), + audio_renderer_sink_(audio_renderer_sink), + gpu_factories_(gpu_factories), + media_stream_client_(media_stream_client), + media_log_(media_log) { + DCHECK(media_log_); +} + +WebMediaPlayerParams::~WebMediaPlayerParams() {} + +} // namespace webkit_media diff --git a/webkit/media/webmediaplayer_params.h b/webkit/media/webmediaplayer_params.h new file mode 100644 index 0000000..d78f78f --- /dev/null +++ b/webkit/media/webmediaplayer_params.h @@ -0,0 +1,77 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WEBKIT_MEDIA_WEBMEDIAPLAYER_PARAMS_H_ +#define WEBKIT_MEDIA_WEBMEDIAPLAYER_PARAMS_H_ + +#include "base/memory/ref_counted.h" +#include "media/filters/gpu_video_decoder.h" + +namespace media { +class AudioRendererSink; +class MediaLog; +} + +namespace WebKit { +class WebAudioSourceProvider; +} + +namespace webkit_media { + +class MediaStreamClient; + +// Holds parameters for constructing WebMediaPlayerImpl without having +// to plumb arguments through various abstraction layers. +class WebMediaPlayerParams { + public: + // |media_log| is the only required parameter; all others may be null. + // + // If provided, |audio_source_provider| and |audio_renderer_sink| arguments + // must be the same object. + // + // TODO(scherkus): Remove WebAudioSourceProvider parameter once we + // refactor RenderAudioSourceProvider to live under webkit/media/ + // instead of content/renderer/, see http://crbug.com/136442 + WebMediaPlayerParams( + WebKit::WebAudioSourceProvider* audio_source_provider, + const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink, + const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories, + MediaStreamClient* media_stream_client, + const scoped_refptr<media::MediaLog>& media_log); + ~WebMediaPlayerParams(); + + WebKit::WebAudioSourceProvider* audio_source_provider() const { + return audio_source_provider_; + } + + const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink() const { + return audio_renderer_sink_; + } + + const scoped_refptr<media::GpuVideoDecoder::Factories>& + gpu_factories() const { + return gpu_factories_; + } + + MediaStreamClient* media_stream_client() const { + return media_stream_client_; + } + + const scoped_refptr<media::MediaLog>& media_log() const { + return media_log_; + } + + private: + WebKit::WebAudioSourceProvider* audio_source_provider_; + scoped_refptr<media::AudioRendererSink> audio_renderer_sink_; + scoped_refptr<media::GpuVideoDecoder::Factories> gpu_factories_; + MediaStreamClient* media_stream_client_; + scoped_refptr<media::MediaLog> media_log_; + + DISALLOW_IMPLICIT_CONSTRUCTORS(WebMediaPlayerParams); +}; + +} // namespace media + +#endif // WEBKIT_MEDIA_WEBMEDIAPLAYER_PARAMS_H_ diff --git a/webkit/support/webkit_support.cc b/webkit/support/webkit_support.cc index 94a1c8f..71c6801 100644 --- a/webkit/support/webkit_support.cc +++ b/webkit/support/webkit_support.cc @@ -31,7 +31,6 @@ #include "grit/webkit_chromium_resources.h" #include "media/base/filter_collection.h" #include "media/base/media_log.h" -#include "media/base/message_loop_factory.h" #include "net/base/escape.h" #include "net/base/net_errors.h" #include "net/base/net_util.h" @@ -66,6 +65,7 @@ #include "webkit/media/media_stream_client.h" #include "webkit/media/webmediaplayer_impl.h" #include "webkit/media/webmediaplayer_ms.h" +#include "webkit/media/webmediaplayer_params.h" #include "webkit/plugins/npapi/plugin_list.h" #include "webkit/plugins/npapi/webplugin_impl.h" #include "webkit/plugins/npapi/webplugin_page_delegate.h" @@ -420,22 +420,13 @@ WebKit::WebMediaPlayer* CreateMediaPlayer( new webkit_support::TestStreamTextureFactory(), true); #else - scoped_ptr<media::MessageLoopFactory> message_loop_factory( - new media::MessageLoopFactory()); - - scoped_ptr<media::FilterCollection> collection( - new media::FilterCollection()); - + webkit_media::WebMediaPlayerParams params( + NULL, NULL, NULL, NULL, new media::MediaLog()); return new webkit_media::WebMediaPlayerImpl( frame, client, base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(), - collection.release(), - NULL, - NULL, - message_loop_factory.release(), - media_stream_client, - new media::MediaLog()); + params); #endif } diff --git a/webkit/tools/test_shell/test_webview_delegate.cc b/webkit/tools/test_shell/test_webview_delegate.cc index f7f3eb0..913e05e 100644 --- a/webkit/tools/test_shell/test_webview_delegate.cc +++ b/webkit/tools/test_shell/test_webview_delegate.cc @@ -18,7 +18,6 @@ #include "base/utf_string_conversions.h" #include "media/base/filter_collection.h" #include "media/base/media_log.h" -#include "media/base/message_loop_factory.h" #include "net/base/net_errors.h" #include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityObject.h" @@ -64,6 +63,7 @@ #include "webkit/glue/window_open_disposition.h" #include "webkit/gpu/webgraphicscontext3d_in_process_impl.h" #include "webkit/media/webmediaplayer_impl.h" +#include "webkit/media/webmediaplayer_params.h" #include "webkit/plugins/npapi/webplugin_impl.h" #include "webkit/plugins/npapi/plugin_list.h" #include "webkit/plugins/npapi/webplugin_delegate_impl.h" @@ -531,22 +531,13 @@ WebPlugin* TestWebViewDelegate::createPlugin(WebFrame* frame, WebMediaPlayer* TestWebViewDelegate::createMediaPlayer( WebFrame* frame, const WebKit::WebURL& url, WebMediaPlayerClient* client) { - scoped_ptr<media::MessageLoopFactory> message_loop_factory( - new media::MessageLoopFactory()); - - scoped_ptr<media::FilterCollection> collection( - new media::FilterCollection()); - + webkit_media::WebMediaPlayerParams params( + NULL, NULL, NULL, NULL, new media::MediaLog()); return new webkit_media::WebMediaPlayerImpl( frame, client, base::WeakPtr<webkit_media::WebMediaPlayerDelegate>(), - collection.release(), - NULL, - NULL, - message_loop_factory.release(), - NULL, - new media::MediaLog()); + params); } WebApplicationCacheHost* TestWebViewDelegate::createApplicationCacheHost( |