diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-05 00:35:16 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-05 00:35:16 +0000 |
commit | e00258662d708e5bb15448dfd7b99f8de396402f (patch) | |
tree | 501791407d7d1b0fce28d6fb580ae65255a3fb96 /webkit | |
parent | 3846febcaefa1bc167276c214e63ea11a9275496 (diff) | |
download | chromium_src-e00258662d708e5bb15448dfd7b99f8de396402f.zip chromium_src-e00258662d708e5bb15448dfd7b99f8de396402f.tar.gz chromium_src-e00258662d708e5bb15448dfd7b99f8de396402f.tar.bz2 |
Replace VideoRendererBase Get/PutCurrentFrame() with a VideoFrame-containing callback.
BUG=108435
Review URL: https://codereview.chromium.org/12096081
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@180578 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/media/webmediaplayer_impl.cc | 11 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_proxy.cc | 27 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_proxy.h | 14 |
3 files changed, 17 insertions, 35 deletions
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc index bfa1ee5..de11726 100644 --- a/webkit/media/webmediaplayer_impl.cc +++ b/webkit/media/webmediaplayer_impl.cc @@ -191,11 +191,10 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( new media::VideoRendererBase( media_thread_.message_loop_proxy(), set_decryptor_ready_cb, - base::Bind(&WebMediaPlayerProxy::Repaint, proxy_), + base::Bind(&WebMediaPlayerProxy::FrameReady, proxy_), BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), true); filter_collection_->AddVideoRenderer(video_renderer); - proxy_->set_frame_provider(video_renderer); // Create default audio renderer using the null sink if no sink was provided. audio_source_provider_ = new WebAudioSourceProviderImpl( @@ -645,13 +644,7 @@ void WebMediaPlayerImpl::putCurrentFrame( DCHECK(frame_->view()->isAcceleratedCompositingActive()); UMA_HISTOGRAM_BOOLEAN("Media.AcceleratedCompositingActive", true); } - if (web_video_frame) { - WebVideoFrameImpl* impl = static_cast<WebVideoFrameImpl*>(web_video_frame); - proxy_->PutCurrentFrame(impl->video_frame); - delete web_video_frame; - } else { - proxy_->PutCurrentFrame(NULL); - } + delete web_video_frame; } #define COMPILE_ASSERT_MATCHING_STATUS_ENUM(webkit_name, chromium_name) \ diff --git a/webkit/media/webmediaplayer_proxy.cc b/webkit/media/webmediaplayer_proxy.cc index 3f604b3..fd30301 100644 --- a/webkit/media/webmediaplayer_proxy.cc +++ b/webkit/media/webmediaplayer_proxy.cc @@ -34,8 +34,11 @@ WebMediaPlayerProxy::~WebMediaPlayerProxy() { Detach(); } -void WebMediaPlayerProxy::Repaint() { +void WebMediaPlayerProxy::FrameReady( + const scoped_refptr<media::VideoFrame>& frame) { base::AutoLock auto_lock(lock_); + current_frame_ = frame; + if (outstanding_repaints_ < kMaxOutstandingRepaints) { ++outstanding_repaints_; @@ -48,12 +51,11 @@ void WebMediaPlayerProxy::Paint(SkCanvas* canvas, const gfx::Rect& dest_rect, uint8_t alpha) { DCHECK(render_loop_->BelongsToCurrentThread()); - if (frame_provider_) { - scoped_refptr<media::VideoFrame> video_frame; - frame_provider_->GetCurrentFrame(&video_frame); - video_renderer_.Paint(video_frame, canvas, dest_rect, alpha); - frame_provider_->PutCurrentFrame(video_frame); - } + + // Use GetCurrentFrame() to avoid locking while painting in software. + scoped_refptr<media::VideoFrame> video_frame; + GetCurrentFrame(&video_frame); + video_renderer_.Paint(video_frame, canvas, dest_rect, alpha); } bool WebMediaPlayerProxy::HasSingleOrigin() { @@ -80,7 +82,6 @@ void WebMediaPlayerProxy::Detach() { DCHECK(render_loop_->BelongsToCurrentThread()); webmediaplayer_ = NULL; data_source_ = NULL; - frame_provider_ = NULL; } void WebMediaPlayerProxy::RepaintTask() { @@ -97,14 +98,8 @@ void WebMediaPlayerProxy::RepaintTask() { void WebMediaPlayerProxy::GetCurrentFrame( scoped_refptr<media::VideoFrame>* frame_out) { - if (frame_provider_) - frame_provider_->GetCurrentFrame(frame_out); -} - -void WebMediaPlayerProxy::PutCurrentFrame( - scoped_refptr<media::VideoFrame> frame) { - if (frame_provider_) - frame_provider_->PutCurrentFrame(frame); + base::AutoLock auto_lock(lock_); + *frame_out = current_frame_; } } // namespace webkit_media diff --git a/webkit/media/webmediaplayer_proxy.h b/webkit/media/webmediaplayer_proxy.h index 7d9f5a2..fc5519344 100644 --- a/webkit/media/webmediaplayer_proxy.h +++ b/webkit/media/webmediaplayer_proxy.h @@ -44,20 +44,14 @@ class WebMediaPlayerProxy data_source_ = data_source; } - // TODO(scherkus): remove this once VideoRendererBase::PaintCB passes - // ownership of the VideoFrame http://crbug.com/108435 - void set_frame_provider(media::VideoRendererBase* frame_provider) { - frame_provider_ = frame_provider; - } - - // Methods for Filter -> WebMediaPlayerImpl communication. - void Repaint(); + // Called by VideoRendererBase on its internal thread with the new frame to be + // painted. + void FrameReady(const scoped_refptr<media::VideoFrame>& frame); // Methods for WebMediaPlayerImpl -> Filter communication. void Paint(SkCanvas* canvas, const gfx::Rect& dest_rect, uint8_t alpha); void Detach(); void GetCurrentFrame(scoped_refptr<media::VideoFrame>* frame_out); - void PutCurrentFrame(scoped_refptr<media::VideoFrame> frame); bool HasSingleOrigin(); bool DidPassCORSAccessCheck() const; @@ -75,10 +69,10 @@ class WebMediaPlayerProxy WebMediaPlayerImpl* webmediaplayer_; scoped_refptr<BufferedDataSource> data_source_; - scoped_refptr<media::VideoRendererBase> frame_provider_; media::SkCanvasVideoRenderer video_renderer_; base::Lock lock_; + scoped_refptr<media::VideoFrame> current_frame_; int outstanding_repaints_; DISALLOW_IMPLICIT_CONSTRUCTORS(WebMediaPlayerProxy); |