mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-08 01:36:47 +08:00
Add U444ToABGR, J444ToABGR, H444ToABGR, H444ToARGB and ConvertToARGB support
BUG=960620, libyuv:845, b/129864744 Change-Id: I9f80cda3be8e13298c596fac514f65a23a38d3d0 Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/1900310 Reviewed-by: Dale Curtis <dalecurtis@chromium.org> Commit-Queue: Frank Barchard <fbarchard@chromium.org>
This commit is contained in:
parent
53e014c99d
commit
1f12946068
@ -1,6 +1,6 @@
|
||||
Name: libyuv
|
||||
URL: http://code.google.com/p/libyuv/
|
||||
Version: 1739
|
||||
Version: 1740
|
||||
License: BSD
|
||||
License File: LICENSE
|
||||
|
||||
|
||||
@ -37,7 +37,6 @@ int ARGBCopy(const uint8_t* src_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
|
||||
// Convert I420 to ARGB.
|
||||
LIBYUV_API
|
||||
int I420ToARGB(const uint8_t* src_y,
|
||||
@ -142,6 +141,214 @@ int U420ToABGR(const uint8_t* src_y,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I422 to ARGB.
|
||||
LIBYUV_API
|
||||
int I422ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I422 to ABGR.
|
||||
LIBYUV_API
|
||||
int I422ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert J422 to ARGB.
|
||||
LIBYUV_API
|
||||
int J422ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert J422 to ABGR.
|
||||
LIBYUV_API
|
||||
int J422ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert H422 to ARGB.
|
||||
LIBYUV_API
|
||||
int H422ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert H422 to ABGR.
|
||||
LIBYUV_API
|
||||
int H422ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert U422 to ARGB.
|
||||
LIBYUV_API
|
||||
int U422ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert U422 to ABGR.
|
||||
LIBYUV_API
|
||||
int U422ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I444 to ARGB.
|
||||
LIBYUV_API
|
||||
int I444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I444 to ABGR.
|
||||
LIBYUV_API
|
||||
int I444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert J444 to ARGB.
|
||||
LIBYUV_API
|
||||
int J444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert J444 to ABGR.
|
||||
LIBYUV_API
|
||||
int J444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert H444 to ARGB.
|
||||
LIBYUV_API
|
||||
int H444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert H444 to ABGR.
|
||||
LIBYUV_API
|
||||
int H444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert U444 to ARGB.
|
||||
LIBYUV_API
|
||||
int U444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert U444 to ABGR.
|
||||
LIBYUV_API
|
||||
int U444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I010 to ARGB.
|
||||
LIBYUV_API
|
||||
int I010ToARGB(const uint16_t* src_y,
|
||||
@ -232,72 +439,6 @@ int U010ToABGR(const uint16_t* src_y,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I422 to ARGB.
|
||||
LIBYUV_API
|
||||
int I422ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I444 to ARGB.
|
||||
LIBYUV_API
|
||||
int I444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert U444 to ARGB.
|
||||
LIBYUV_API
|
||||
int U444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert J444 to ARGB.
|
||||
LIBYUV_API
|
||||
int J444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I444 to ABGR.
|
||||
LIBYUV_API
|
||||
int I444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert I420 with Alpha to preattenuated ARGB.
|
||||
LIBYUV_API
|
||||
int I420AlphaToARGB(const uint8_t* src_y,
|
||||
@ -477,71 +618,6 @@ int UYVYToARGB(const uint8_t* src_uyvy,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert J422 to ARGB.
|
||||
LIBYUV_API
|
||||
int J422ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert J422 to ABGR.
|
||||
LIBYUV_API
|
||||
int J422ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert H422 to ARGB.
|
||||
LIBYUV_API
|
||||
int H422ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert U422 to ARGB.
|
||||
LIBYUV_API
|
||||
int U422ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert H422 to ABGR.
|
||||
LIBYUV_API
|
||||
int H422ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
// Convert H010 to ARGB.
|
||||
LIBYUV_API
|
||||
int H010ToARGB(const uint16_t* src_y,
|
||||
|
||||
@ -11,6 +11,6 @@
|
||||
#ifndef INCLUDE_LIBYUV_VERSION_H_
|
||||
#define INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
#define LIBYUV_VERSION 1739
|
||||
#define LIBYUV_VERSION 1740
|
||||
|
||||
#endif // INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
@ -82,15 +82,18 @@ enum FourCC {
|
||||
// 1 Primary Compressed YUV format.
|
||||
FOURCC_MJPG = FOURCC('M', 'J', 'P', 'G'),
|
||||
|
||||
// 11 Auxiliary YUV variations: 3 with U and V planes are swapped, 1 Alias.
|
||||
// 14 Auxiliary YUV variations: 3 with U and V planes are swapped, 1 Alias.
|
||||
FOURCC_YV12 = FOURCC('Y', 'V', '1', '2'),
|
||||
FOURCC_YV16 = FOURCC('Y', 'V', '1', '6'),
|
||||
FOURCC_YV24 = FOURCC('Y', 'V', '2', '4'),
|
||||
FOURCC_YU12 = FOURCC('Y', 'U', '1', '2'), // Linux version of I420.
|
||||
FOURCC_J420 = FOURCC('J', '4', '2', '0'),
|
||||
FOURCC_J400 = FOURCC('J', '4', '0', '0'), // unofficial fourcc
|
||||
FOURCC_H420 = FOURCC('H', '4', '2', '0'), // unofficial fourcc
|
||||
FOURCC_H422 = FOURCC('H', '4', '2', '2'), // unofficial fourcc
|
||||
FOURCC_J420 = FOURCC('J', '4', '2', '0'), // jpeg (bt.601 full), unofficial fourcc
|
||||
FOURCC_J422 = FOURCC('J', '4', '2', '2'), // jpeg (bt.601 full), unofficial fourcc
|
||||
FOURCC_J444 = FOURCC('J', '4', '4', '4'), // jpeg (bt.601 full), unofficial fourcc
|
||||
FOURCC_J400 = FOURCC('J', '4', '0', '0'), // jpeg (bt.601 full), unofficial fourcc
|
||||
FOURCC_H420 = FOURCC('H', '4', '2', '0'), // bt.709, unofficial fourcc
|
||||
FOURCC_H422 = FOURCC('H', '4', '2', '2'), // bt.709, unofficial fourcc
|
||||
FOURCC_H444 = FOURCC('H', '4', '4', '4'), // bt.709, unofficial fourcc
|
||||
FOURCC_U420 = FOURCC('U', '4', '2', '0'), // bt.2020, unofficial fourcc
|
||||
FOURCC_U422 = FOURCC('U', '4', '2', '2'), // bt.2020, unofficial fourcc
|
||||
FOURCC_U444 = FOURCC('U', '4', '4', '4'), // bt.2020, unofficial fourcc
|
||||
|
||||
@ -443,6 +443,25 @@ int H422ToARGB(const uint8_t* src_y,
|
||||
&kYuvH709Constants, width, height);
|
||||
}
|
||||
|
||||
// Convert H422 to ABGR.
|
||||
LIBYUV_API
|
||||
int H422ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height) {
|
||||
return I422ToARGBMatrix(src_y, src_stride_y, src_v,
|
||||
src_stride_v, // Swap U and V
|
||||
src_u, src_stride_u, dst_abgr, dst_stride_abgr,
|
||||
&kYvuH709Constants, // Use Yvu matrix
|
||||
width, height);
|
||||
}
|
||||
|
||||
// Convert U422 to ARGB.
|
||||
LIBYUV_API
|
||||
int U422ToARGB(const uint8_t* src_y,
|
||||
@ -460,9 +479,9 @@ int U422ToARGB(const uint8_t* src_y,
|
||||
&kYuv2020Constants, width, height);
|
||||
}
|
||||
|
||||
// Convert H422 to ABGR.
|
||||
// Convert U422 to ABGR.
|
||||
LIBYUV_API
|
||||
int H422ToABGR(const uint8_t* src_y,
|
||||
int U422ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
@ -473,12 +492,240 @@ int H422ToABGR(const uint8_t* src_y,
|
||||
int width,
|
||||
int height) {
|
||||
return I422ToARGBMatrix(src_y, src_stride_y, src_v,
|
||||
src_stride_v, // Swap U and V
|
||||
src_u, src_stride_u, dst_abgr, dst_stride_abgr,
|
||||
&kYvu2020Constants, // Use Yvu matrix
|
||||
width, height);
|
||||
}
|
||||
|
||||
// Convert I444 to ARGB with matrix
|
||||
static int I444ToARGBMatrix(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
const struct YuvConstants* yuvconstants,
|
||||
int width,
|
||||
int height) {
|
||||
int y;
|
||||
void (*I444ToARGBRow)(const uint8_t* y_buf, const uint8_t* u_buf,
|
||||
const uint8_t* v_buf, uint8_t* rgb_buf,
|
||||
const struct YuvConstants* yuvconstants, int width) =
|
||||
I444ToARGBRow_C;
|
||||
if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) {
|
||||
return -1;
|
||||
}
|
||||
// Negative height means invert the image.
|
||||
if (height < 0) {
|
||||
height = -height;
|
||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
||||
dst_stride_argb = -dst_stride_argb;
|
||||
}
|
||||
// Coalesce rows.
|
||||
if (src_stride_y == width && src_stride_u == width && src_stride_v == width &&
|
||||
dst_stride_argb == width * 4) {
|
||||
width *= height;
|
||||
height = 1;
|
||||
src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
|
||||
}
|
||||
#if defined(HAS_I444TOARGBROW_SSSE3)
|
||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_SSSE3;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
I444ToARGBRow = I444ToARGBRow_SSSE3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_I444TOARGBROW_AVX2)
|
||||
if (TestCpuFlag(kCpuHasAVX2)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_AVX2;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
I444ToARGBRow = I444ToARGBRow_AVX2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_I444TOARGBROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_NEON;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
I444ToARGBRow = I444ToARGBRow_NEON;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_I444TOARGBROW_MSA)
|
||||
if (TestCpuFlag(kCpuHasMSA)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_MSA;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
I444ToARGBRow = I444ToARGBRow_MSA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_I444TOARGBROW_MMI)
|
||||
if (TestCpuFlag(kCpuHasMMI)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_MMI;
|
||||
if (IS_ALIGNED(width, 4)) {
|
||||
I444ToARGBRow = I444ToARGBRow_MMI;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for (y = 0; y < height; ++y) {
|
||||
I444ToARGBRow(src_y, src_u, src_v, dst_argb, yuvconstants, width);
|
||||
dst_argb += dst_stride_argb;
|
||||
src_y += src_stride_y;
|
||||
src_u += src_stride_u;
|
||||
src_v += src_stride_v;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Convert I444 to ARGB.
|
||||
LIBYUV_API
|
||||
int I444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v,
|
||||
src_stride_v, dst_argb, dst_stride_argb,
|
||||
&kYuvI601Constants, width, height);
|
||||
}
|
||||
|
||||
// Convert I444 to ABGR.
|
||||
LIBYUV_API
|
||||
int I444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_v,
|
||||
src_stride_v, // Swap U and V
|
||||
src_u, src_stride_u, dst_abgr, dst_stride_abgr,
|
||||
&kYvuI601Constants, // Use Yvu matrix
|
||||
width, height);
|
||||
}
|
||||
|
||||
// Convert J444 to ARGB.
|
||||
LIBYUV_API
|
||||
int J444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v,
|
||||
src_stride_v, dst_argb, dst_stride_argb,
|
||||
&kYuvJPEGConstants, width, height);
|
||||
}
|
||||
|
||||
// Convert J444 to ABGR.
|
||||
LIBYUV_API
|
||||
int J444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_v,
|
||||
src_stride_v, // Swap U and V
|
||||
src_u, src_stride_u, dst_abgr, dst_stride_abgr,
|
||||
&kYvuJPEGConstants, // Use Yvu matrix
|
||||
width, height);
|
||||
}
|
||||
|
||||
// Convert H444 to ARGB.
|
||||
LIBYUV_API
|
||||
int H444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v,
|
||||
src_stride_v, dst_argb, dst_stride_argb,
|
||||
&kYuvH709Constants, width, height);
|
||||
}
|
||||
|
||||
// Convert H444 to ABGR.
|
||||
LIBYUV_API
|
||||
int H444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_v,
|
||||
src_stride_v, // Swap U and V
|
||||
src_u, src_stride_u, dst_abgr, dst_stride_abgr,
|
||||
&kYvuH709Constants, // Use Yvu matrix
|
||||
width, height);
|
||||
}
|
||||
|
||||
// Convert U444 to ARGB.
|
||||
LIBYUV_API
|
||||
int U444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v,
|
||||
src_stride_v, dst_argb, dst_stride_argb,
|
||||
&kYuv2020Constants, width, height);
|
||||
}
|
||||
|
||||
// Convert U444 to ABGR.
|
||||
LIBYUV_API
|
||||
int U444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_v,
|
||||
src_stride_v, // Swap U and V
|
||||
src_u, src_stride_u, dst_abgr, dst_stride_abgr,
|
||||
&kYvu2020Constants, // Use Yvu matrix
|
||||
width, height);
|
||||
}
|
||||
|
||||
// Convert 10 bit YUV to ARGB with matrix
|
||||
// TODO(fbarchard): Consider passing scale multiplier to I210ToARGB to
|
||||
// multiply 10 bit yuv into high bits to allow any number of bits.
|
||||
@ -807,160 +1054,6 @@ int U010ToABGR(const uint16_t* src_y,
|
||||
width, height);
|
||||
}
|
||||
|
||||
// Convert I444 to ARGB with matrix
|
||||
static int I444ToARGBMatrix(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
const struct YuvConstants* yuvconstants,
|
||||
int width,
|
||||
int height) {
|
||||
int y;
|
||||
void (*I444ToARGBRow)(const uint8_t* y_buf, const uint8_t* u_buf,
|
||||
const uint8_t* v_buf, uint8_t* rgb_buf,
|
||||
const struct YuvConstants* yuvconstants, int width) =
|
||||
I444ToARGBRow_C;
|
||||
if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) {
|
||||
return -1;
|
||||
}
|
||||
// Negative height means invert the image.
|
||||
if (height < 0) {
|
||||
height = -height;
|
||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
||||
dst_stride_argb = -dst_stride_argb;
|
||||
}
|
||||
// Coalesce rows.
|
||||
if (src_stride_y == width && src_stride_u == width && src_stride_v == width &&
|
||||
dst_stride_argb == width * 4) {
|
||||
width *= height;
|
||||
height = 1;
|
||||
src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
|
||||
}
|
||||
#if defined(HAS_I444TOARGBROW_SSSE3)
|
||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_SSSE3;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
I444ToARGBRow = I444ToARGBRow_SSSE3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_I444TOARGBROW_AVX2)
|
||||
if (TestCpuFlag(kCpuHasAVX2)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_AVX2;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
I444ToARGBRow = I444ToARGBRow_AVX2;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_I444TOARGBROW_NEON)
|
||||
if (TestCpuFlag(kCpuHasNEON)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_NEON;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
I444ToARGBRow = I444ToARGBRow_NEON;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_I444TOARGBROW_MSA)
|
||||
if (TestCpuFlag(kCpuHasMSA)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_MSA;
|
||||
if (IS_ALIGNED(width, 8)) {
|
||||
I444ToARGBRow = I444ToARGBRow_MSA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_I444TOARGBROW_MMI)
|
||||
if (TestCpuFlag(kCpuHasMMI)) {
|
||||
I444ToARGBRow = I444ToARGBRow_Any_MMI;
|
||||
if (IS_ALIGNED(width, 4)) {
|
||||
I444ToARGBRow = I444ToARGBRow_MMI;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for (y = 0; y < height; ++y) {
|
||||
I444ToARGBRow(src_y, src_u, src_v, dst_argb, yuvconstants, width);
|
||||
dst_argb += dst_stride_argb;
|
||||
src_y += src_stride_y;
|
||||
src_u += src_stride_u;
|
||||
src_v += src_stride_v;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Convert I444 to ARGB.
|
||||
LIBYUV_API
|
||||
int I444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v,
|
||||
src_stride_v, dst_argb, dst_stride_argb,
|
||||
&kYuvI601Constants, width, height);
|
||||
}
|
||||
|
||||
// Convert U444 to ARGB.
|
||||
LIBYUV_API
|
||||
int U444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v,
|
||||
src_stride_v, dst_argb, dst_stride_argb,
|
||||
&kYuv2020Constants, width, height);
|
||||
}
|
||||
|
||||
// Convert I444 to ABGR.
|
||||
LIBYUV_API
|
||||
int I444ToABGR(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_abgr,
|
||||
int dst_stride_abgr,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_v,
|
||||
src_stride_v, // Swap U and V
|
||||
src_u, src_stride_u, dst_abgr, dst_stride_abgr,
|
||||
&kYvuI601Constants, // Use Yvu matrix
|
||||
width, height);
|
||||
}
|
||||
|
||||
// Convert J444 to ARGB.
|
||||
LIBYUV_API
|
||||
int J444ToARGB(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
const uint8_t* src_u,
|
||||
int src_stride_u,
|
||||
const uint8_t* src_v,
|
||||
int src_stride_v,
|
||||
uint8_t* dst_argb,
|
||||
int dst_stride_argb,
|
||||
int width,
|
||||
int height) {
|
||||
return I444ToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v,
|
||||
src_stride_v, dst_argb, dst_stride_argb,
|
||||
&kYuvJPEGConstants, width, height);
|
||||
}
|
||||
|
||||
// Convert I420 with Alpha to preattenuated ARGB.
|
||||
static int I420AlphaToARGBMatrix(const uint8_t* src_y,
|
||||
int src_stride_y,
|
||||
|
||||
@ -32,9 +32,6 @@ extern "C" {
|
||||
// TODO(fbarchard): Add the following:
|
||||
// H010ToARGB
|
||||
// I010ToARGB
|
||||
// J400ToARGB
|
||||
// J422ToARGB
|
||||
// J444ToARGB
|
||||
|
||||
LIBYUV_API
|
||||
int ConvertToARGB(const uint8_t* sample,
|
||||
@ -161,6 +158,11 @@ int ConvertToARGB(const uint8_t* sample,
|
||||
r = I400ToARGB(src, src_width, dst_argb, dst_stride_argb, crop_width,
|
||||
inv_crop_height);
|
||||
break;
|
||||
case FOURCC_J400:
|
||||
src = sample + src_width * crop_y + crop_x;
|
||||
r = J400ToARGB(src, src_width, dst_argb, dst_stride_argb, crop_width,
|
||||
inv_crop_height);
|
||||
break;
|
||||
|
||||
// Biplanar formats
|
||||
case FOURCC_NV12:
|
||||
@ -269,6 +271,18 @@ int ConvertToARGB(const uint8_t* sample,
|
||||
break;
|
||||
}
|
||||
|
||||
case FOURCC_J422: {
|
||||
int halfwidth = (src_width + 1) / 2;
|
||||
const uint8_t* src_y = sample + src_width * crop_y + crop_x;
|
||||
const uint8_t* src_u =
|
||||
sample + src_width * abs_src_height + halfwidth * crop_y + crop_x / 2;
|
||||
const uint8_t* src_v = sample + src_width * abs_src_height +
|
||||
halfwidth * (abs_src_height + crop_y) + crop_x / 2;
|
||||
r = J422ToARGB(src_y, src_width, src_u, halfwidth, src_v, halfwidth,
|
||||
dst_argb, dst_stride_argb, crop_width, inv_crop_height);
|
||||
break;
|
||||
}
|
||||
|
||||
case FOURCC_H422: {
|
||||
int halfwidth = (src_width + 1) / 2;
|
||||
const uint8_t* src_y = sample + src_width * crop_y + crop_x;
|
||||
@ -281,6 +295,18 @@ int ConvertToARGB(const uint8_t* sample,
|
||||
break;
|
||||
}
|
||||
|
||||
case FOURCC_U422: {
|
||||
int halfwidth = (src_width + 1) / 2;
|
||||
const uint8_t* src_y = sample + src_width * crop_y + crop_x;
|
||||
const uint8_t* src_u =
|
||||
sample + src_width * abs_src_height + halfwidth * crop_y + crop_x / 2;
|
||||
const uint8_t* src_v = sample + src_width * abs_src_height +
|
||||
halfwidth * (abs_src_height + crop_y) + crop_x / 2;
|
||||
r = H422ToARGB(src_y, src_width, src_u, halfwidth, src_v, halfwidth,
|
||||
dst_argb, dst_stride_argb, crop_width, inv_crop_height);
|
||||
break;
|
||||
}
|
||||
|
||||
case FOURCC_I444:
|
||||
case FOURCC_YV24: {
|
||||
const uint8_t* src_y = sample + src_width * crop_y + crop_x;
|
||||
@ -297,6 +323,40 @@ int ConvertToARGB(const uint8_t* sample,
|
||||
dst_argb, dst_stride_argb, crop_width, inv_crop_height);
|
||||
break;
|
||||
}
|
||||
|
||||
case FOURCC_J444: {
|
||||
const uint8_t* src_y = sample + src_width * crop_y + crop_x;
|
||||
const uint8_t* src_u;
|
||||
const uint8_t* src_v;
|
||||
src_u = sample + src_width * (abs_src_height + crop_y) + crop_x;
|
||||
src_v = sample + src_width * (abs_src_height * 2 + crop_y) + crop_x;
|
||||
r = J444ToARGB(src_y, src_width, src_u, src_width, src_v, src_width,
|
||||
dst_argb, dst_stride_argb, crop_width, inv_crop_height);
|
||||
break;
|
||||
}
|
||||
|
||||
case FOURCC_H444: {
|
||||
const uint8_t* src_y = sample + src_width * crop_y + crop_x;
|
||||
const uint8_t* src_u;
|
||||
const uint8_t* src_v;
|
||||
src_u = sample + src_width * (abs_src_height + crop_y) + crop_x;
|
||||
src_v = sample + src_width * (abs_src_height * 2 + crop_y) + crop_x;
|
||||
r = H444ToARGB(src_y, src_width, src_u, src_width, src_v, src_width,
|
||||
dst_argb, dst_stride_argb, crop_width, inv_crop_height);
|
||||
break;
|
||||
}
|
||||
|
||||
case FOURCC_U444: {
|
||||
const uint8_t* src_y = sample + src_width * crop_y + crop_x;
|
||||
const uint8_t* src_u;
|
||||
const uint8_t* src_v;
|
||||
src_u = sample + src_width * (abs_src_height + crop_y) + crop_x;
|
||||
src_v = sample + src_width * (abs_src_height * 2 + crop_y) + crop_x;
|
||||
r = U444ToARGB(src_y, src_width, src_u, src_width, src_v, src_width,
|
||||
dst_argb, dst_stride_argb, crop_width, inv_crop_height);
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef HAVE_JPEG
|
||||
case FOURCC_MJPG:
|
||||
r = MJPGToARGB(sample, sample_size, dst_argb, dst_stride_argb, src_width,
|
||||
|
||||
@ -84,7 +84,7 @@ static const uvec8 kAddUV128 = {128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u,
|
||||
128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u};
|
||||
|
||||
static const uvec16 kSub128 = {0x8080u, 0x8080u, 0x8080u, 0x8080u,
|
||||
0x8080u, 0x8080u, 0x8080u, 0x8080u};
|
||||
0x8080u, 0x8080u, 0x8080u, 0x8080u};
|
||||
|
||||
#endif // defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3)
|
||||
|
||||
@ -1101,8 +1101,10 @@ void ABGRToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width) {
|
||||
"lea 0x40(%0),%0 \n" \
|
||||
"phaddw %%xmm0,%%xmm6 \n" \
|
||||
"phaddw %%xmm2,%%xmm1 \n" \
|
||||
"paddw %%" #round ",%%xmm6 \n" \
|
||||
"paddw %%" #round ",%%xmm1 \n" \
|
||||
"paddw %%" #round \
|
||||
",%%xmm6 \n" \
|
||||
"paddw %%" #round \
|
||||
",%%xmm1 \n" \
|
||||
"psrlw $0x8,%%xmm6 \n" \
|
||||
"psrlw $0x8,%%xmm1 \n" \
|
||||
"packuswb %%xmm1,%%xmm6 \n" \
|
||||
@ -1111,33 +1113,35 @@ void ABGRToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width) {
|
||||
"sub $0x10,%2 \n" \
|
||||
"jg 1b \n"
|
||||
|
||||
#define RGBTOY_AVX2(round) \
|
||||
"1: \n" \
|
||||
"vmovdqu (%0),%%ymm0 \n" \
|
||||
"vmovdqu 0x20(%0),%%ymm1 \n" \
|
||||
"vmovdqu 0x40(%0),%%ymm2 \n" \
|
||||
"vmovdqu 0x60(%0),%%ymm3 \n" \
|
||||
"vpsubb %%ymm5, %%ymm0, %%ymm0 \n" \
|
||||
"vpsubb %%ymm5, %%ymm1, %%ymm1 \n" \
|
||||
"vpsubb %%ymm5, %%ymm2, %%ymm2 \n" \
|
||||
"vpsubb %%ymm5, %%ymm3, %%ymm3 \n" \
|
||||
"vpmaddubsw %%ymm0,%%ymm4,%%ymm0 \n" \
|
||||
"vpmaddubsw %%ymm1,%%ymm4,%%ymm1 \n" \
|
||||
"vpmaddubsw %%ymm2,%%ymm4,%%ymm2 \n" \
|
||||
"vpmaddubsw %%ymm3,%%ymm4,%%ymm3 \n" \
|
||||
"lea 0x80(%0),%0 \n" \
|
||||
"vphaddw %%ymm1,%%ymm0,%%ymm0 \n" /* mutates. */ \
|
||||
"vphaddw %%ymm3,%%ymm2,%%ymm2 \n" \
|
||||
"vpaddw %%" #round ",%%ymm0,%%ymm0 \n" /* Add .5 for rounding. */ \
|
||||
"vpaddw %%" #round ",%%ymm2,%%ymm2 \n" \
|
||||
"vpsrlw $0x8,%%ymm0,%%ymm0 \n" \
|
||||
"vpsrlw $0x8,%%ymm2,%%ymm2 \n" \
|
||||
"vpackuswb %%ymm2,%%ymm0,%%ymm0 \n" /* mutates. */ \
|
||||
"vpermd %%ymm0,%%ymm6,%%ymm0 \n" /* unmutate. */ \
|
||||
"vmovdqu %%ymm0,(%1) \n" \
|
||||
"lea 0x20(%1),%1 \n" \
|
||||
"sub $0x20,%2 \n" \
|
||||
"jg 1b \n" \
|
||||
#define RGBTOY_AVX2(round) \
|
||||
"1: \n" \
|
||||
"vmovdqu (%0),%%ymm0 \n" \
|
||||
"vmovdqu 0x20(%0),%%ymm1 \n" \
|
||||
"vmovdqu 0x40(%0),%%ymm2 \n" \
|
||||
"vmovdqu 0x60(%0),%%ymm3 \n" \
|
||||
"vpsubb %%ymm5, %%ymm0, %%ymm0 \n" \
|
||||
"vpsubb %%ymm5, %%ymm1, %%ymm1 \n" \
|
||||
"vpsubb %%ymm5, %%ymm2, %%ymm2 \n" \
|
||||
"vpsubb %%ymm5, %%ymm3, %%ymm3 \n" \
|
||||
"vpmaddubsw %%ymm0,%%ymm4,%%ymm0 \n" \
|
||||
"vpmaddubsw %%ymm1,%%ymm4,%%ymm1 \n" \
|
||||
"vpmaddubsw %%ymm2,%%ymm4,%%ymm2 \n" \
|
||||
"vpmaddubsw %%ymm3,%%ymm4,%%ymm3 \n" \
|
||||
"lea 0x80(%0),%0 \n" \
|
||||
"vphaddw %%ymm1,%%ymm0,%%ymm0 \n" /* mutates. */ \
|
||||
"vphaddw %%ymm3,%%ymm2,%%ymm2 \n" \
|
||||
"vpaddw %%" #round \
|
||||
",%%ymm0,%%ymm0 \n" /* Add .5 for rounding. */ \
|
||||
"vpaddw %%" #round \
|
||||
",%%ymm2,%%ymm2 \n" \
|
||||
"vpsrlw $0x8,%%ymm0,%%ymm0 \n" \
|
||||
"vpsrlw $0x8,%%ymm2,%%ymm2 \n" \
|
||||
"vpackuswb %%ymm2,%%ymm0,%%ymm0 \n" /* mutates. */ \
|
||||
"vpermd %%ymm0,%%ymm6,%%ymm0 \n" /* unmutate. */ \
|
||||
"vmovdqu %%ymm0,(%1) \n" \
|
||||
"lea 0x20(%1),%1 \n" \
|
||||
"sub $0x20,%2 \n" \
|
||||
"jg 1b \n" \
|
||||
"vzeroupper \n"
|
||||
|
||||
#ifdef HAS_ARGBTOYROW_SSSE3
|
||||
@ -1148,15 +1152,15 @@ void ARGBToYRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width) {
|
||||
"movdqa %4,%%xmm5 \n"
|
||||
"movdqa %5,%%xmm7 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY(xmm7)
|
||||
LABELALIGN RGBTOY(xmm7)
|
||||
: "+r"(src_argb), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
: "m"(kARGBToY), // %3
|
||||
"m"(kSub128), // %4
|
||||
"m"(kAddY16) // %5
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||
"xmm7");
|
||||
}
|
||||
#endif // HAS_ARGBTOYROW_SSSE3
|
||||
|
||||
@ -1168,8 +1172,7 @@ void ARGBToYJRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width) {
|
||||
"movdqa %3,%%xmm4 \n"
|
||||
"movdqa %4,%%xmm5 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY(xmm5)
|
||||
LABELALIGN RGBTOY(xmm5)
|
||||
: "+r"(src_argb), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
@ -1187,8 +1190,7 @@ void RGBAToYJRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width) {
|
||||
"movdqa %3,%%xmm4 \n"
|
||||
"movdqa %4,%%xmm5 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY(xmm5)
|
||||
LABELALIGN RGBTOY(xmm5)
|
||||
: "+r"(src_rgba), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
@ -1210,8 +1212,7 @@ void ARGBToYRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width) {
|
||||
"vbroadcastf128 %5,%%ymm7 \n"
|
||||
"vmovdqu %6,%%ymm6 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY_AVX2(ymm7)
|
||||
LABELALIGN RGBTOY_AVX2(ymm7)
|
||||
: "+r"(src_argb), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
@ -1219,7 +1220,8 @@ void ARGBToYRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width) {
|
||||
"m"(kSub128), // %4
|
||||
"m"(kAddY16), // %5
|
||||
"m"(kPermdARGBToY_AVX) // %6
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||
"xmm7");
|
||||
}
|
||||
#endif // HAS_ARGBTOYROW_AVX2
|
||||
|
||||
@ -1232,8 +1234,7 @@ void ABGRToYRow_AVX2(const uint8_t* src_abgr, uint8_t* dst_y, int width) {
|
||||
"vbroadcastf128 %5,%%ymm7 \n"
|
||||
"vmovdqu %6,%%ymm6 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY_AVX2(ymm7)
|
||||
LABELALIGN RGBTOY_AVX2(ymm7)
|
||||
: "+r"(src_abgr), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
@ -1241,7 +1242,8 @@ void ABGRToYRow_AVX2(const uint8_t* src_abgr, uint8_t* dst_y, int width) {
|
||||
"m"(kSub128), // %4
|
||||
"m"(kAddY16), // %5
|
||||
"m"(kPermdARGBToY_AVX) // %6
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||
"xmm7");
|
||||
}
|
||||
#endif // HAS_ABGRTOYROW_AVX2
|
||||
|
||||
@ -1253,15 +1255,15 @@ void ARGBToYJRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width) {
|
||||
"vbroadcastf128 %4,%%ymm5 \n"
|
||||
"vmovdqu %5,%%ymm6 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY_AVX2(ymm5)
|
||||
LABELALIGN RGBTOY_AVX2(ymm5)
|
||||
: "+r"(src_argb), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
: "m"(kARGBToYJ), // %3
|
||||
"m"(kSub128), // %4
|
||||
"m"(kPermdARGBToY_AVX) // %5
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||
"xmm7");
|
||||
}
|
||||
#endif // HAS_ARGBTOYJROW_AVX2
|
||||
|
||||
@ -1273,9 +1275,8 @@ void RGBAToYJRow_AVX2(const uint8_t* src_rgba, uint8_t* dst_y, int width) {
|
||||
"vbroadcastf128 %4,%%ymm5 \n"
|
||||
"vmovdqu %5,%%ymm6 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY_AVX2(ymm5)
|
||||
"vzeroupper \n"
|
||||
LABELALIGN RGBTOY_AVX2(
|
||||
ymm5) "vzeroupper \n"
|
||||
: "+r"(src_rgba), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
@ -1536,7 +1537,7 @@ void ARGBToUVJRow_AVX2(const uint8_t* src_argb0,
|
||||
"+r"(dst_v), // %2
|
||||
"+rm"(width) // %3
|
||||
: "r"((intptr_t)(src_stride_argb)), // %4
|
||||
"m"(kSub128), // %5
|
||||
"m"(kSub128), // %5
|
||||
"m"(kARGBToVJ), // %6
|
||||
"m"(kARGBToUJ), // %7
|
||||
"m"(kShufARGBToUV_AVX) // %8
|
||||
@ -1606,7 +1607,7 @@ void ARGBToUVJRow_SSSE3(const uint8_t* src_argb0,
|
||||
: "r"((intptr_t)(src_stride_argb)), // %4
|
||||
"m"(kARGBToVJ), // %5
|
||||
"m"(kARGBToUJ), // %6
|
||||
"m"(kSub128) // %7
|
||||
"m"(kSub128) // %7
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm6", "xmm7");
|
||||
}
|
||||
#endif // HAS_ARGBTOUVJROW_SSSE3
|
||||
@ -1675,15 +1676,15 @@ void BGRAToYRow_SSSE3(const uint8_t* src_bgra, uint8_t* dst_y, int width) {
|
||||
"movdqa %4,%%xmm5 \n"
|
||||
"movdqa %5,%%xmm7 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY(xmm7)
|
||||
LABELALIGN RGBTOY(xmm7)
|
||||
: "+r"(src_bgra), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
: "m"(kBGRAToY), // %3
|
||||
"m"(kSub128), // %4
|
||||
"m"(kAddY16) // %5
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||
"xmm7");
|
||||
}
|
||||
|
||||
void BGRAToUVRow_SSSE3(const uint8_t* src_bgra0,
|
||||
@ -1755,15 +1756,15 @@ void ABGRToYRow_SSSE3(const uint8_t* src_abgr, uint8_t* dst_y, int width) {
|
||||
"movdqa %4,%%xmm5 \n"
|
||||
"movdqa %5,%%xmm7 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY(xmm7)
|
||||
LABELALIGN RGBTOY(xmm7)
|
||||
: "+r"(src_abgr), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
: "m"(kABGRToY), // %3
|
||||
"m"(kSub128), // %4
|
||||
"m"(kAddY16) // %5
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||
"xmm7");
|
||||
}
|
||||
|
||||
void RGBAToYRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width) {
|
||||
@ -1772,15 +1773,15 @@ void RGBAToYRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width) {
|
||||
"movdqa %4,%%xmm5 \n"
|
||||
"movdqa %5,%%xmm7 \n"
|
||||
|
||||
LABELALIGN
|
||||
RGBTOY(xmm7)
|
||||
LABELALIGN RGBTOY(xmm7)
|
||||
: "+r"(src_rgba), // %0
|
||||
"+r"(dst_y), // %1
|
||||
"+r"(width) // %2
|
||||
: "m"(kRGBAToY), // %3
|
||||
"m"(kSub128), // %4
|
||||
"m"(kAddY16) // %5
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7");
|
||||
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
|
||||
"xmm7");
|
||||
}
|
||||
|
||||
void ABGRToUVRow_SSSE3(const uint8_t* src_abgr0,
|
||||
|
||||
2665
source/row_mmi.cc
2665
source/row_mmi.cc
File diff suppressed because it is too large
Load Diff
@ -676,6 +676,7 @@ TESTBIPLANARTOP(NV21, 2, 2, I420, 2, 2)
|
||||
YALIGN, benchmark_width_, _Opt, +, 0)
|
||||
|
||||
TESTPLANARTOB(I420, 2, 2, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(J420, 2, 2, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(J420, 2, 2, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(H420, 2, 2, ARGB, 4, 4, 1)
|
||||
@ -683,7 +684,6 @@ TESTPLANARTOB(H420, 2, 2, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(U420, 2, 2, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(U420, 2, 2, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, BGRA, 4, 4, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, RGBA, 4, 4, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, RAW, 3, 3, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, RGB24, 3, 3, 1)
|
||||
@ -700,20 +700,23 @@ TESTPLANARTOB(I420, 2, 2, ARGB4444, 2, 2, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, RGB565, 2, 2, 1)
|
||||
#endif
|
||||
TESTPLANARTOB(I422, 2, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(J422, 2, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(J422, 2, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(H422, 2, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(H422, 2, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(U422, 2, 1, ARGB, 4, 4, 1)
|
||||
//TESTPLANARTOB(U422, 2, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(U422, 2, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, BGRA, 4, 4, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, RGBA, 4, 4, 1)
|
||||
TESTPLANARTOB(I444, 1, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(J444, 1, 1, ARGB, 4, 4, 1)
|
||||
//TESTPLANARTOB(H444, 1, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(U444, 1, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(I444, 1, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(J444, 1, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(J444, 1, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(H444, 1, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(H444, 1, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(U444, 1, 1, ARGB, 4, 4, 1)
|
||||
TESTPLANARTOB(U444, 1, 1, ABGR, 4, 4, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, YUY2, 2, 4, 1)
|
||||
TESTPLANARTOB(I420, 2, 2, UYVY, 2, 4, 1)
|
||||
TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1)
|
||||
@ -2569,6 +2572,7 @@ TESTPTOB(TestUYVYToNV12, UYVYToI420, UYVYToNV12)
|
||||
benchmark_width_, _Opt, +, 0, FMT_C, BPP_C)
|
||||
|
||||
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ABGR, 4)
|
||||
TESTPLANARTOE(I420, 2, 2, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(J420, 2, 2, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(J420, 2, 2, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, ARGB, 4)
|
||||
@ -2576,7 +2580,6 @@ TESTPLANARTOE(H420, 2, 2, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(U420, 2, 2, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(U420, 2, 2, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I420, 2, 2, BGRA, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I420, 2, 2, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I420, 2, 2, RGBA, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, ARGB, 4)
|
||||
TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, RGB24, 3)
|
||||
@ -2594,16 +2597,24 @@ TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2)
|
||||
TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB4444, 2)
|
||||
TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, RGB565, 2)
|
||||
#endif
|
||||
TESTPLANARTOE(I422, 2, 1, ARGB, 1, 4, ABGR, 4)
|
||||
TESTPLANARTOE(I422, 2, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(J422, 2, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(J422, 2, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(H422, 2, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(H422, 2, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(U422, 2, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(U422, 2, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I422, 2, 1, BGRA, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I422, 2, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I422, 2, 1, RGBA, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I444, 1, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(J444, 1, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I444, 1, 1, ARGB, 1, 4, ABGR, 4)
|
||||
TESTPLANARTOE(I444, 1, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(J444, 1, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(J444, 1, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(H444, 1, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(H444, 1, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(U444, 1, 1, ARGB, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(U444, 1, 1, ABGR, 1, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I420, 2, 2, YUY2, 2, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I420, 2, 2, UYVY, 2, 4, ARGB, 4)
|
||||
TESTPLANARTOE(I422, 2, 1, YUY2, 2, 4, ARGB, 4)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user