diff options
23 files changed, 174 insertions, 195 deletions
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index f1e19dc..7959ea0 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc @@ -463,22 +463,21 @@ WebPlugin* ChromeContentRendererClient::CreatePluginReplacement( return placeholder->plugin(); } -webkit_media::WebMediaPlayerImpl* -ChromeContentRendererClient::OverrideCreateWebMediaPlayer( +void ChromeContentRendererClient::DeferMediaLoad( content::RenderView* render_view, - WebKit::WebFrame* frame, - WebKit::WebMediaPlayerClient* client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - const webkit_media::WebMediaPlayerParams& params) { + const base::Closure& closure) { #if defined(OS_ANDROID) // Chromium for Android doesn't support prerender yet. - return NULL; + closure.Run(); + return; #else - if (!prerender::PrerenderHelper::IsPrerendering(render_view)) - return NULL; + if (!prerender::PrerenderHelper::IsPrerendering(render_view)) { + closure.Run(); + return; + } - return new prerender::PrerenderWebMediaPlayer( - render_view, frame, client, delegate, params); + // Lifetime is tied to |render_view| via content::RenderViewObserver. + new prerender::PrerenderWebMediaPlayer(render_view, closure); #endif } diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index be628b21..7d8b225 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h @@ -85,12 +85,8 @@ class ChromeContentRendererClient : public content::ContentRendererClient { const WebKit::WebURLError& error, std::string* error_html, string16* error_description) OVERRIDE; - virtual webkit_media::WebMediaPlayerImpl* OverrideCreateWebMediaPlayer( - content::RenderView* render_view, - WebKit::WebFrame* frame, - WebKit::WebMediaPlayerClient* client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - const webkit_media::WebMediaPlayerParams& params) OVERRIDE; + virtual void DeferMediaLoad(content::RenderView* render_view, + const base::Closure& closure) 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 dd7be9a..c81402c 100644 --- a/chrome/renderer/prerender/prerender_webmediaplayer.cc +++ b/chrome/renderer/prerender/prerender_webmediaplayer.cc @@ -4,57 +4,23 @@ #include "chrome/renderer/prerender/prerender_webmediaplayer.h" +#include "base/callback_helpers.h" #include "chrome/common/prerender_messages.h" #include "content/public/renderer/render_view.h" -#include "third_party/WebKit/public/platform/WebURL.h" -#include "third_party/WebKit/public/web/WebMediaSource.h" -#include "webkit/renderer/media/webmediaplayer_delegate.h" namespace prerender { PrerenderWebMediaPlayer::PrerenderWebMediaPlayer( content::RenderView* render_view, - WebKit::WebFrame* frame, - WebKit::WebMediaPlayerClient* client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - const webkit_media::WebMediaPlayerParams& params) + const base::Closure& closure) : RenderViewObserver(render_view), - WebMediaPlayerImpl(frame, client, delegate, params), is_prerendering_(true), - url_loaded_(false), - cors_mode_(CORSModeUnspecified) { + continue_loading_cb_(closure) { + DCHECK(!continue_loading_cb_.is_null()); } PrerenderWebMediaPlayer::~PrerenderWebMediaPlayer() {} -void PrerenderWebMediaPlayer::load(const WebKit::WebURL& url, - CORSMode cors_mode) { - DCHECK(!url_loaded_); - if (is_prerendering_) { - url_to_load_.reset(new WebKit::WebURL(url)); - media_source_to_load_.reset(); - cors_mode_ = cors_mode; - return; - } - url_loaded_ = true; - WebMediaPlayerImpl::load(url, cors_mode); -} - -void PrerenderWebMediaPlayer::load(const WebKit::WebURL& url, - WebKit::WebMediaSource* media_source, - CORSMode cors_mode) { - DCHECK(!url_loaded_); - if (is_prerendering_) { - url_to_load_.reset(new WebKit::WebURL(url)); - media_source_to_load_.reset(media_source); - cors_mode_ = cors_mode; - return; - } - - url_loaded_ = true; - WebMediaPlayerImpl::load(url, media_source, cors_mode); -} - bool PrerenderWebMediaPlayer::OnMessageReceived(const IPC::Message& message) { IPC_BEGIN_MESSAGE_MAP(PrerenderWebMediaPlayer, message) IPC_MESSAGE_HANDLER(PrerenderMsg_SetIsPrerendering, OnSetIsPrerendering) @@ -72,13 +38,7 @@ void PrerenderWebMediaPlayer::OnSetIsPrerendering(bool is_prerendering) { return; is_prerendering_ = false; - if (!url_to_load_) - return; - - if (media_source_to_load_) - load(*url_to_load_, media_source_to_load_.release(), cors_mode_); - else - load(*url_to_load_, cors_mode_); + base::ResetAndReturn(&continue_loading_cb_).Run(); } } // namespace prerender diff --git a/chrome/renderer/prerender/prerender_webmediaplayer.h b/chrome/renderer/prerender/prerender_webmediaplayer.h index da0b4d3..60f9403 100644 --- a/chrome/renderer/prerender/prerender_webmediaplayer.h +++ b/chrome/renderer/prerender/prerender_webmediaplayer.h @@ -5,33 +5,23 @@ #ifndef CHROME_RENDERER_PRERENDER_PRERENDER_WEBMEDIAPLAYER_H_ #define CHROME_RENDERER_PRERENDER_PRERENDER_WEBMEDIAPLAYER_H_ -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" +#include "base/callback.h" #include "content/public/renderer/render_view_observer.h" -#include "webkit/renderer/media/webmediaplayer_impl.h" namespace prerender { -// Substitute for WebMediaPlayerImpl to be used in prerendered pages. Defers -// the loading of the media till the prerendered page is swapped in. -class PrerenderWebMediaPlayer - : public content::RenderViewObserver, - public webkit_media::WebMediaPlayerImpl { +// Defers media player loading in prerendered pages until the prerendered page +// is swapped in. +// +// TODO(scherkus): Rename as this class no longer inherits WebMediaPlayer. +class PrerenderWebMediaPlayer : public content::RenderViewObserver { public: - PrerenderWebMediaPlayer( - content::RenderView* render_view, - WebKit::WebFrame* frame, - WebKit::WebMediaPlayerClient* client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - const webkit_media::WebMediaPlayerParams& params); + // Will run |closure| to continue loading the media resource once the page is + // swapped in. + PrerenderWebMediaPlayer(content::RenderView* render_view, + const base::Closure& closure); virtual ~PrerenderWebMediaPlayer(); - // WebMediaPlayerImpl methods: - virtual void load(const WebKit::WebURL& url, CORSMode cors_mode) OVERRIDE; - virtual void load(const WebKit::WebURL& url, - WebKit::WebMediaSource* media_source, - CORSMode cors_mode) OVERRIDE; - private: // RenderViewObserver method: virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; @@ -39,10 +29,7 @@ class PrerenderWebMediaPlayer void OnSetIsPrerendering(bool is_prerendering); bool is_prerendering_; - bool url_loaded_; - scoped_ptr<WebKit::WebURL> url_to_load_; - scoped_ptr<WebKit::WebMediaSource> media_source_to_load_; - CORSMode cors_mode_; + base::Closure continue_loading_cb_; DISALLOW_COPY_AND_ASSIGN(PrerenderWebMediaPlayer); }; diff --git a/content/content_shell.gypi b/content/content_shell.gypi index 0438cc6..271f74c 100644 --- a/content/content_shell.gypi +++ b/content/content_shell.gypi @@ -95,6 +95,8 @@ 'shell/renderer/shell_render_process_observer.h', 'shell/renderer/shell_render_view_observer.cc', 'shell/renderer/shell_render_view_observer.h', + 'shell/renderer/shell_video_frame_provider.cc', + 'shell/renderer/shell_video_frame_provider.h', 'shell/renderer/webkit_test_runner.cc', 'shell/renderer/webkit_test_runner.h', 'shell/shell.cc', diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc index e80ba37..13998ac 100644 --- a/content/public/renderer/content_renderer_client.cc +++ b/content/public/renderer/content_renderer_client.cc @@ -37,14 +37,9 @@ bool ContentRendererClient::HasErrorPage(int http_status_code, return false; } -webkit_media::WebMediaPlayerImpl* -ContentRendererClient::OverrideCreateWebMediaPlayer( - RenderView* render_view, - WebKit::WebFrame* frame, - WebKit::WebMediaPlayerClient* client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - const webkit_media::WebMediaPlayerParams& params) { - return NULL; +void ContentRendererClient::DeferMediaLoad(RenderView* render_view, + const base::Closure& closure) { + closure.Run(); } WebKit::WebMediaStreamCenter* @@ -59,6 +54,11 @@ ContentRendererClient::OverrideCreateWebRTCPeerConnectionHandler( return NULL; } +webkit_media::MediaStreamClient* +ContentRendererClient::OverrideCreateMediaStreamClient() { + return NULL; +} + WebKit::WebMIDIAccessor* ContentRendererClient::OverrideCreateMIDIAccessor( WebKit::WebMIDIAccessorClient* client) { diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h index 073d0af..9ed12ad 100644 --- a/content/public/renderer/content_renderer_client.h +++ b/content/public/renderer/content_renderer_client.h @@ -31,7 +31,6 @@ class WebFrame; class WebHyphenator; class WebMIDIAccessor; class WebMIDIAccessorClient; -class WebMediaPlayerClient; class WebMediaStreamCenter; class WebMediaStreamCenterClient; class WebPlugin; @@ -55,9 +54,8 @@ struct WebPluginInfo; } namespace webkit_media { -class WebMediaPlayerDelegate; -class WebMediaPlayerImpl; -class WebMediaPlayerParams; +class MediaLoadDelegate; +class MediaStreamClient; } namespace content { @@ -126,14 +124,11 @@ class CONTENT_EXPORT ContentRendererClient { std::string* error_html, string16* error_description) {} - // Allows embedder to override creating a WebMediaPlayerImpl. If it returns - // NULL the content layer will create the media player. - virtual webkit_media::WebMediaPlayerImpl* OverrideCreateWebMediaPlayer( - RenderView* render_view, - WebKit::WebFrame* frame, - WebKit::WebMediaPlayerClient* client, - base::WeakPtr<webkit_media::WebMediaPlayerDelegate> delegate, - const webkit_media::WebMediaPlayerParams& params); + // Allows the embedder to control when media resources are loaded. Embedders + // can run |closure| immediately if they don't wish to defer media resource + // loading. + virtual void DeferMediaLoad(RenderView* render_view, + const base::Closure& closure); // Allows the embedder to override creating a WebMediaStreamCenter. If it // returns NULL the content layer will create the stream center. @@ -146,6 +141,10 @@ class CONTENT_EXPORT ContentRendererClient { OverrideCreateWebRTCPeerConnectionHandler( WebKit::WebRTCPeerConnectionHandlerClient* client); + // Allows the embedder to override creating a MediaStreamClient. If it returns + // NULL the content layer will create the media stream client. + virtual webkit_media::MediaStreamClient* OverrideCreateMediaStreamClient(); + // Allows the embedder to override creating a WebMIDIAccessor. If it // returns NULL the content layer will create the MIDI accessor. virtual WebKit::WebMIDIAccessor* OverrideCreateMIDIAccessor( diff --git a/content/renderer/media/media_stream_impl.cc b/content/renderer/media/media_stream_impl.cc index cb3a5cb..2911a21 100644 --- a/content/renderer/media/media_stream_impl.cc +++ b/content/renderer/media/media_stream_impl.cc @@ -202,11 +202,6 @@ WebKit::WebMediaStream MediaStreamImpl::GetMediaStream( } bool MediaStreamImpl::IsMediaStream(const GURL& url) { - return CheckMediaStream(url); -} - -// static -bool MediaStreamImpl::CheckMediaStream(const GURL& url) { WebKit::WebMediaStream descriptor( WebKit::WebMediaStreamRegistry::lookupMediaStreamDescriptor(url)); diff --git a/content/renderer/media/media_stream_impl.h b/content/renderer/media/media_stream_impl.h index 96fb73d..a2dee2b 100644 --- a/content/renderer/media/media_stream_impl.h +++ b/content/renderer/media/media_stream_impl.h @@ -54,12 +54,6 @@ class CONTENT_EXPORT MediaStreamImpl MediaStreamDependencyFactory* dependency_factory); virtual ~MediaStreamImpl(); - // Return true when the |url| is media stream. - // This static function has the same functionalilty as IsMediaStream - // except that it doesn't require an instance of this class. - // This can save some overhead time when the |url| is not media stream. - static bool CheckMediaStream(const GURL& url); - // WebKit::WebUserMediaClient implementation virtual void requestUserMedia( const WebKit::WebUserMediaRequest& user_media_request) OVERRIDE; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 7bcff21..54e4e4c 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -2852,7 +2852,14 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); #if defined(ENABLE_WEBRTC) && !defined(GOOGLE_TV) - if (MediaStreamImpl::CheckMediaStream(url)) { + webkit_media::MediaStreamClient* media_stream_client = + GetContentClient()->renderer()->OverrideCreateMediaStreamClient(); + if (!media_stream_client) { + EnsureMediaStreamImpl(); + media_stream_client = media_stream_impl_; + } + + if (media_stream_client->IsMediaStream(url)) { #if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) bool found_neon = (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0; @@ -2860,7 +2867,7 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( #endif // defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL) EnsureMediaStreamImpl(); return new webkit_media::WebMediaPlayerMS( - frame, client, AsWeakPtr(), media_stream_impl_, new RenderMediaLog()); + frame, client, AsWeakPtr(), media_stream_client, new RenderMediaLog()); } #endif @@ -2940,15 +2947,14 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( webkit_media::WebMediaPlayerParams params( RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), - sink, gpu_factories, new RenderMediaLog()); - WebMediaPlayer* media_player = - GetContentClient()->renderer()->OverrideCreateWebMediaPlayer( - this, frame, client, AsWeakPtr(), params); - if (!media_player) { - media_player = new webkit_media::WebMediaPlayerImpl( - frame, client, AsWeakPtr(), params); - } - return media_player; + base::Bind(&ContentRendererClient::DeferMediaLoad, + base::Unretained(GetContentClient()->renderer()), + static_cast<RenderView*>(this)), + sink, + gpu_factories, + new RenderMediaLog()); + return new webkit_media::WebMediaPlayerImpl( + frame, client, AsWeakPtr(), params); } WebApplicationCacheHost* RenderViewImpl::createApplicationCacheHost( diff --git a/content/shell/renderer/shell_content_renderer_client.cc b/content/shell/renderer/shell_content_renderer_client.cc index 68dccc9..650e7c5 100644 --- a/content/shell/renderer/shell_content_renderer_client.cc +++ b/content/shell/renderer/shell_content_renderer_client.cc @@ -12,6 +12,7 @@ #include "content/public/renderer/render_view.h" #include "content/public/test/layouttest_support.h" #include "content/shell/common/shell_switches.h" +#include "content/shell/renderer/shell_media_stream_client.h" #include "content/shell/renderer/shell_render_process_observer.h" #include "content/shell/renderer/shell_render_view_observer.h" #include "content/shell/renderer/webkit_test_runner.h" @@ -145,6 +146,13 @@ ShellContentRendererClient::OverrideCreateWebRTCPeerConnectionHandler( #endif } +webkit_media::MediaStreamClient* +ShellContentRendererClient::OverrideCreateMediaStreamClient() { + if (!shell_media_stream_client_) + shell_media_stream_client_.reset(new ShellMediaStreamClient()); + return shell_media_stream_client_.get(); +} + WebMIDIAccessor* ShellContentRendererClient::OverrideCreateMIDIAccessor( WebMIDIAccessorClient* client) { diff --git a/content/shell/renderer/shell_content_renderer_client.h b/content/shell/renderer/shell_content_renderer_client.h index 7b8384f..373f320 100644 --- a/content/shell/renderer/shell_content_renderer_client.h +++ b/content/shell/renderer/shell_content_renderer_client.h @@ -28,6 +28,7 @@ class MockWebClipboardImpl; namespace content { +class ShellMediaStreamClient; class ShellRenderProcessObserver; class ShellContentRendererClient : public ContentRendererClient { @@ -52,6 +53,8 @@ class ShellContentRendererClient : public ContentRendererClient { virtual WebKit::WebRTCPeerConnectionHandler* OverrideCreateWebRTCPeerConnectionHandler( WebKit::WebRTCPeerConnectionHandlerClient* client) OVERRIDE; + virtual webkit_media::MediaStreamClient* OverrideCreateMediaStreamClient() + OVERRIDE; virtual WebKit::WebMIDIAccessor* OverrideCreateMIDIAccessor( WebKit::WebMIDIAccessorClient* client) OVERRIDE; virtual WebKit::WebClipboard* OverrideWebClipboard() OVERRIDE; @@ -64,6 +67,7 @@ class ShellContentRendererClient : public ContentRendererClient { void WebTestProxyCreated(RenderView* render_view, WebTestRunner::WebTestProxyBase* proxy); + scoped_ptr<ShellMediaStreamClient> shell_media_stream_client_; scoped_ptr<ShellRenderProcessObserver> shell_observer_; scoped_ptr<MockWebClipboardImpl> clipboard_; scoped_ptr<webkit_glue::MockWebHyphenator> hyphenator_; diff --git a/content/shell/renderer/shell_media_stream_client.cc b/content/shell/renderer/shell_media_stream_client.cc index 1107b3d..48580a6 100644 --- a/content/shell/renderer/shell_media_stream_client.cc +++ b/content/shell/renderer/shell_media_stream_client.cc @@ -4,13 +4,13 @@ #include "content/shell/renderer/shell_media_stream_client.h" +#include "content/shell/renderer/shell_video_frame_provider.h" #include "googleurl/src/gurl.h" #include "third_party/WebKit/public/platform/WebMediaStream.h" #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" #include "third_party/WebKit/public/platform/WebVector.h" #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" #include "webkit/renderer/media/media_stream_audio_renderer.h" -#include "webkit/renderer/media/simple_video_frame_provider.h" using namespace WebKit; @@ -54,7 +54,7 @@ ShellMediaStreamClient::GetVideoFrameProvider( if (!IsMockMediaStreamWithVideo(url)) return NULL; - return new webkit_media::SimpleVideoFrameProvider( + return new ShellVideoFrameProvider( gfx::Size(kVideoCaptureWidth, kVideoCaptureHeight), base::TimeDelta::FromMilliseconds(kVideoCaptureFrameDurationMs), error_cb, diff --git a/webkit/renderer/media/simple_video_frame_provider.cc b/content/shell/renderer/shell_video_frame_provider.cc index 1bc2323..8c4d440 100644 --- a/webkit/renderer/media/simple_video_frame_provider.cc +++ b/content/shell/renderer/shell_video_frame_provider.cc @@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "webkit/renderer/media/simple_video_frame_provider.h" +#include "content/shell/renderer/shell_video_frame_provider.h" #include "base/bind.h" #include "base/location.h" #include "base/message_loop/message_loop_proxy.h" #include "media/base/video_frame.h" -namespace webkit_media { +namespace content { -SimpleVideoFrameProvider::SimpleVideoFrameProvider( +ShellVideoFrameProvider::ShellVideoFrameProvider( const gfx::Size& size, const base::TimeDelta& frame_duration, const base::Closure& error_cb, @@ -24,39 +24,39 @@ SimpleVideoFrameProvider::SimpleVideoFrameProvider( repaint_cb_(repaint_cb) { } -SimpleVideoFrameProvider::~SimpleVideoFrameProvider() {} +ShellVideoFrameProvider::~ShellVideoFrameProvider() {} -void SimpleVideoFrameProvider::Start() { - DVLOG(1) << "SimpleVideoFrameProvider::Start"; +void ShellVideoFrameProvider::Start() { + DVLOG(1) << "ShellVideoFrameProvider::Start"; DCHECK(message_loop_proxy_->BelongsToCurrentThread()); state_ = kStarted; message_loop_proxy_->PostTask( FROM_HERE, - base::Bind(&SimpleVideoFrameProvider::GenerateFrame, this)); + base::Bind(&ShellVideoFrameProvider::GenerateFrame, this)); } -void SimpleVideoFrameProvider::Stop() { - DVLOG(1) << "SimpleVideoFrameProvider::Stop"; +void ShellVideoFrameProvider::Stop() { + DVLOG(1) << "ShellVideoFrameProvider::Stop"; DCHECK(message_loop_proxy_->BelongsToCurrentThread()); state_ = kStopped; } -void SimpleVideoFrameProvider::Play() { - DVLOG(1) << "SimpleVideoFrameProvider::Play"; +void ShellVideoFrameProvider::Play() { + DVLOG(1) << "ShellVideoFrameProvider::Play"; DCHECK(message_loop_proxy_->BelongsToCurrentThread()); if (state_ == kPaused) state_ = kStarted; } -void SimpleVideoFrameProvider::Pause() { - DVLOG(1) << "SimpleVideoFrameProvider::Pause"; +void ShellVideoFrameProvider::Pause() { + DVLOG(1) << "ShellVideoFrameProvider::Pause"; DCHECK(message_loop_proxy_->BelongsToCurrentThread()); if (state_ == kStarted) state_ = kPaused; } -void SimpleVideoFrameProvider::GenerateFrame() { - DVLOG(1) << "SimpleVideoFrameProvider::GenerateFrame"; +void ShellVideoFrameProvider::GenerateFrame() { + DVLOG(1) << "ShellVideoFrameProvider::GenerateFrame"; DCHECK(message_loop_proxy_->BelongsToCurrentThread()); if (state_ == kStopped) return; @@ -76,8 +76,8 @@ void SimpleVideoFrameProvider::GenerateFrame() { current_time_ += frame_duration_; message_loop_proxy_->PostDelayedTask( FROM_HERE, - base::Bind(&SimpleVideoFrameProvider::GenerateFrame, this), + base::Bind(&ShellVideoFrameProvider::GenerateFrame, this), frame_duration_); } -} // namespace webkit_media +} // namespace content diff --git a/webkit/renderer/media/simple_video_frame_provider.h b/content/shell/renderer/shell_video_frame_provider.h index bcc0679..fdcc866 100644 --- a/webkit/renderer/media/simple_video_frame_provider.h +++ b/content/shell/renderer/shell_video_frame_provider.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef WEBKIT_RENDERER_MEDIA_SIMPLE_VIDEO_FRAME_PROVIDER_H_ -#define WEBKIT_RENDERER_MEDIA_SIMPLE_VIDEO_FRAME_PROVIDER_H_ +#ifndef CONTENT_RENDERER_MEDIA_SHELL_VIDEO_FRAME_PROVIDER_H_ +#define CONTENT_RENDERER_MEDIA_SHELL_VIDEO_FRAME_PROVIDER_H_ #include "base/time/time.h" #include "ui/gfx/size.h" @@ -13,29 +13,29 @@ namespace base { class MessageLoopProxy; } -namespace webkit_media { +namespace content { // A simple implementation of VideoFrameProvider generates raw frames and // passes them to webmediaplayer. // Since non-black pixel values are required in the layout test, e.g., // media/video-capture-canvas.html, this class should generate frame with // only non-black pixels. -class SimpleVideoFrameProvider : public VideoFrameProvider { +class ShellVideoFrameProvider : public webkit_media::VideoFrameProvider { public: - SimpleVideoFrameProvider( + ShellVideoFrameProvider( const gfx::Size& size, const base::TimeDelta& frame_duration, const base::Closure& error_cb, const RepaintCB& repaint_cb); - // VideoFrameProvider implementation. + // webkit_media::VideoFrameProvider implementation. virtual void Start() OVERRIDE; virtual void Stop() OVERRIDE; virtual void Play() OVERRIDE; virtual void Pause() OVERRIDE; protected: - virtual ~SimpleVideoFrameProvider(); + virtual ~ShellVideoFrameProvider(); private: enum State { @@ -55,9 +55,9 @@ class SimpleVideoFrameProvider : public VideoFrameProvider { base::Closure error_cb_; RepaintCB repaint_cb_; - DISALLOW_COPY_AND_ASSIGN(SimpleVideoFrameProvider); + DISALLOW_COPY_AND_ASSIGN(ShellVideoFrameProvider); }; -} // namespace webkit_media +} // namespace content -#endif // WEBKIT_RENDERER_MEDIA_SIMPLE_VIDEO_FRAME_PROVIDER_H_ +#endif // CONTENT_RENDERER_MEDIA_SHELL_VIDEO_FRAME_PROVIDER_H_ diff --git a/content/shell/renderer/webkit_test_runner.cc b/content/shell/renderer/webkit_test_runner.cc index 94b5619..49f3f18 100644 --- a/content/shell/renderer/webkit_test_runner.cc +++ b/content/shell/renderer/webkit_test_runner.cc @@ -515,9 +515,12 @@ void WebKitTestRunner::captureHistoryForWindow( history->swap(result); } +// TODO(scherkus): Remove once https://codereview.chromium.org/18130006 +// rolls into Chromium. WebMediaPlayer* WebKitTestRunner::createWebMediaPlayer( - WebFrame* frame, const WebURL& url, WebMediaPlayerClient* client) -{ + WebFrame* frame, + const WebURL& url, + WebMediaPlayerClient* client) { if (!shell_media_stream_client_) { shell_media_stream_client_.reset(new ShellMediaStreamClient()); } @@ -534,10 +537,12 @@ WebMediaPlayer* WebKitTestRunner::createWebMediaPlayer( #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()); + GetMediaThreadMessageLoopProxy(), + base::Callback<void(const base::Closure&)>(), + NULL, + NULL, + new media::MediaLog()); return new webkit_media::WebMediaPlayerImpl( frame, client, diff --git a/content/shell/renderer/webkit_test_runner.h b/content/shell/renderer/webkit_test_runner.h index d5be5c8..67c288a 100644 --- a/content/shell/renderer/webkit_test_runner.h +++ b/content/shell/renderer/webkit_test_runner.h @@ -94,6 +94,9 @@ class WebKitTestRunner : public RenderViewObserver, WebTestRunner::WebTestProxyBase* proxy, WebKit::WebVector<WebKit::WebHistoryItem>* history, size_t* currentEntryIndex); + + // TODO(scherkus): Remove once https://codereview.chromium.org/18130006 + // rolls into Chromium. virtual WebKit::WebMediaPlayer* createWebMediaPlayer( WebKit::WebFrame* frame, const WebKit::WebURL& url, @@ -134,6 +137,8 @@ class WebKitTestRunner : public RenderViewObserver, bool focus_on_next_commit_; + // TODO(scherkus): Remove this after switching to using + // RenderViewImpl::createMediaPlayer() http://crbug.com/239826 scoped_ptr<ShellMediaStreamClient> shell_media_stream_client_; DISALLOW_COPY_AND_ASSIGN(WebKitTestRunner); diff --git a/webkit/renderer/media/webkit_media.gypi b/webkit/renderer/media/webkit_media.gypi index 2873d69..f7f446f 100644 --- a/webkit/renderer/media/webkit_media.gypi +++ b/webkit/renderer/media/webkit_media.gypi @@ -62,8 +62,6 @@ 'media_stream_audio_renderer.h', 'media_stream_client.h', 'preload.h', - 'simple_video_frame_provider.cc', - 'simple_video_frame_provider.h', 'texttrack_impl.cc', 'texttrack_impl.h', 'video_frame_provider.cc', diff --git a/webkit/renderer/media/webmediaplayer_delegate.h b/webkit/renderer/media/webmediaplayer_delegate.h index 32bd9e4..9718f7c 100644 --- a/webkit/renderer/media/webmediaplayer_delegate.h +++ b/webkit/renderer/media/webmediaplayer_delegate.h @@ -17,13 +17,13 @@ class WebMediaPlayerDelegate { WebMediaPlayerDelegate() {} // The specified player started playing media. - virtual void DidPlay(WebKit::WebMediaPlayer* player) {} + virtual void DidPlay(WebKit::WebMediaPlayer* player) = 0; // The specified player stopped playing media. - virtual void DidPause(WebKit::WebMediaPlayer* player) {} + virtual void DidPause(WebKit::WebMediaPlayer* player) = 0; // The specified player was destroyed. Do not call any methods on it. - virtual void PlayerGone(WebKit::WebMediaPlayer* player) {} + virtual void PlayerGone(WebKit::WebMediaPlayer* player) = 0; protected: virtual ~WebMediaPlayerDelegate() {} diff --git a/webkit/renderer/media/webmediaplayer_impl.cc b/webkit/renderer/media/webmediaplayer_impl.cc index 08fa5da..30ba639 100644 --- a/webkit/renderer/media/webmediaplayer_impl.cc +++ b/webkit/renderer/media/webmediaplayer_impl.cc @@ -139,6 +139,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( pending_seek_seconds_(0.0f), client_(client), delegate_(delegate), + defer_load_cb_(params.defer_load_cb()), media_log_(params.media_log()), accelerated_compositing_reported_(false), incremented_externally_allocated_memory_(false), @@ -242,37 +243,26 @@ URLSchemeForHistogram URLScheme(const GURL& url) { } // anonymous namespace void WebMediaPlayerImpl::load(const WebKit::WebURL& url, CORSMode cors_mode) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - LoadSetup(url); - - // Otherwise it's a regular request which requires resolving the URL first. - GURL gurl(url); - data_source_.reset(new BufferedDataSource( - main_loop_, - frame_, - media_log_.get(), - base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr()))); - data_source_->Initialize( - url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode), - base::Bind( - &WebMediaPlayerImpl::DataSourceInitialized, - AsWeakPtr(), gurl)); - - is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); + load(url, NULL, cors_mode); } void WebMediaPlayerImpl::load(const WebKit::WebURL& url, WebKit::WebMediaSource* media_source, CORSMode cors_mode) { - LoadSetup(url); - - // Media source pipelines can start immediately. - supports_save_ = false; - StartPipeline(media_source); + if (!defer_load_cb_.is_null()) { + defer_load_cb_.Run(base::Bind( + &WebMediaPlayerImpl::DoLoad, AsWeakPtr(), url, media_source, + cors_mode)); + return; + } + DoLoad(url, media_source, cors_mode); } -void WebMediaPlayerImpl::LoadSetup(const WebKit::WebURL& url) { +void WebMediaPlayerImpl::DoLoad(const WebKit::WebURL& url, + WebKit::WebMediaSource* media_source, + CORSMode cors_mode) { + DCHECK(main_loop_->BelongsToCurrentThread()); + GURL gurl(url); UMA_HISTOGRAM_ENUMERATION("Media.URLScheme", URLScheme(gurl), kMaxURLScheme); @@ -286,6 +276,27 @@ void WebMediaPlayerImpl::LoadSetup(const WebKit::WebURL& url) { SetNetworkState(WebMediaPlayer::NetworkStateLoading); SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); + + // Media source pipelines can start immediately. + if (media_source) { + supports_save_ = false; + StartPipeline(media_source); + return; + } + + // Otherwise it's a regular request which requires resolving the URL first. + data_source_.reset(new BufferedDataSource( + main_loop_, + frame_, + media_log_.get(), + base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr()))); + data_source_->Initialize( + url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode), + base::Bind( + &WebMediaPlayerImpl::DataSourceInitialized, + AsWeakPtr(), gurl)); + + is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); } void WebMediaPlayerImpl::play() { diff --git a/webkit/renderer/media/webmediaplayer_impl.h b/webkit/renderer/media/webmediaplayer_impl.h index 804866f..a691c4d 100644 --- a/webkit/renderer/media/webmediaplayer_impl.h +++ b/webkit/renderer/media/webmediaplayer_impl.h @@ -67,7 +67,6 @@ class WebLayerImpl; namespace webkit_media { class BufferedDataSource; -class MediaStreamClient; class WebAudioSourceProviderImpl; class WebMediaPlayerDelegate; class WebMediaPlayerParams; @@ -207,8 +206,11 @@ class WebMediaPlayerImpl void SetOpaque(bool); private: - // Contains common logic used across the different types loading. - void LoadSetup(const WebKit::WebURL& url); + // Called after |defer_load_cb_| has decided to allow the load. If + // |defer_load_cb_| is null this is called immediately. + void DoLoad(const WebKit::WebURL& url, + WebKit::WebMediaSource* media_source, + CORSMode cors_mode); // Called after asynchronous initialization of a data source completed. void DataSourceInitialized(const GURL& gurl, bool success); @@ -307,7 +309,7 @@ class WebMediaPlayerImpl base::WeakPtr<WebMediaPlayerDelegate> delegate_; - MediaStreamClient* media_stream_client_; + base::Callback<void(const base::Closure&)> defer_load_cb_; scoped_refptr<media::MediaLog> media_log_; diff --git a/webkit/renderer/media/webmediaplayer_params.cc b/webkit/renderer/media/webmediaplayer_params.cc index 6bcac8d..36f190f 100644 --- a/webkit/renderer/media/webmediaplayer_params.cc +++ b/webkit/renderer/media/webmediaplayer_params.cc @@ -12,10 +12,12 @@ namespace webkit_media { WebMediaPlayerParams::WebMediaPlayerParams( const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy, + const base::Callback<void(const base::Closure&)>& defer_load_cb, 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), + defer_load_cb_(defer_load_cb), audio_renderer_sink_(audio_renderer_sink), gpu_factories_(gpu_factories), media_log_(media_log) { diff --git a/webkit/renderer/media/webmediaplayer_params.h b/webkit/renderer/media/webmediaplayer_params.h index 62a5ce1..02d23e8 100644 --- a/webkit/renderer/media/webmediaplayer_params.h +++ b/webkit/renderer/media/webmediaplayer_params.h @@ -27,6 +27,7 @@ class WebMediaPlayerParams { // all others may be null. WebMediaPlayerParams( const scoped_refptr<base::MessageLoopProxy>& message_loop_proxy, + const base::Callback<void(const base::Closure&)>& defer_load_cb, const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink, const scoped_refptr<media::GpuVideoDecoder::Factories>& gpu_factories, const scoped_refptr<media::MediaLog>& media_log); @@ -36,6 +37,10 @@ class WebMediaPlayerParams { return message_loop_proxy_; } + base::Callback<void(const base::Closure&)> defer_load_cb() const { + return defer_load_cb_; + } + const scoped_refptr<media::AudioRendererSink>& audio_renderer_sink() const { return audio_renderer_sink_; } @@ -51,6 +56,7 @@ class WebMediaPlayerParams { private: scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; + base::Callback<void(const base::Closure&)> defer_load_cb_; scoped_refptr<media::AudioRendererSink> audio_renderer_sink_; scoped_refptr<media::GpuVideoDecoder::Factories> gpu_factories_; scoped_refptr<media::MediaLog> media_log_; |