Commit 08d10f59 authored by jchen10's avatar jchen10 Committed by Commit Bot

[WebCodecs] Fix blogpost demo on ChromeOS and Android

ChromeOS only uses 1 mailbox for all yuv planes, while the current
VideoFrameYUVConverter assumes 1 mailbox for each plane. So that's
the cause of the bug. To fix that, we have to use CopySubTexture
instead.

This also adds ABGR video frame support for Android.

Bug: 1137947, 1135073
Change-Id: I600df595cf849aeee01ed39e2e36b2297dfc2d33
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2486568
Commit-Queue: Jie A Chen <jie.a.chen@intel.com>
Reviewed-by: default avatarEugene Zemtsov <eugene@chromium.org>
Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#819257}
parent 4f33eb21
......@@ -345,8 +345,9 @@ ScriptPromise VideoFrame::CreateImageBitmap(ScriptState* script_state,
if ((local_frame->IsMappable() || local_frame->HasTextures()) &&
(local_frame->format() == media::PIXEL_FORMAT_I420 ||
(local_frame->format() == media::PIXEL_FORMAT_NV12 &&
local_frame->HasTextures()))) {
(local_frame->HasTextures() &&
(local_frame->format() == media::PIXEL_FORMAT_NV12 ||
local_frame->format() == media::PIXEL_FORMAT_ABGR)))) {
scoped_refptr<StaticBitmapImage> image;
gfx::ColorSpace gfx_color_space = local_frame->ColorSpace();
gfx_color_space = gfx_color_space.GetWithMatrixAndRange(
......@@ -397,8 +398,17 @@ ScriptPromise VideoFrame::CreateImageBitmap(ScriptState* script_state,
dest_holder.sync_token = shared_image_interface->GenUnverifiedSyncToken();
dest_holder.texture_target = GL_TEXTURE_2D;
if (local_frame->NumTextures() == 1) {
ri->WaitSyncTokenCHROMIUM(dest_holder.sync_token.GetConstData());
ri->CopySubTexture(
local_frame->mailbox_holder(0).mailbox, dest_holder.mailbox,
GL_TEXTURE_2D, 0, 0, 0, 0, local_frame->coded_size().width(),
local_frame->coded_size().height(), GL_FALSE, GL_FALSE);
} else {
media::VideoFrameYUVConverter::ConvertYUVVideoFrameNoCaching(
local_frame.get(), raster_context_provider.get(), dest_holder);
}
gpu::SyncToken sync_token;
ri->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment