Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1202)

Unified Diff: media/renderers/skcanvas_video_renderer.cc

Issue 2127053004: Optimize webgl texImage2D from YUV video textures. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@skianocopy
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/renderers/skcanvas_video_renderer.cc
diff --git a/media/renderers/skcanvas_video_renderer.cc b/media/renderers/skcanvas_video_renderer.cc
index 74e72bc5a4c5338b654097de6de29fa321a9b611..96be54ab9d0337046218c23977ab0d7459209567 100644
--- a/media/renderers/skcanvas_video_renderer.cc
+++ b/media/renderers/skcanvas_video_renderer.cc
@@ -182,9 +182,9 @@ sk_sp<SkImage> NewSkImageFromVideoFrameNative(VideoFrame* video_frame,
gl->GenTextures(1, &source_texture);
DCHECK(source_texture);
gl->BindTexture(GL_TEXTURE_2D, source_texture);
- SkCanvasVideoRenderer::CopyVideoFrameSingleTextureToGLTexture(
- gl, video_frame, source_texture, GL_RGBA, GL_UNSIGNED_BYTE, true,
- false);
+ SkCanvasVideoRenderer::CopyVideoFrameTexturesToGLTexture(
+ context_3d, gl, video_frame, source_texture, GL_RGBA, GL_UNSIGNED_BYTE,
+ true, false);
} else {
gl->WaitSyncTokenCHROMIUM(mailbox_holder.sync_token.GetConstData());
source_texture = gl->CreateAndConsumeTextureCHROMIUM(
@@ -642,8 +642,9 @@ void SkCanvasVideoRenderer::ConvertVideoFrameToRGBPixels(
}
// static
-void SkCanvasVideoRenderer::CopyVideoFrameSingleTextureToGLTexture(
- gpu::gles2::GLES2Interface* gl,
+bool SkCanvasVideoRenderer::CopyVideoFrameTexturesToGLTexture(
+ const Context3D& context_3d,
+ gpu::gles2::GLES2Interface* destination_gl,
VideoFrame* video_frame,
unsigned int texture,
unsigned int internal_format,
@@ -652,30 +653,79 @@ void SkCanvasVideoRenderer::CopyVideoFrameSingleTextureToGLTexture(
bool flip_y) {
DCHECK(video_frame);
DCHECK(video_frame->HasTextures());
+ if (media::VideoFrame::NumPlanes(video_frame->format()) > 1) {
+ if (!context_3d.gr_context)
+ return false;
+ sk_sp<SkImage> image =
+ NewSkImageFromVideoFrameYUVTextures(video_frame, context_3d);
+
+ const GrGLTextureInfo* texture_info =
+ skia::GrBackendObjectToGrGLTextureInfo(image->getTextureHandle(true));
+
+ gpu::gles2::GLES2Interface* canvas_gl = context_3d.gl;
+ gpu::MailboxHolder mailbox_holder;
+ mailbox_holder.texture_target = texture_info->fTarget;
+ canvas_gl->GenMailboxCHROMIUM(mailbox_holder.mailbox.name);
+ canvas_gl->ProduceTextureDirectCHROMIUM(texture_info->fID,
Daniele Castagna 2016/07/11 18:23:36 Isn't this assuming that SkImage has only one text
+ mailbox_holder.texture_target,
+ mailbox_holder.mailbox.name);
+
+ // Wait for mailbox creation on canvas context before consuming it and
+ // copying from it on the consumer context.
+ const GLuint64 fence_sync = canvas_gl->InsertFenceSyncCHROMIUM();
+ canvas_gl->ShallowFlushCHROMIUM();
+ canvas_gl->GenSyncTokenCHROMIUM(fence_sync,
+ mailbox_holder.sync_token.GetData());
+
+ destination_gl->WaitSyncTokenCHROMIUM(
+ mailbox_holder.sync_token.GetConstData());
+ uint32_t source_texture2 = destination_gl->CreateAndConsumeTextureCHROMIUM(
+ mailbox_holder.texture_target, mailbox_holder.mailbox.name);
- const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(0);
- DCHECK(mailbox_holder.texture_target == GL_TEXTURE_2D ||
- mailbox_holder.texture_target == GL_TEXTURE_RECTANGLE_ARB ||
- mailbox_holder.texture_target == GL_TEXTURE_EXTERNAL_OES)
- << mailbox_holder.texture_target;
+ destination_gl->CopyTextureCHROMIUM(source_texture2, texture,
Daniele Castagna 2016/07/11 18:23:36 We're not validating internal_format anywhere if n
+ internal_format, type, flip_y,
+ premultiply_alpha, false);
+ destination_gl->DeleteTextures(1, &source_texture2);
+
+ // Wait for copy to complete before source texture destruction.
+ const GLuint64 dest_fence_sync = destination_gl->InsertFenceSyncCHROMIUM();
+ destination_gl->ShallowFlushCHROMIUM();
+ gpu::SyncToken dest_sync_token;
+ destination_gl->GenSyncTokenCHROMIUM(dest_fence_sync,
+ dest_sync_token.GetData());
+ canvas_gl->WaitSyncTokenCHROMIUM(dest_sync_token.GetConstData());
+
+ SyncTokenClientImpl client(canvas_gl);
+ video_frame->UpdateReleaseSyncToken(&client);
+ } else {
+ const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(0);
+ DCHECK(mailbox_holder.texture_target == GL_TEXTURE_2D ||
+ mailbox_holder.texture_target == GL_TEXTURE_RECTANGLE_ARB ||
+ mailbox_holder.texture_target == GL_TEXTURE_EXTERNAL_OES)
+ << mailbox_holder.texture_target;
+
+ destination_gl->WaitSyncTokenCHROMIUM(
+ mailbox_holder.sync_token.GetConstData());
+ uint32_t source_texture = destination_gl->CreateAndConsumeTextureCHROMIUM(
+ mailbox_holder.texture_target, mailbox_holder.mailbox.name);
+
+ // The video is stored in a unmultiplied format, so premultiply
+ // if necessary.
+ // 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.
+ destination_gl->CopyTextureCHROMIUM(source_texture, texture,
+ internal_format, type, flip_y,
+ premultiply_alpha, false);
+ destination_gl->DeleteTextures(1, &source_texture);
+ destination_gl->Flush();
+
+ SyncTokenClientImpl client(destination_gl);
+ video_frame->UpdateReleaseSyncToken(&client);
+ }
- gl->WaitSyncTokenCHROMIUM(mailbox_holder.sync_token.GetConstData());
- uint32_t source_texture = gl->CreateAndConsumeTextureCHROMIUM(
- mailbox_holder.texture_target, mailbox_holder.mailbox.name);
-
- // The video is stored in a unmultiplied format, so premultiply
- // if necessary.
- // 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.
- gl->CopyTextureCHROMIUM(source_texture, texture, internal_format, type,
- flip_y, premultiply_alpha, false);
- gl->DeleteTextures(1, &source_texture);
- gl->Flush();
-
- SyncTokenClientImpl client(gl);
- video_frame->UpdateReleaseSyncToken(&client);
+ return true;
}
void SkCanvasVideoRenderer::ResetCache() {
« content/renderer/media/webmediaplayer_ms.cc ('K') | « media/renderers/skcanvas_video_renderer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698