diff options
Diffstat (limited to 'webkit/renderer')
-rw-r--r-- | webkit/renderer/media/simple_video_frame_provider.cc | 83 | ||||
-rw-r--r-- | webkit/renderer/media/simple_video_frame_provider.h | 63 | ||||
-rw-r--r-- | webkit/renderer/media/webkit_media.gypi | 2 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_delegate.h | 6 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_impl.cc | 59 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_impl.h | 10 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_params.cc | 2 | ||||
-rw-r--r-- | webkit/renderer/media/webmediaplayer_params.h | 6 |
8 files changed, 52 insertions, 179 deletions
diff --git a/webkit/renderer/media/simple_video_frame_provider.cc b/webkit/renderer/media/simple_video_frame_provider.cc deleted file mode 100644 index 1bc2323..0000000 --- a/webkit/renderer/media/simple_video_frame_provider.cc +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2013 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/renderer/media/simple_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 { - -SimpleVideoFrameProvider::SimpleVideoFrameProvider( - const gfx::Size& size, - const base::TimeDelta& frame_duration, - const base::Closure& error_cb, - const VideoFrameProvider::RepaintCB& repaint_cb) - : message_loop_proxy_(base::MessageLoopProxy::current()), - size_(size), - state_(kStopped), - frame_duration_(frame_duration), - error_cb_(error_cb), - repaint_cb_(repaint_cb) { -} - -SimpleVideoFrameProvider::~SimpleVideoFrameProvider() {} - -void SimpleVideoFrameProvider::Start() { - DVLOG(1) << "SimpleVideoFrameProvider::Start"; - DCHECK(message_loop_proxy_->BelongsToCurrentThread()); - state_ = kStarted; - message_loop_proxy_->PostTask( - FROM_HERE, - base::Bind(&SimpleVideoFrameProvider::GenerateFrame, this)); -} - -void SimpleVideoFrameProvider::Stop() { - DVLOG(1) << "SimpleVideoFrameProvider::Stop"; - DCHECK(message_loop_proxy_->BelongsToCurrentThread()); - state_ = kStopped; -} - -void SimpleVideoFrameProvider::Play() { - DVLOG(1) << "SimpleVideoFrameProvider::Play"; - DCHECK(message_loop_proxy_->BelongsToCurrentThread()); - if (state_ == kPaused) - state_ = kStarted; -} - -void SimpleVideoFrameProvider::Pause() { - DVLOG(1) << "SimpleVideoFrameProvider::Pause"; - DCHECK(message_loop_proxy_->BelongsToCurrentThread()); - if (state_ == kStarted) - state_ = kPaused; -} - -void SimpleVideoFrameProvider::GenerateFrame() { - DVLOG(1) << "SimpleVideoFrameProvider::GenerateFrame"; - DCHECK(message_loop_proxy_->BelongsToCurrentThread()); - if (state_ == kStopped) - return; - - if (state_ == kStarted) { - // Always allocate a new frame filled with white color. - scoped_refptr<media::VideoFrame> video_frame = - media::VideoFrame::CreateColorFrame( - size_, 255, 128, 128, current_time_); - - // TODO(wjia): set pixel data to pre-defined patterns if it's desired to - // verify frame content. - - repaint_cb_.Run(video_frame); - } - - current_time_ += frame_duration_; - message_loop_proxy_->PostDelayedTask( - FROM_HERE, - base::Bind(&SimpleVideoFrameProvider::GenerateFrame, this), - frame_duration_); -} - -} // namespace webkit_media diff --git a/webkit/renderer/media/simple_video_frame_provider.h b/webkit/renderer/media/simple_video_frame_provider.h deleted file mode 100644 index bcc0679..0000000 --- a/webkit/renderer/media/simple_video_frame_provider.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2013 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_RENDERER_MEDIA_SIMPLE_VIDEO_FRAME_PROVIDER_H_ -#define WEBKIT_RENDERER_MEDIA_SIMPLE_VIDEO_FRAME_PROVIDER_H_ - -#include "base/time/time.h" -#include "ui/gfx/size.h" -#include "webkit/renderer/media/video_frame_provider.h" - -namespace base { -class MessageLoopProxy; -} - -namespace webkit_media { - -// 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 { - public: - SimpleVideoFrameProvider( - const gfx::Size& size, - const base::TimeDelta& frame_duration, - const base::Closure& error_cb, - const RepaintCB& repaint_cb); - - // VideoFrameProvider implementation. - virtual void Start() OVERRIDE; - virtual void Stop() OVERRIDE; - virtual void Play() OVERRIDE; - virtual void Pause() OVERRIDE; - - protected: - virtual ~SimpleVideoFrameProvider(); - - private: - enum State { - kStarted, - kPaused, - kStopped, - }; - - void GenerateFrame(); - - scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; - gfx::Size size_; - State state_; - - base::TimeDelta current_time_; - base::TimeDelta frame_duration_; - base::Closure error_cb_; - RepaintCB repaint_cb_; - - DISALLOW_COPY_AND_ASSIGN(SimpleVideoFrameProvider); -}; - -} // namespace webkit_media - -#endif // WEBKIT_RENDERER_MEDIA_SIMPLE_VIDEO_FRAME_PROVIDER_H_ 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_; |