summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-02 17:47:57 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-02 17:47:57 +0000
commite82b2bd016395079f0f9c8080d3499dc9bccd347 (patch)
treeea29237902b246668fc1b82c632f25a646d3cb1a
parent693845e44965a358274812ff75aa23ca80625658 (diff)
downloadchromium_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
-rw-r--r--chrome/renderer/chrome_content_renderer_client.cc12
-rw-r--r--chrome/renderer/chrome_content_renderer_client.h11
-rw-r--r--chrome/renderer/prerender/prerender_webmediaplayer.cc20
-rw-r--r--chrome/renderer/prerender/prerender_webmediaplayer.h13
-rw-r--r--content/public/renderer/content_renderer_client.cc17
-rw-r--r--content/public/renderer/content_renderer_client.h17
-rw-r--r--content/renderer/media/renderer_gpu_video_decoder_factories.cc5
-rw-r--r--content/renderer/media/renderer_gpu_video_decoder_factories.h6
-rw-r--r--content/renderer/render_view_impl.cc25
-rw-r--r--media/base/message_loop_factory.cc48
-rw-r--r--media/base/message_loop_factory.h62
-rw-r--r--media/filters/gpu_video_decoder.cc7
-rw-r--r--media/filters/gpu_video_decoder.h6
-rw-r--r--media/media.gyp2
-rw-r--r--media/tools/player_x11/player_x11.cc21
-rw-r--r--webkit/media/webkit_media.gypi2
-rw-r--r--webkit/media/webmediaplayer_impl.cc52
-rw-r--r--webkit/media/webmediaplayer_impl.h47
-rw-r--r--webkit/media/webmediaplayer_params.cc28
-rw-r--r--webkit/media/webmediaplayer_params.h77
-rw-r--r--webkit/support/webkit_support.cc17
-rw-r--r--webkit/tools/test_shell/test_webview_delegate.cc17
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(