Commit 39b503c6 authored by Wan-Teh Chang's avatar Wan-Teh Chang Committed by Commit Bot

Use libyuv::I420AlphaToARGBMatrix()

Use libyuv::I420AlphaToARGBMatrix() to convert 8-bit YUV 4:2:0 with
alpha to ARGB for all four color spaces. The libyuv::I420AlphaToARGB()
function we used before only works for the BT.601 color space.

Change-Id: I35e714c26cd2930a9d6e5cb8276a8ceb221a2632
Bug: 1098541
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2261482
Commit-Queue: Wan-Teh Chang <wtc@google.com>
Reviewed-by: default avatarPeter Kasting <pkasting@chromium.org>
Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#822819}
parent baadb045
......@@ -54,7 +54,7 @@
#define LIBYUV_I422_TO_ARGB libyuv::I422ToARGB
#define LIBYUV_I444_TO_ARGB libyuv::I444ToARGB
#define LIBYUV_I420ALPHA_TO_ARGB libyuv::I420AlphaToARGB
#define LIBYUV_I420ALPHA_TO_ARGB_MATRIX libyuv::I420AlphaToARGBMatrix
#define LIBYUV_J400_TO_ARGB libyuv::J400ToARGB
#define LIBYUV_J420_TO_ARGB libyuv::J420ToARGB
......@@ -93,7 +93,7 @@
#define LIBYUV_I422_TO_ARGB libyuv::I422ToABGR
#define LIBYUV_I444_TO_ARGB libyuv::I444ToABGR
#define LIBYUV_I420ALPHA_TO_ARGB libyuv::I420AlphaToABGR
#define LIBYUV_I420ALPHA_TO_ARGB_MATRIX libyuv::I420AlphaToABGRMatrix
#define LIBYUV_J400_TO_ARGB libyuv::J400ToARGB
#define LIBYUV_J420_TO_ARGB libyuv::J420ToABGR
......@@ -470,15 +470,58 @@ void ConvertVideoFrameToRGBPixelsTask(const VideoFrame* video_frame,
break;
case PIXEL_FORMAT_I420A:
LIBYUV_I420ALPHA_TO_ARGB(plane_meta[VideoFrame::kYPlane].data,
plane_meta[VideoFrame::kYPlane].stride,
plane_meta[VideoFrame::kUPlane].data,
plane_meta[VideoFrame::kUPlane].stride,
plane_meta[VideoFrame::kVPlane].data,
plane_meta[VideoFrame::kVPlane].stride,
plane_meta[VideoFrame::kAPlane].data,
plane_meta[VideoFrame::kAPlane].stride, pixels,
row_bytes, width, rows, premultiply_alpha);
switch (color_space) {
case kJPEG_SkYUVColorSpace:
LIBYUV_I420ALPHA_TO_ARGB_MATRIX(
plane_meta[VideoFrame::kYPlane].data,
plane_meta[VideoFrame::kYPlane].stride,
plane_meta[VideoFrame::kUPlane].data,
plane_meta[VideoFrame::kUPlane].stride,
plane_meta[VideoFrame::kVPlane].data,
plane_meta[VideoFrame::kVPlane].stride,
plane_meta[VideoFrame::kAPlane].data,
plane_meta[VideoFrame::kAPlane].stride, pixels, row_bytes,
&libyuv::kYuvJPEGConstants, width, rows, premultiply_alpha);
break;
case kRec709_SkYUVColorSpace:
LIBYUV_I420ALPHA_TO_ARGB_MATRIX(
plane_meta[VideoFrame::kYPlane].data,
plane_meta[VideoFrame::kYPlane].stride,
plane_meta[VideoFrame::kUPlane].data,
plane_meta[VideoFrame::kUPlane].stride,
plane_meta[VideoFrame::kVPlane].data,
plane_meta[VideoFrame::kVPlane].stride,
plane_meta[VideoFrame::kAPlane].data,
plane_meta[VideoFrame::kAPlane].stride, pixels, row_bytes,
&libyuv::kYuvH709Constants, width, rows, premultiply_alpha);
break;
case kRec601_SkYUVColorSpace:
LIBYUV_I420ALPHA_TO_ARGB_MATRIX(
plane_meta[VideoFrame::kYPlane].data,
plane_meta[VideoFrame::kYPlane].stride,
plane_meta[VideoFrame::kUPlane].data,
plane_meta[VideoFrame::kUPlane].stride,
plane_meta[VideoFrame::kVPlane].data,
plane_meta[VideoFrame::kVPlane].stride,
plane_meta[VideoFrame::kAPlane].data,
plane_meta[VideoFrame::kAPlane].stride, pixels, row_bytes,
&libyuv::kYuvI601Constants, width, rows, premultiply_alpha);
break;
case kBT2020_SkYUVColorSpace:
LIBYUV_I420ALPHA_TO_ARGB_MATRIX(
plane_meta[VideoFrame::kYPlane].data,
plane_meta[VideoFrame::kYPlane].stride,
plane_meta[VideoFrame::kUPlane].data,
plane_meta[VideoFrame::kUPlane].stride,
plane_meta[VideoFrame::kVPlane].data,
plane_meta[VideoFrame::kVPlane].stride,
plane_meta[VideoFrame::kAPlane].data,
plane_meta[VideoFrame::kAPlane].stride, pixels, row_bytes,
&libyuv::kYuv2020Constants, width, rows, premultiply_alpha);
break;
default:
NOTREACHED();
}
break;
case PIXEL_FORMAT_I444:
......
......@@ -109,17 +109,17 @@ bool IsColorSpaceSupportedByPCVR(const avifImage* image) {
SkYUVColorSpace yuv_color_space;
if (!GetColorSpace(image).ToSkYUVColorSpace(image->depth, &yuv_color_space))
return false;
if (!image->alphaPlane) {
return yuv_color_space == kJPEG_Full_SkYUVColorSpace ||
yuv_color_space == kRec601_Limited_SkYUVColorSpace ||
yuv_color_space == kRec709_Limited_SkYUVColorSpace ||
yuv_color_space == kBT2020_8bit_Limited_SkYUVColorSpace;
}
const bool color_space_is_supported =
yuv_color_space == kJPEG_Full_SkYUVColorSpace ||
yuv_color_space == kRec601_Limited_SkYUVColorSpace ||
yuv_color_space == kRec709_Limited_SkYUVColorSpace ||
yuv_color_space == kBT2020_8bit_Limited_SkYUVColorSpace;
// libyuv supports the alpha channel only with the I420 pixel format, which is
// 8-bit YUV 4:2:0 with kRec601_Limited_SkYUVColorSpace.
return image->depth == 8 && image->yuvFormat == AVIF_PIXEL_FORMAT_YUV420 &&
yuv_color_space == kRec601_Limited_SkYUVColorSpace &&
image->alphaRange == AVIF_RANGE_FULL;
// 8-bit YUV 4:2:0.
return color_space_is_supported &&
(!image->alphaPlane ||
(image->depth == 8 && image->yuvFormat == AVIF_PIXEL_FORMAT_YUV420 &&
image->alphaRange == AVIF_RANGE_FULL));
}
media::VideoPixelFormat AvifToVideoPixelFormat(avifPixelFormat fmt, int depth) {
......
......@@ -127,7 +127,7 @@ StaticColorCheckParam kTestParams[] = {
ImageDecoder::kLosslessFormat,
ImageDecoder::kAlphaNotPremultiplied,
ColorBehavior::Tag(),
1,
3,
{
{gfx::Point(0, 0), SkColorSetARGB(0, 255, 0, 0)},
{gfx::Point(1, 1), SkColorSetARGB(128, 255, 0, 0)},
......@@ -211,7 +211,7 @@ StaticColorCheckParam kTestParams[] = {
ImageDecoder::kLosslessFormat,
ImageDecoder::kAlphaPremultiplied,
ColorBehavior::TransformToSRGB(),
1,
3,
{
{gfx::Point(0, 0), SkColorSetARGB(0, 0, 0, 0)},
{gfx::Point(1, 1), SkColorSetARGB(128, 255, 0, 0)},
......
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