summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 00:35:16 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-05 00:35:16 +0000
commite00258662d708e5bb15448dfd7b99f8de396402f (patch)
tree501791407d7d1b0fce28d6fb580ae65255a3fb96 /webkit
parent3846febcaefa1bc167276c214e63ea11a9275496 (diff)
downloadchromium_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.cc11
-rw-r--r--webkit/media/webmediaplayer_proxy.cc27
-rw-r--r--webkit/media/webmediaplayer_proxy.h14
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);