Index: media/blink/webmediaplayer_impl.cc |
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
index 778373b6544951b6bd7f448a52476d1f197f36fa..9f0c53db268226243b0244ab537c6ec8d81fe47f 100644 |
--- a/media/blink/webmediaplayer_impl.cc |
+++ b/media/blink/webmediaplayer_impl.cc |
@@ -22,7 +22,8 @@ |
#include "base/synchronization/waitable_event.h" |
#include "cc/blink/web_layer_impl.h" |
#include "cc/layers/video_layer.h" |
-#include "gpu/blink/webgraphicscontext3d_impl.h" |
+#include "gpu/GLES2/gl2extchromium.h" |
+#include "gpu/command_buffer/common/mailbox_holder.h" |
#include "media/audio/null_audio_sink.h" |
#include "media/base/bind_to_current_loop.h" |
#include "media/base/cdm_context.h" |
@@ -38,6 +39,7 @@ |
#include "media/blink/webcontentdecryptionmodule_impl.h" |
#include "media/blink/webinbandtexttrack_impl.h" |
#include "media/blink/webmediaplayer_delegate.h" |
+#include "media/blink/webmediaplayer_params.h" |
#include "media/blink/webmediaplayer_util.h" |
#include "media/blink/webmediasource_impl.h" |
#include "media/filters/chunk_demuxer.h" |
@@ -78,6 +80,23 @@ |
// the norms, we think 1/16x to 16x is a safe and useful range for now. |
const double kMinRate = 0.0625; |
const double kMaxRate = 16.0; |
+ |
+class SyncPointClientImpl : public media::VideoFrame::SyncPointClient { |
+ public: |
+ explicit SyncPointClientImpl( |
+ blink::WebGraphicsContext3D* web_graphics_context) |
+ : web_graphics_context_(web_graphics_context) {} |
+ ~SyncPointClientImpl() override {} |
+ uint32 InsertSyncPoint() override { |
+ return web_graphics_context_->insertSyncPoint(); |
+ } |
+ void WaitSyncPoint(uint32 sync_point) override { |
+ web_graphics_context_->waitSyncPoint(sync_point); |
+ } |
+ |
+ private: |
+ blink::WebGraphicsContext3D* web_graphics_context_; |
+}; |
} // namespace |
@@ -134,7 +153,6 @@ |
client_(client), |
delegate_(delegate), |
defer_load_cb_(params.defer_load_cb()), |
- context_3d_cb_(params.context_3d_cb()), |
supports_save_(true), |
chunk_demuxer_(NULL), |
compositor_task_runner_(params.compositor_task_runner()), |
@@ -522,18 +540,13 @@ |
GetCurrentFrameFromCompositor(); |
gfx::Rect gfx_rect(rect); |
- Context3D context_3d; |
- if (video_frame.get() && |
- video_frame->format() == VideoFrame::NATIVE_TEXTURE) { |
- if (!context_3d_cb_.is_null()) { |
- context_3d = context_3d_cb_.Run(); |
- } |
- // GPU Process crashed. |
- if (!context_3d.gl) |
- return; |
- } |
- skcanvas_video_renderer_.Paint(video_frame, canvas, gfx_rect, alpha, mode, |
- pipeline_metadata_.video_rotation, context_3d); |
+ |
+ skcanvas_video_renderer_.Paint(video_frame, |
+ canvas, |
+ gfx_rect, |
+ alpha, |
+ mode, |
+ pipeline_metadata_.video_rotation); |
} |
bool WebMediaPlayerImpl::hasSingleSecurityOrigin() const { |
@@ -593,19 +606,43 @@ |
scoped_refptr<VideoFrame> video_frame = |
GetCurrentFrameFromCompositor(); |
- if (!video_frame.get() || |
- video_frame->format() != VideoFrame::NATIVE_TEXTURE) { |
+ if (!video_frame.get()) |
return false; |
- } |
- |
- // TODO(dshwang): need more elegant way to convert WebGraphicsContext3D to |
- // GLES2Interface. |
- gpu::gles2::GLES2Interface* gl = |
- static_cast<gpu_blink::WebGraphicsContext3DImpl*>(web_graphics_context) |
- ->GetGLInterface(); |
- SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture( |
- gl, video_frame.get(), texture, level, internal_format, type, |
- premultiply_alpha, flip_y); |
+ if (video_frame->format() != VideoFrame::NATIVE_TEXTURE) |
+ return false; |
+ |
+ const gpu::MailboxHolder* mailbox_holder = video_frame->mailbox_holder(); |
+ if (mailbox_holder->texture_target != GL_TEXTURE_2D) |
+ return false; |
+ |
+ web_graphics_context->waitSyncPoint(mailbox_holder->sync_point); |
+ uint32 source_texture = web_graphics_context->createAndConsumeTextureCHROMIUM( |
+ GL_TEXTURE_2D, mailbox_holder->mailbox.name); |
+ |
+ // The video is stored in a unmultiplied format, so premultiply |
+ // if necessary. |
+ web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, |
+ premultiply_alpha); |
+ // Application itself needs to take care of setting the right flip_y |
+ // value down to get the expected result. |
+ // flip_y==true means to reverse the video orientation while |
+ // flip_y==false means to keep the intrinsic orientation. |
+ web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); |
+ web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, |
+ source_texture, |
+ texture, |
+ level, |
+ internal_format, |
+ type); |
+ web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false); |
+ web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, |
+ false); |
+ |
+ web_graphics_context->deleteTexture(source_texture); |
+ web_graphics_context->flush(); |
+ |
+ SyncPointClientImpl client(web_graphics_context); |
+ video_frame->UpdateReleaseSyncPoint(&client); |
return true; |
} |