Change all 1 use wrappers to matrix calls

Bug: 42280902
Change-Id: Ieccb1e8eeaec3064fc5d36d2f1233fd38eb2a128
Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8177647
Reviewed-by: richard winterton <rrwinterton@gmail.com>
Commit-Queue: Frank Barchard <fbarchard@google.com>
This commit is contained in:
Frank Barchard 2026-07-31 17:12:58 -07:00 committed by libyuv-scoped@luci-project-accounts.iam.gserviceaccount.com
parent 1a746db4ce
commit 0148582bb8
18 changed files with 465 additions and 2657 deletions

View File

@ -1,6 +1,6 @@
Name: libyuv
URL: https://chromium.googlesource.com/libyuv/libyuv/
Version: 1951
Version: 1952
Revision: DEPS
License: BSD-3-Clause
License File: LICENSE

View File

@ -194,8 +194,6 @@ extern "C" {
#define HAS_ARGBTOAB64ROW_SSSE3
#define HAS_ARGBTOAR30ROW_SSSE3
#define HAS_ARGBTOAR64ROW_SSSE3
#define HAS_ARGBTOUV444ROW_SSSE3
#define HAS_ARGBTOUVJ444ROW_SSSE3
#define HAS_ARGBUNATTENUATEROW_SSE2
#define HAS_CONVERT16TO8ROW_SSSE3
#define HAS_CONVERT8TO16ROW_SSE2
@ -237,11 +235,7 @@ extern "C" {
#define HAS_SWAPUVROW_SSSE3
#define HAS_YUY2TONVUVROW_SSE2
// TODO: port row_win to use 8 bit coefficients.
#define HAS_ARGBTOYJROW_SSSE3
#define HAS_ARGBTOYROW_SSSE3
#define HAS_ARGBTOYMATRIXROW_SSSE3
#define HAS_ARGBTOUVJROW_SSSE3
#define HAS_ARGBTOUVROW_SSSE3
#define HAS_ARGBTOUVMATRIXROW_SSSE3
#define HAS_ARGBTOUV444MATRIXROW_SSSE3
@ -268,18 +262,12 @@ extern "C" {
#define HAS_ARGBTOAR64ROW_AVX2
#define HAS_ARGBTORAWROW_AVX2
#define HAS_ARGBTORGB24ROW_AVX2
#define HAS_ARGBTOUV444ROW_AVX2
#define HAS_ARGBTOUVJ444ROW_AVX2
#define HAS_ARGBTOUVJROW_AVX2
#define HAS_ARGBTOUVROW_AVX2
#define HAS_ARGBTOUVMATRIXROW_AVX2
#define HAS_RGBTOUVMATRIXROW_AVX2
#define HAS_RGB565TOUVMATRIXROW_AVX2
#define HAS_ARGB1555TOUVMATRIXROW_AVX2
#define HAS_ARGB4444TOUVMATRIXROW_AVX2
#define HAS_ARGBTOUV444MATRIXROW_AVX2
#define HAS_ARGBTOYJROW_AVX2
#define HAS_ARGBTOYROW_AVX2
#define HAS_ARGBTOYMATRIXROW_AVX2
#define HAS_RGBTOYMATRIXROW_AVX2
#define HAS_RGB565TOYMATRIXROW_AVX2
@ -352,14 +340,12 @@ extern "C" {
#define HAS_ARGBSHUFFLEROW_AVX512BW
#define HAS_I422TORGB24ROW_AVX512VBMI
#endif
#define HAS_ARGBTOYROW_AVX2
#define HAS_ARGBTOYMATRIXROW_AVX2
#define HAS_RGBTOYMATRIXROW_AVX2
#define HAS_RGB565TOYMATRIXROW_AVX2
#define HAS_ARGB1555TOYMATRIXROW_AVX2
#define HAS_ARGB4444TOYMATRIXROW_AVX2
#define HAS_ARGBTOUV444MATRIXROW_AVX2
#define HAS_ARGBTOYJROW_AVX2
#define HAS_J400TOARGBROW_AVX2
#endif
@ -384,14 +370,9 @@ extern "C" {
(defined(CLANG_HAS_AVX512))
#define HAS_I422TOARGBROW_AVX512BW
#define HAS_ARGBSHUFFLEROW_AVX512BW
#define HAS_ARGBTOUV444ROW_AVX512BW
#define HAS_ARGBTOUV444MATRIXROW_AVX512BW
#define HAS_ARGBTOYROW_AVX512BW
#define HAS_ARGBTOYMATRIXROW_AVX512BW
#define HAS_I422TORGB24ROW_AVX512VBMI
#define HAS_ARGBTOUVJ444ROW_AVX512BW
#define HAS_ARGBTOUVROW_AVX512BW
#define HAS_ARGBTOUVJROW_AVX512BW
#define HAS_ARGBTOUVMATRIXROW_AVX512BW
#define HAS_J400TOARGBROW_AVX512BW
#define HAS_MERGEUVROW_AVX512BW
@ -422,12 +403,7 @@ extern "C" {
#define HAS_ARGBTORGB24ROW_NEON
#define HAS_ARGBTORGB565DITHERROW_NEON
#define HAS_ARGBTORGB565ROW_NEON
#if !defined(__aarch64__)
#define HAS_ARGBTOUV444MATRIXROW_NEON
#endif
#define HAS_ARGBTOUV444ROW_NEON
#define HAS_ARGBTOUVJ444ROW_NEON
#define HAS_ARGBTOUVJROW_NEON
#if !defined(__GNUC__) || defined(__clang__)
#define HAS_ARGBTOUVMATRIXROW_NEON
#define HAS_RGBTOUVMATRIXROW_NEON
@ -435,16 +411,11 @@ extern "C" {
#define HAS_ARGB1555TOUVMATRIXROW_NEON
#define HAS_ARGB4444TOUVMATRIXROW_NEON
#endif
#define HAS_ARGBTOUVROW_NEON
#define HAS_ARGBTOYJROW_NEON
#if !defined(__aarch64__)
#define HAS_ARGBTOYMATRIXROW_NEON
#define HAS_RGB565TOYMATRIXROW_NEON
#define HAS_ARGB1555TOYMATRIXROW_NEON
#define HAS_ARGB4444TOYMATRIXROW_NEON
#define HAS_RGBTOYMATRIXROW_NEON
#endif
#define HAS_ARGBTOYROW_NEON
#define HAS_AYUVTOVUROW_NEON
#define HAS_AYUVTOYROW_NEON
#define HAS_BYTETOFLOATROW_NEON
@ -496,10 +467,8 @@ extern "C" {
#define HAS_RAWTOARGBROW_NEON
#define HAS_RAWTORGB24ROW_NEON
#define HAS_RAWTORGBAROW_NEON
#define HAS_RAWTOUVJROW_NEON
#define HAS_RAWTOUVROW_NEON
#define HAS_RGB24TOARGBROW_NEON
#define HAS_RGB24TOUVJROW_NEON
#define HAS_RGB24TOUVROW_NEON
#define HAS_RGB565TOARGBROW_NEON
#define HAS_RGB565TOUVROW_NEON
@ -565,19 +534,14 @@ extern "C" {
#define HAS_ABGRTOYROW_NEON_DOTPROD
#define HAS_ARGBGRAYROW_NEON_DOTPROD
#define HAS_ARGBSEPIAROW_NEON_DOTPROD
#define HAS_ARGBTOYJROW_NEON_DOTPROD
#define HAS_ARGBTOYROW_NEON_DOTPROD
#define HAS_ARGBTOYMATRIXROW_NEON_DOTPROD
#define HAS_BGRATOYROW_NEON_DOTPROD
#define HAS_RGBATOYJROW_NEON_DOTPROD
#define HAS_RGBATOYROW_NEON_DOTPROD
#define HAS_ARGBCOLORMATRIXROW_NEON_I8MM
#define HAS_ARGBTOUV444ROW_NEON_I8MM
#define HAS_ARGBTOUVJ444ROW_NEON_I8MM
#define HAS_ARGBTOUVJROW_NEON_I8MM
#define HAS_ARGBTOUVMATRIXROW_NEON_I8MM
#define HAS_ARGBTOUVROW_NEON_I8MM
#define HAS_ARGBTOUV444MATRIXROW_NEON_I8MM
#endif
// The following are available on AArch64 SVE platforms:
@ -587,9 +551,7 @@ extern "C" {
#define HAS_ARGBTORGB24ROW_SVE2
#define HAS_ARGBTORGB565DITHERROW_SVE2
#define HAS_ARGBTORGB565ROW_SVE2
#define HAS_ARGBTOUVJROW_SVE2
#define HAS_ARGBTOUVMATRIXROW_SVE2
#define HAS_ARGBTOUVROW_SVE2
#define HAS_AYUVTOUVROW_SVE2
#define HAS_AYUVTOVUROW_SVE2
#define HAS_CONVERT8TO8ROW_SVE2
@ -635,9 +597,7 @@ extern "C" {
#if !defined(LIBYUV_DISABLE_SME) && defined(CLANG_HAS_SME) && \
defined(__aarch64__)
#define HAS_ARGBMULTIPLYROW_SME
#define HAS_ARGBTOUVJROW_SME
#define HAS_ARGBTOUVMATRIXROW_SME
#define HAS_ARGBTOUVROW_SME
#define HAS_CONVERT16TO8ROW_SME
#define HAS_CONVERT8TO16ROW_SME
#define HAS_CONVERT8TO8ROW_SME
@ -710,10 +670,6 @@ extern "C" {
#define HAS_ARGBTORGB24ROW_LSX
#define HAS_ARGBTORGB565ROW_LSX
#define HAS_ARGBTORGB565DITHERROW_LSX
#define HAS_ARGBTOUVJROW_LSX
#define HAS_ARGBTOUV444ROW_LSX
#define HAS_ARGBTOUVROW_LSX
#define HAS_ARGBTOYJROW_LSX
#define HAS_ARGBMIRRORROW_LSX
// TODO: Re-enable once rounding behaviour is fixed.
// #define HAS_ARGBMULTIPLYROW_LSX
@ -757,7 +713,6 @@ extern "C" {
#define HAS_YUY2TOUVROW_LSX
#define HAS_YUY2TOUV422ROW_LSX
#define HAS_YUY2TOYROW_LSX
#define HAS_ARGBTOYROW_LSX
#define HAS_ARGBTOYMATRIXROW_LSX
#endif
@ -786,11 +741,6 @@ extern "C" {
#define HAS_ARGBTORGB24ROW_LASX
#define HAS_ARGBTORGB565DITHERROW_LASX
#define HAS_ARGBTORGB565ROW_LASX
#define HAS_ARGBTOUV444ROW_LASX
#define HAS_ARGBTOUVJROW_LASX
#define HAS_ARGBTOUVROW_LASX
#define HAS_ARGBTOYJROW_LASX
#define HAS_ARGBTOYROW_LASX
#define HAS_ARGBTOYMATRIXROW_LASX
#define HAS_I422ALPHATOARGBROW_LASX
#define HAS_I422TOARGB1555ROW_LASX
@ -840,9 +790,7 @@ extern "C" {
#define HAS_ARGBCOPYYTOALPHAROW_RVV
#define HAS_ARGBEXTRACTALPHAROW_RVV
#define HAS_ARGBTOAR64ROW_RVV
#define HAS_ARGBTOYJROW_RVV
#define HAS_ARGBTOYMATRIXROW_RVV
#define HAS_ARGBTOYROW_RVV
#define HAS_COPYROW_RVV
#define HAS_INTERPOLATEROW_RVV
#define HAS_RGBTOYMATRIXROW_RVV
@ -1710,30 +1658,6 @@ void NV21ToRGB24Row_RVV(const uint8_t* src_y,
const struct YuvConstants* yuvconstants,
int width);
void ARGBToYRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width);
void ARGBToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width);
void ARGBToYRow_AVX512BW(const uint8_t* src_argb, uint8_t* dst_y, int width);
void ARGBToYJRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width);
void ARGBToYJRow_AVX512BW(const uint8_t* src_argb, uint8_t* dst_y, int width);
void ARGBToYJRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width);
void ARGBToYJRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width);
void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_yj, int width);
void ARGBToYRow_NEON_DotProd(const uint8_t* src_argb,
uint8_t* dst_y,
int width);
void ARGBToYJRow_NEON_DotProd(const uint8_t* src_argb,
uint8_t* dst_yj,
int width);
void ARGBToYRow_RVV(const uint8_t* src_argb, uint8_t* dst_y, int width);
void ARGBToYJRow_RVV(const uint8_t* src_argb, uint8_t* dst_yj, int width);
void ARGBToYRow_LSX(const uint8_t* src_argb0, uint8_t* dst_y, int width);
void ARGBToYRow_LASX(const uint8_t* src_argb0, uint8_t* dst_y, int width);
void ARGBToYJRow_LSX(const uint8_t* src_argb0, uint8_t* dst_y, int width);
void ARGBToYJRow_LASX(const uint8_t* src_argb0, uint8_t* dst_y, int width);
#if !defined(__aarch64__)
void ARGBToUV444MatrixRow_NEON(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
@ -1752,23 +1676,7 @@ void ARGBToYMatrixRow_Any_NEON(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
#endif
void ARGBToUV444Row_NEON(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_NEON(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVMatrixRow_NEON(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
@ -1793,6 +1701,16 @@ void ARGBToUVMatrixRow_Any_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
void ARGBToUV444MatrixRow_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
void ARGBToUV444MatrixRow_Any_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c);
void ARGBToUVMatrixRow_SVE2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
@ -1806,66 +1724,6 @@ void ARGBToUVMatrixRow_SME(const uint8_t* src_argb,
int width,
const struct ArgbConstants* c);
void ARGBToUVRow_NEON(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_NEON_I8MM(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_SVE2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_SME(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_LSX(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_LASX(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_LSX(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_LASX(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_NEON(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_NEON_I8MM(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_SVE2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_SME(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RGB24ToUVRow_NEON(const uint8_t* src_rgb24,
int src_stride_rgb24,
uint8_t* dst_u,
@ -1876,16 +1734,7 @@ void RAWToUVRow_NEON(const uint8_t* src_raw,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RGB24ToUVJRow_NEON(const uint8_t* src_rgb24,
int src_stride_rgb24,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RAWToUVJRow_NEON(const uint8_t* src_raw,
int src_stride_raw,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RGB565ToUVRow_NEON(const uint8_t* src_rgb565,
int src_stride_rgb565,
uint8_t* dst_u,
@ -1902,16 +1751,6 @@ void ARGB4444ToUVRow_NEON(const uint8_t* src_argb4444,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_LSX(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_LASX(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGB1555ToUVRow_LSX(const uint8_t* src_argb1555,
int src_stride_argb1555,
uint8_t* dst_u,
@ -1961,8 +1800,6 @@ void ARGB4444ToYRow_NEON(const uint8_t* src_argb4444,
uint8_t* dst_y,
int width);
void ARGB1555ToYRow_LSX(const uint8_t* src_argb1555, uint8_t* dst_y, int width);
void ARGB1555ToYRow_LASX(const uint8_t* src_argb1555,
@ -1971,9 +1808,6 @@ void ARGB1555ToYRow_LASX(const uint8_t* src_argb1555,
void RGB565ToYRow_LSX(const uint8_t* src_rgb565, uint8_t* dst_y, int width);
void RGB565ToYRow_LASX(const uint8_t* src_rgb565, uint8_t* dst_y, int width);
void ARGBToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width);
void ARGBToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width);
void ARGBToYMatrixRow_C(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
@ -2263,6 +2097,18 @@ void ARGBToYMatrixRow_RVV(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void RGBToYMatrixRow_LSX(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void RGBToYMatrixRow_LASX(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void RGBToYMatrixRow_RVV(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void ARGBToYMatrixRow_Any_NEON_DotProd(const uint8_t* src_argb,
uint8_t* dst_y,
@ -2276,6 +2122,14 @@ void ARGBToYMatrixRow_Any_LASX(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void RGBToYMatrixRow_Any_LSX(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void RGBToYMatrixRow_Any_LASX(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c);
void ARGBToUV444MatrixRow_SSSE3(const uint8_t* src_argb,
uint8_t* dst_u,
@ -2334,12 +2188,6 @@ void RGBAToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width);
void RGB565ToYRow_C(const uint8_t* src_rgb565, uint8_t* dst_y, int width);
void ARGB1555ToYRow_C(const uint8_t* src_argb1555, uint8_t* dst_y, int width);
void ARGB4444ToYRow_C(const uint8_t* src_argb4444, uint8_t* dst_y, int width);
void ARGBToYRow_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ARGBToYJRow_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ABGRToYRow_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
@ -2357,21 +2205,11 @@ void BGRAToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void BGRAToYRow_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ARGBToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ABGRToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void RGBAToYJRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void BGRAToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ABGRToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void RGBAToYRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYRow_Any_NEON_DotProd(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ARGBToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYJRow_Any_NEON_DotProd(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ABGRToYJRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ABGRToYJRow_Any_NEON_DotProd(const uint8_t* src_ptr,
uint8_t* dst_ptr,
@ -2393,161 +2231,16 @@ void ARGB4444ToYRow_Any_NEON(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ARGBToYRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYJRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void RGB565ToYRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGB1555ToYRow_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void RGB565ToYRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYJRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGBToYRow_Any_LASX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void ARGB1555ToYRow_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ARGBToUVRow_AVX2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_AVX2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_AVX512BW(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_AVX512BW(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_SSSE3(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_SSSE3(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_AVX2(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_AVX2(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_AVX512BW(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_AVX512BW(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_SSSE3(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_SSSE3(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_Any_NEON(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_Any_NEON_I8MM(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_Any_NEON(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_Any_NEON_I8MM(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_NEON(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_NEON_I8MM(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_SVE2(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_SME(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_LSX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_Any_LASX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_NEON(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_NEON_I8MM(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_SVE2(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_SME(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ABGRToUVJRow_Any_NEON(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
@ -2638,16 +2331,7 @@ void RAWToUVRow_Any_NEON(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RGB24ToUVJRow_Any_NEON(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RAWToUVJRow_Any_NEON(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RGB565ToUVRow_Any_NEON(const uint8_t* src_ptr,
int src_stride,
uint8_t* dst_u,
@ -2678,16 +2362,6 @@ void RGBAToUVRow_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_LSX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_Any_LASX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGB1555ToUVRow_Any_LSX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
@ -2728,26 +2402,11 @@ void RAWToUVRow_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_C(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJRow_C(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ABGRToUVJRow_C(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVRow_C(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void BGRAToUVRow_C(const uint8_t* src_rgb,
int src_stride_rgb,
uint8_t* dst_u,
@ -2804,68 +2463,6 @@ void ARGB4444ToUVRow_C(const uint8_t* src_argb4444,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_SSSE3(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_Any_SSSE3(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_SSSE3(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_Any_SSSE3(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_AVX2(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_Any_AVX2(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_AVX2(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_Any_AVX2(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_Any_AVX512BW(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUV444Row_C(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGBToUVJ444Row_C(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void MirrorRow_AVX512BW(const uint8_t* src, uint8_t* dst, int width);
void MirrorRow_AVX2(const uint8_t* src, uint8_t* dst, int width);
void MirrorRow_SSSE3(const uint8_t* src, uint8_t* dst, int width);

View File

@ -11,6 +11,6 @@
#ifndef INCLUDE_LIBYUV_VERSION_H_
#define INCLUDE_LIBYUV_VERSION_H_
#define LIBYUV_VERSION 1951
#define LIBYUV_VERSION 1952
#endif // INCLUDE_LIBYUV_VERSION_H_

File diff suppressed because it is too large Load Diff

View File

@ -151,6 +151,14 @@ int ARGBToI444Matrix(const uint8_t* src_argb,
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_NEON;
}
}
#endif
#if defined(HAS_ARGBTOUV444MATRIXROW_NEON_I8MM)
if (TestCpuFlag(kCpuHasNeonI8MM)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_NEON_I8MM;
if (IS_ALIGNED(width, 8)) {
ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_NEON_I8MM;
}
}
#endif
if (!src_argb || !dst_y || !dst_u || !dst_v || !argbconstants || width <= 0 ||
height == 0 || height == INT_MIN) {

View File

@ -4860,8 +4860,8 @@ static int ARGBSobelize(const uint8_t* src_argb,
uint8_t* dst,
int width)) {
int y;
void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_g, int width) =
ARGBToYJRow_C;
void (*ARGBToYMatrixRow)(const uint8_t* src_argb, uint8_t* dst_g, int width,
const struct ArgbConstants* c) = ARGBToYMatrixRow_C;
void (*SobelYRow)(const uint8_t* src_y0, const uint8_t* src_y1,
uint8_t* dst_sobely, int width) = SobelYRow_C;
void (*SobelXRow)(const uint8_t* src_y0, const uint8_t* src_y1,
@ -4879,57 +4879,65 @@ static int ARGBSobelize(const uint8_t* src_argb,
src_stride_argb = -src_stride_argb;
}
#if defined(HAS_ARGBTOYJROW_SSSE3)
#if defined(HAS_ARGBTOYMATRIXROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3)) {
ARGBToYJRow = ARGBToYJRow_Any_SSSE3;
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_SSSE3;
if (IS_ALIGNED(width, 16)) {
ARGBToYJRow = ARGBToYJRow_SSSE3;
ARGBToYMatrixRow = ARGBToYMatrixRow_SSSE3;
}
}
#endif
#if defined(HAS_ARGBTOYJROW_AVX2)
#if defined(HAS_ARGBTOYMATRIXROW_AVX2)
if (TestCpuFlag(kCpuHasAVX2)) {
ARGBToYJRow = ARGBToYJRow_Any_AVX2;
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX2;
if (IS_ALIGNED(width, 32)) {
ARGBToYJRow = ARGBToYJRow_AVX2;
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX2;
}
}
#endif
#if defined(HAS_ARGBTOYROW_AVX512BW)
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToYJRow = ARGBToYJRow_Any_AVX512BW;
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW;
if (IS_ALIGNED(width, 64)) {
ARGBToYJRow = ARGBToYJRow_AVX512BW;
ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW;
}
}
#endif
#if defined(HAS_ARGBTOYJROW_NEON)
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBToYJRow = ARGBToYJRow_Any_NEON;
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_NEON;
if (IS_ALIGNED(width, 16)) {
ARGBToYJRow = ARGBToYJRow_NEON;
ARGBToYMatrixRow = ARGBToYMatrixRow_NEON;
}
}
#endif
#if defined(HAS_ARGBTOYJROW_LSX)
#if defined(HAS_ARGBTOYMATRIXROW_NEON_DOTPROD)
if (TestCpuFlag(kCpuHasNeonDotProd)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_NEON_DotProd;
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_NEON_DotProd;
}
}
#endif
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYJRow = ARGBToYJRow_Any_LSX;
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
ARGBToYJRow = ARGBToYJRow_LSX;
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
#endif
#if defined(HAS_ARGBTOYJROW_LASX)
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYJRow = ARGBToYJRow_Any_LASX;
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
ARGBToYJRow = ARGBToYJRow_LASX;
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
#endif
#if defined(HAS_ARGBTOYJROW_RVV)
#if defined(HAS_ARGBTOYMATRIXROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
ARGBToYJRow = ARGBToYJRow_RVV;
ARGBToYMatrixRow = ARGBToYMatrixRow_RVV;
}
#endif
@ -4967,10 +4975,10 @@ static int ARGBSobelize(const uint8_t* src_argb,
uint8_t* row_y2 = row_y1 + row_size;
if (!rows)
return 1;
ARGBToYJRow(src_argb, row_y0, width);
ARGBToYMatrixRow(src_argb, row_y0, width, &kArgbJPEGConstants);
row_y0[-1] = row_y0[0];
memset(row_y0 + width, row_y0[width - 1], 16); // Extrude 16 for valgrind.
ARGBToYJRow(src_argb, row_y1, width);
ARGBToYMatrixRow(src_argb, row_y1, width, &kArgbJPEGConstants);
row_y1[-1] = row_y1[0];
memset(row_y1 + width, row_y1[width - 1], 16);
memset(row_y2 + width, 0, 16);
@ -4980,7 +4988,7 @@ static int ARGBSobelize(const uint8_t* src_argb,
if (y < (height - 1)) {
src_argb += src_stride_argb;
}
ARGBToYJRow(src_argb, row_y2, width);
ARGBToYMatrixRow(src_argb, row_y2, width, &kArgbJPEGConstants);
row_y2[-1] = row_y2[0];
row_y2[width] = row_y2[width - 1];

View File

@ -1054,12 +1054,6 @@ ANY11(RAWToRGB24Row_Any_NEON, RAWToRGB24Row_NEON, 0, 3, 3, 7)
#if defined(HAS_RAWTORGB24ROW_LSX)
ANY11(RAWToRGB24Row_Any_LSX, RAWToRGB24Row_LSX, 0, 3, 3, 15)
#endif
#ifdef HAS_ARGBTOYROW_AVX2
ANY11(ARGBToYRow_Any_AVX2, ARGBToYRow_AVX2, 0, 4, 1, 31)
#endif
#ifdef HAS_ARGBTOYJROW_AVX2
ANY11(ARGBToYJRow_Any_AVX2, ARGBToYJRow_AVX2, 0, 4, 1, 31)
#endif
#ifdef HAS_UYVYTOYROW_AVX2
ANY11(UYVYToYRow_Any_AVX2, UYVYToYRow_AVX2, 0, 2, 1, 31)
@ -1067,82 +1061,11 @@ ANY11(UYVYToYRow_Any_AVX2, UYVYToYRow_AVX2, 0, 2, 1, 31)
#ifdef HAS_YUY2TOYROW_AVX2
ANY11(YUY2ToYRow_Any_AVX2, YUY2ToYRow_AVX2, 1, 4, 1, 31)
#endif
#ifdef HAS_ARGBTOYROW_SSSE3
ANY11(ARGBToYRow_Any_SSSE3, ARGBToYRow_SSSE3, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYROW_AVX512BW
ANY11(ARGBToYRow_Any_AVX512BW, ARGBToYRow_AVX512BW, 0, 4, 1, 63)
#endif
#ifdef HAS_YUY2TOYROW_SSE2
ANY11(YUY2ToYRow_Any_SSE2, YUY2ToYRow_SSE2, 1, 4, 1, 15)
ANY11(UYVYToYRow_Any_SSE2, UYVYToYRow_SSE2, 1, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYJROW_SSSE3
ANY11(ARGBToYJRow_Any_SSSE3, ARGBToYJRow_SSSE3, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYROW_AVX512BW
ANY11(ARGBToYJRow_Any_AVX512BW, ARGBToYJRow_AVX512BW, 0, 4, 1, 63)
#endif
#ifdef HAS_ARGBTOYROW_NEON
ANY11(ARGBToYRow_Any_NEON, ARGBToYRow_NEON, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYROW_NEON_DOTPROD
ANY11(ARGBToYRow_Any_NEON_DotProd, ARGBToYRow_NEON_DotProd, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYROW_LSX
ANY11(ARGBToYRow_Any_LSX, ARGBToYRow_LSX, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYROW_LASX
ANY11(ARGBToYRow_Any_LASX, ARGBToYRow_LASX, 0, 4, 1, 31)
#endif
#ifdef HAS_ARGBTOYJROW_NEON
ANY11(ARGBToYJRow_Any_NEON, ARGBToYJRow_NEON, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYJROW_NEON_DOTPROD
ANY11(ARGBToYJRow_Any_NEON_DotProd, ARGBToYJRow_NEON_DotProd, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYJROW_LSX
ANY11(ARGBToYJRow_Any_LSX, ARGBToYJRow_LSX, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOYJROW_LASX
ANY11(ARGBToYJRow_Any_LASX, ARGBToYJRow_LASX, 0, 4, 1, 31)
#endif
#ifdef HAS_RGB24TOYROW_NEON
#endif
#ifdef HAS_RGB24TOYJROW_AVX2
#endif
#ifdef HAS_RGB24TOYJROW_SSSE3
#endif
#ifdef HAS_RGB24TOYJROW_NEON
#endif
#ifdef HAS_RGB24TOYROW_LSX
#endif
#ifdef HAS_RGB24TOYJROW_LSX
#endif
#ifdef HAS_RGB24TOYJROW_LASX
#endif
#ifdef HAS_RGB24TOYROW_LASX
#endif
#ifdef HAS_RAWTOYROW_NEON
#endif
#ifdef HAS_RAWTOYJROW_AVX2
#endif
#ifdef HAS_RAWTOYJROW_SSSE3
#endif
#ifdef HAS_RAWTOYJROW_NEON
#endif
#ifdef HAS_RAWTOYROW_LSX
#endif
#ifdef HAS_RAWTOYROW_LASX
#endif
#ifdef HAS_RAWTOYJROW_LSX
#endif
#ifdef HAS_RAWTOYJROW_LASX
#endif
#ifdef HAS_RGB565TOYROW_NEON
ANY11(RGB565ToYRow_Any_NEON, RGB565ToYRow_NEON, 0, 2, 1, 15)
#endif
@ -1944,24 +1867,6 @@ ANY12(SplitUVRow_Any_NEON, SplitUVRow_NEON, 0, 2, 0, 15)
#ifdef HAS_SPLITUVROW_LSX
ANY12(SplitUVRow_Any_LSX, SplitUVRow_LSX, 0, 2, 0, 31)
#endif
#ifdef HAS_ARGBTOUV444ROW_SSSE3
ANY12(ARGBToUV444Row_Any_SSSE3, ARGBToUV444Row_SSSE3, 0, 4, 0, 15)
#endif
#ifdef HAS_ARGBTOUVJ444ROW_SSSE3
ANY12(ARGBToUVJ444Row_Any_SSSE3, ARGBToUVJ444Row_SSSE3, 0, 4, 0, 15)
#endif
#ifdef HAS_ARGBTOUV444ROW_AVX2
ANY12(ARGBToUV444Row_Any_AVX2, ARGBToUV444Row_AVX2, 0, 4, 0, 31)
#endif
#ifdef HAS_ARGBTOUV444ROW_AVX512BW
ANY12(ARGBToUV444Row_Any_AVX512BW, ARGBToUV444Row_AVX512BW, 0, 4, 0, 63)
#endif
#ifdef HAS_ARGBTOUVJ444ROW_AVX2
ANY12(ARGBToUVJ444Row_Any_AVX2, ARGBToUVJ444Row_AVX2, 0, 4, 0, 31)
#endif
#ifdef HAS_ARGBTOUVJ444ROW_AVX512BW
ANY12(ARGBToUVJ444Row_Any_AVX512BW, ARGBToUVJ444Row_AVX512BW, 0, 4, 0, 63)
#endif
#ifdef HAS_YUY2TOUV422ROW_AVX2
ANY12(YUY2ToUV422Row_Any_AVX2, YUY2ToUV422Row_AVX2, 1, 4, 1, 31)
ANY12(UYVYToUV422Row_Any_AVX2, UYVYToUV422Row_AVX2, 1, 4, 1, 31)
@ -1971,22 +1876,14 @@ ANY12(YUY2ToUV422Row_Any_SSE2, YUY2ToUV422Row_SSE2, 1, 4, 1, 15)
ANY12(UYVYToUV422Row_Any_SSE2, UYVYToUV422Row_SSE2, 1, 4, 1, 15)
#endif
#ifdef HAS_YUY2TOUV422ROW_NEON
ANY12(ARGBToUV444Row_Any_NEON, ARGBToUV444Row_NEON, 0, 4, 0, 7)
ANY12(ARGBToUVJ444Row_Any_NEON, ARGBToUVJ444Row_NEON, 0, 4, 0, 7)
ANY12(YUY2ToUV422Row_Any_NEON, YUY2ToUV422Row_NEON, 1, 4, 1, 15)
ANY12(UYVYToUV422Row_Any_NEON, UYVYToUV422Row_NEON, 1, 4, 1, 15)
#endif
#ifdef HAS_ARGBTOUV444ROW_NEON_I8MM
ANY12(ARGBToUV444Row_Any_NEON_I8MM, ARGBToUV444Row_NEON_I8MM, 0, 4, 0, 7)
ANY12(ARGBToUVJ444Row_Any_NEON_I8MM, ARGBToUVJ444Row_NEON_I8MM, 0, 4, 0, 7)
#endif
#ifdef HAS_YUY2TOUV422ROW_LSX
ANY12(ARGBToUV444Row_Any_LSX, ARGBToUV444Row_LSX, 0, 4, 0, 15)
ANY12(YUY2ToUV422Row_Any_LSX, YUY2ToUV422Row_LSX, 1, 4, 1, 15)
ANY12(UYVYToUV422Row_Any_LSX, UYVYToUV422Row_LSX, 1, 4, 1, 15)
#endif
#ifdef HAS_YUY2TOUV422ROW_LASX
ANY12(ARGBToUV444Row_Any_LASX, ARGBToUV444Row_LASX, 0, 4, 0, 31)
ANY12(YUY2ToUV422Row_Any_LASX, YUY2ToUV422Row_LASX, 1, 4, 1, 31)
ANY12(UYVYToUV422Row_Any_LASX, UYVYToUV422Row_LASX, 1, 4, 1, 31)
#endif
@ -2222,6 +2119,12 @@ ANY12M(ARGBToUV444MatrixRow_Any_SSSE3, ARGBToUV444MatrixRow_SSSE3, 4, 15)
#ifdef HAS_ARGBTOUV444MATRIXROW_NEON
ANY12M(ARGBToUV444MatrixRow_Any_NEON, ARGBToUV444MatrixRow_NEON, 4, 7)
#endif
#ifdef HAS_ARGBTOUV444MATRIXROW_NEON_I8MM
ANY12M(ARGBToUV444MatrixRow_Any_NEON_I8MM,
ARGBToUV444MatrixRow_NEON_I8MM,
4,
7)
#endif
#define ANY11MC(NAMEANY, ANY_SIMD, BPP, MASK) \
void NAMEANY(const uint8_t* src_ptr, uint8_t* dst_ptr, int width, \
@ -2239,10 +2142,10 @@ ANY12M(ARGBToUV444MatrixRow_Any_NEON, ARGBToUV444MatrixRow_NEON, 4, 7)
memcpy(dst_ptr + (ptrdiff_t)n, vout, (ptrdiff_t)r); \
}
#ifdef HAS_ARGBTOYROW_SSSE3
#ifdef HAS_ARGBTOYMATRIXROW_SSSE3
ANY11MC(ARGBToYMatrixRow_Any_SSSE3, ARGBToYMatrixRow_SSSE3, 4, 15)
#endif
#ifdef HAS_ARGBTOYROW_AVX2
#ifdef HAS_ARGBTOYMATRIXROW_AVX2
ANY11MC(ARGBToYMatrixRow_Any_AVX2, ARGBToYMatrixRow_AVX2, 4, 31)
ANY11MC(RGBToYMatrixRow_Any_AVX2, RGBToYMatrixRow_AVX2, 3, 31)
ANY11MC(RGB565ToYMatrixRow_Any_AVX2, RGB565ToYMatrixRow_AVX2, 2, 31)
@ -2253,7 +2156,7 @@ ANY11MC(ARGB1555ToYMatrixRow_Any_AVX2, ARGB1555ToYMatrixRow_AVX2, 2, 31)
ANY11MC(ARGB4444ToYMatrixRow_Any_AVX2, ARGB4444ToYMatrixRow_AVX2, 2, 31)
#endif
#endif
#ifdef HAS_ARGBTOYROW_AVX512BW
#ifdef HAS_ARGBTOYMATRIXROW_AVX512BW
ANY11MC(ARGBToYMatrixRow_Any_AVX512BW, ARGBToYMatrixRow_AVX512BW, 4, 63)
#endif
#ifdef HAS_ARGBTOYMATRIXROW_NEON
@ -2285,27 +2188,6 @@ ANY11MC(ARGBToYMatrixRow_Any_RVV, ARGBToYMatrixRow_RVV, 4, 15)
#endif
#undef ANY11MC
#ifdef HAS_ARGBTOUVROW_AVX2
ANY12S(ARGBToUVRow_Any_AVX2, ARGBToUVRow_AVX2, 0, 4, 31)
#endif
#ifdef HAS_ARGBTOUVROW_AVX512BW
ANY12S(ARGBToUVRow_Any_AVX512BW, ARGBToUVRow_AVX512BW, 0, 4, 63)
#endif
#ifdef HAS_ARGBTOUVJROW_AVX2
ANY12S(ARGBToUVJRow_Any_AVX2, ARGBToUVJRow_AVX2, 0, 4, 31)
#endif
#ifdef HAS_ARGBTOUVJROW_AVX512BW
ANY12S(ARGBToUVJRow_Any_AVX512BW, ARGBToUVJRow_AVX512BW, 0, 4, 63)
#endif
#ifdef HAS_ARGBTOUVJROW_SSSE3
ANY12S(ARGBToUVJRow_Any_SSSE3, ARGBToUVJRow_SSSE3, 0, 4, 15)
#endif
#ifdef HAS_ARGBTOUVROW_SSSE3
ANY12S(ARGBToUVRow_Any_SSSE3, ARGBToUVRow_SSSE3, 0, 4, 15)
#endif
#ifdef HAS_YUY2TOUVROW_AVX2
ANY12S(YUY2ToUVRow_Any_AVX2, YUY2ToUVRow_AVX2, 1, 4, 31)
ANY12S(UYVYToUVRow_Any_AVX2, UYVYToUVRow_AVX2, 1, 4, 31)
@ -2314,50 +2196,10 @@ ANY12S(UYVYToUVRow_Any_AVX2, UYVYToUVRow_AVX2, 1, 4, 31)
ANY12S(YUY2ToUVRow_Any_SSE2, YUY2ToUVRow_SSE2, 1, 4, 15)
ANY12S(UYVYToUVRow_Any_SSE2, UYVYToUVRow_SSE2, 1, 4, 15)
#endif
#ifdef HAS_ARGBTOUVROW_NEON
ANY12S(ARGBToUVRow_Any_NEON, ARGBToUVRow_NEON, 0, 4, 15)
#endif
#ifdef HAS_ARGBTOUVROW_NEON_I8MM
ANY12S(ARGBToUVRow_Any_NEON_I8MM, ARGBToUVRow_NEON_I8MM, 0, 4, 15)
#endif
#ifdef HAS_ARGBTOUVROW_SVE2
ANY12S(ARGBToUVRow_Any_SVE2, ARGBToUVRow_SVE2, 0, 4, 1)
#endif
#ifdef HAS_ARGBTOUVROW_SME
ANY12S(ARGBToUVRow_Any_SME, ARGBToUVRow_SME, 0, 4, 1)
#endif
#ifdef HAS_ARGBTOUVROW_LSX
ANY12S(ARGBToUVRow_Any_LSX, ARGBToUVRow_LSX, 0, 4, 15)
#endif
#ifdef HAS_ARGBTOUVROW_LASX
ANY12S(ARGBToUVRow_Any_LASX, ARGBToUVRow_LASX, 0, 4, 31)
#endif
#ifdef HAS_ARGBTOUVJROW_NEON
ANY12S(ARGBToUVJRow_Any_NEON, ARGBToUVJRow_NEON, 0, 4, 15)
#endif
#ifdef HAS_ARGBTOUVJROW_NEON_I8MM
ANY12S(ARGBToUVJRow_Any_NEON_I8MM, ARGBToUVJRow_NEON_I8MM, 0, 4, 15)
#endif
#ifdef HAS_ARGBTOUVJROW_SVE2
ANY12S(ARGBToUVJRow_Any_SVE2, ARGBToUVJRow_SVE2, 0, 4, 1)
#endif
#ifdef HAS_ARGBTOUVJROW_SME
ANY12S(ARGBToUVJRow_Any_SME, ARGBToUVJRow_SME, 0, 4, 1)
#endif
#ifdef HAS_ARGBTOUVJROW_LSX
ANY12S(ARGBToUVJRow_Any_LSX, ARGBToUVJRow_LSX, 0, 4, 15)
#endif
#ifdef HAS_ARGBTOUVJROW_LASX
ANY12S(ARGBToUVJRow_Any_LASX, ARGBToUVJRow_LASX, 0, 4, 31)
#endif
#ifdef HAS_RGB24TOUVROW_NEON
ANY12S(RGB24ToUVRow_Any_NEON, RGB24ToUVRow_NEON, 0, 3, 15)
#endif
#ifdef HAS_RGB24TOUVJROW_NEON
ANY12S(RGB24ToUVJRow_Any_NEON, RGB24ToUVJRow_NEON, 0, 3, 15)
#endif
#ifdef HAS_RGB24TOUVROW_LSX
ANY12S(RGB24ToUVRow_Any_LSX, RGB24ToUVRow_LSX, 0, 3, 15)
#endif
@ -2367,9 +2209,6 @@ ANY12S(RGB24ToUVRow_Any_LASX, RGB24ToUVRow_LASX, 0, 3, 31)
#ifdef HAS_RAWTOUVROW_NEON
ANY12S(RAWToUVRow_Any_NEON, RAWToUVRow_NEON, 0, 3, 15)
#endif
#ifdef HAS_RAWTOUVJROW_NEON
ANY12S(RAWToUVJRow_Any_NEON, RAWToUVJRow_NEON, 0, 3, 15)
#endif
#ifdef HAS_RAWTOUVROW_LSX
ANY12S(RAWToUVRow_Any_LSX, RAWToUVRow_LSX, 0, 3, 15)
#endif

View File

@ -1105,40 +1105,6 @@ void ARGB4444ToUVRow_C(const uint8_t* src_argb4444,
}
}
void ARGBToUV444Row_C(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
int x;
for (x = 0; x < width; ++x) {
uint8_t ab = src_argb[0];
uint8_t ag = src_argb[1];
uint8_t ar = src_argb[2];
dst_u[0] = RGBToU(ar, ag, ab);
dst_v[0] = RGBToV(ar, ag, ab);
src_argb += 4;
dst_u += 1;
dst_v += 1;
}
}
void ARGBToUVJ444Row_C(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
int x;
for (x = 0; x < width; ++x) {
uint8_t ab = src_argb[0];
uint8_t ag = src_argb[1];
uint8_t ar = src_argb[2];
dst_u[0] = RGBToUJ(ar, ag, ab);
dst_v[0] = RGBToVJ(ar, ag, ab);
src_argb += 4;
dst_u += 1;
dst_v += 1;
}
}
void ARGBGrayRow_C(const uint8_t* src_argb, uint8_t* dst_argb, int width) {
int x;
for (x = 0; x < width; ++x) {

View File

@ -25,7 +25,7 @@ extern "C" {
// clang for windows needing to preserve xmm registers but not saving
// them if declared as ymm or zmm.
#if defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3)
#if defined(HAS_ARGBTOYMATRIXROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3)
// Constants for ARGB
@ -33,9 +33,9 @@ extern "C" {
static const uvec8 kARGBToYJ = {29u, 150u, 77u, 0u, 29u, 150u, 77u, 0u,
29u, 150u, 77u, 0u, 29u, 150u, 77u, 0u};
#endif // defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3)
#endif // defined(HAS_ARGBTOYMATRIXROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3)
#if defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3)
#if defined(HAS_ARGBTOYMATRIXROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3)
// Constants for BGRA
// Constants for ABGR
@ -46,7 +46,7 @@ static const uvec8 kARGBToYJ = {29u, 150u, 77u, 0u, 29u, 150u, 77u, 0u,
static const uvec16 kSub128 = {0x8080u, 0x8080u, 0x8080u, 0x8080u,
0x8080u, 0x8080u, 0x8080u, 0x8080u};
#endif // defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3)
#endif // defined(HAS_ARGBTOYMATRIXROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3)
#ifdef HAS_RGB24TOARGBROW_SSSE3
@ -1362,55 +1362,14 @@ void AB64ToARGBRow_AVX2(const uint16_t* src_ab64,
// clang-format on
#ifdef HAS_ARGBTOYROW_SSSE3
// Convert 16 ARGB pixels (64 bytes) to 16 Y values.
void ARGBToYRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_SSSE3(src_argb, dst_y, width, &kArgbI601Constants);
}
#endif // HAS_ARGBTOYROW_SSSE3
#ifdef HAS_ARGBTOYJROW_SSSE3
// Convert 16 ARGB pixels (64 bytes) to 16 YJ values.
// Same as ARGBToYRow but different coefficients, no add 16.
void ARGBToYJRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_SSSE3(src_argb, dst_y, width, &kArgbJPEGConstants);
}
#endif // HAS_ARGBTOYJROW_SSSE3
#if defined(HAS_ARGBTOYROW_AVX2) || defined(HAS_ABGRTOYROW_AVX2) || \
defined(HAS_ARGBEXTRACTALPHAROW_AVX2)
// vpermd for vphaddw + vpackuswb vpermd.
#endif
#ifdef HAS_ARGBTOYROW_AVX2
// Convert 32 ARGB pixels (128 bytes) to 32 Y values.
#ifdef HAS_ARGBTOYROW_AVX2
void ARGBToYRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_AVX2(src_argb, dst_y, width, &kArgbI601Constants);
}
#endif
#endif // HAS_ARGBTOYROW_AVX2
#ifdef HAS_ARGBTOYJROW_AVX2
// Convert 32 ARGB pixels (128 bytes) to 32 Y values.
#ifdef HAS_ARGBTOYROW_AVX2
void ARGBToYJRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_AVX2(src_argb, dst_y, width, &kArgbJPEGConstants);
}
#endif
#endif // HAS_ARGBTOYJROW_AVX2
#if defined(HAS_ARGBTOYROW_AVX2) || defined(HAS_ARGBTOUV444ROW_AVX2) || \
#if defined(HAS_ARGBTOYMATRIXROW_AVX2) || \
defined(HAS_ARGBTOUV444MATRIXROW_AVX2) || \
defined(HAS_ARGBEXTRACTALPHAROW_AVX2)
// vpermd for vphaddw + vpackuswb vpermd.
static const lvec32 kPermdARGBToY_AVX = {0, 4, 1, 5, 2, 6, 3, 7};
#endif
#ifdef HAS_ARGBTOYROW_SSSE3
#ifdef HAS_ARGBTOYMATRIXROW_SSSE3
void ARGBToYMatrixRow_SSSE3(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
@ -1434,7 +1393,7 @@ void ARGBToYMatrixRow_SSSE3(const uint8_t* src_argb,
}
#endif
#ifdef HAS_ARGBTOYROW_AVX2
#ifdef HAS_ARGBTOYMATRIXROW_AVX2
void ARGBToYMatrixRow_AVX2(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
@ -1460,18 +1419,19 @@ void ARGBToYMatrixRow_AVX2(const uint8_t* src_argb,
}
#endif
#if defined(HAS_ARGBTOYROW_AVX512BW) || \
defined(HAS_ARGBTOUV444ROW_AVX512BW) || defined(HAS_ARGBTOUVROW_AVX512BW)
#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW) || \
defined(HAS_ARGBTOUV444MATRIXROW_AVX512BW) || \
defined(HAS_ARGBTOUVMATRIXROW_AVX512BW)
static const uint32_t kPermdARGBToY_AVX512BW[16] = {0, 4, 8, 12, 1, 5, 9, 13,
2, 6, 10, 14, 3, 7, 11, 15};
#endif
#if defined(HAS_ARGBTOUVROW_AVX512BW) || defined(HAS_ARGBTOUVJROW_AVX512BW)
#if defined(HAS_ARGBTOUVMATRIXROW_AVX512BW)
static const uint32_t kPermdARGBToUV_AVX512BW[16] = {
0, 1, 4, 5, 8, 9, 12, 13, 2, 3, 6, 7, 10, 11, 14, 15};
#endif
#ifdef HAS_ARGBTOYROW_AVX512BW
#ifdef HAS_ARGBTOYMATRIXROW_AVX512BW
void ARGBToYMatrixRow_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_y,
int width,
@ -1529,7 +1489,7 @@ void ARGBToYMatrixRow_AVX512BW(const uint8_t* src_argb,
}
#endif
#ifdef HAS_ARGBTOUV444ROW_SSSE3
#ifdef HAS_ARGBTOUV444MATRIXROW_SSSE3
void ARGBToUV444MatrixRow_SSSE3(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
@ -1597,9 +1557,9 @@ void ARGBToUV444MatrixRow_SSSE3(const uint8_t* src_argb,
: "r"(c) // %4
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6");
}
#endif // HAS_ARGBTOUV444ROW_SSSE3
#endif // HAS_ARGBTOUV444MATRIXROW_SSSE3
#ifdef HAS_ARGBTOUV444ROW_AVX2
#ifdef HAS_ARGBTOUV444MATRIXROW_AVX2
void ARGBToUV444MatrixRow_AVX2(const uint8_t* src_argb,
uint8_t* dst_u,
@ -1669,9 +1629,9 @@ void ARGBToUV444MatrixRow_AVX2(const uint8_t* src_argb,
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
"xmm7");
}
#endif // HAS_ARGBTOUV444ROW_AVX2
#endif // HAS_ARGBTOUV444MATRIXROW_AVX2
#ifdef HAS_ARGBTOUV444ROW_AVX512BW
#ifdef HAS_ARGBTOUV444MATRIXROW_AVX512BW
void ARGBToUV444MatrixRow_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_u,
@ -1749,9 +1709,9 @@ void ARGBToUV444MatrixRow_AVX512BW(const uint8_t* src_argb,
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
"xmm7", "xmm16");
}
#endif // HAS_ARGBTOUV444ROW_AVX512BW
#endif // HAS_ARGBTOUV444MATRIXROW_AVX512BW
#ifdef HAS_ARGBTOUVROW_SSSE3
#ifdef HAS_ARGBTOUVMATRIXROW_SSSE3
// ARGBARGB to AARRGGBB shuffle
static const lvec8 kShuffleAARRGGBB = {
@ -1829,9 +1789,9 @@ void ARGBToUVMatrixRow_SSSE3(const uint8_t* src_argb,
"xmm7");
}
#endif // HAS_ARGBTOUVROW_SSSE3
#endif // HAS_ARGBTOUVMATRIXROW_SSSE3
#ifdef HAS_ARGBTOUVROW_AVX2
#ifdef HAS_ARGBTOUVMATRIXROW_AVX2
// 16x2 -> 8x1 ARGB pixels converted to 8 U and 8 V
// ARGBToUV does rounding average of 4 ARGB pixels
@ -1903,7 +1863,7 @@ void ARGBToUVMatrixRow_AVX2(const uint8_t* src_argb,
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
"xmm7");
}
#endif // HAS_ARGBTOUVROW_AVX2
#endif // HAS_ARGBTOUVMATRIXROW_AVX2
// RGB to BT601 coefficients
// UB 0.875 coefficient = 112
@ -1913,133 +1873,7 @@ void ARGBToUVMatrixRow_AVX2(const uint8_t* src_argb,
// VG -0.7344 coefficient = -94
// VR 0.875 coefficient = 112
#ifdef HAS_ARGBTOUV444ROW_SSSE3
void ARGBToUV444Row_SSSE3(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_SSSE3(src_argb, dst_u, dst_v, width,
&kArgbI601Constants);
}
#endif // HAS_ARGBTOUV444ROW_SSSE3
#ifdef HAS_ARGBTOYROW_AVX512BW
void ARGBToYRow_AVX512BW(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_AVX512BW(src_argb, dst_y, width, &kArgbI601Constants);
}
#endif
#ifdef HAS_ARGBTOYROW_AVX512BW
void ARGBToYJRow_AVX512BW(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_AVX512BW(src_argb, dst_y, width, &kArgbJPEGConstants);
}
#endif
#ifdef HAS_ARGBTOUV444ROW_AVX2
void ARGBToUV444Row_AVX2(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_AVX2(src_argb, dst_u, dst_v, width, &kArgbI601Constants);
}
#endif // HAS_ARGBTOUV444ROW_AVX2
#ifdef HAS_ARGBTOUV444ROW_AVX512BW
void ARGBToUV444Row_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_AVX512BW(src_argb, dst_u, dst_v, width,
&kArgbI601Constants);
}
#endif // HAS_ARGBTOUV444ROW_AVX512BW
#ifdef HAS_ARGBTOUVROW_SSSE3
void ARGBToUVRow_SSSE3(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_SSSE3(src_argb, src_stride_argb, dst_u, dst_v, width,
&kArgbI601Constants);
}
#endif // HAS_ARGBTOUVROW_SSSE3
#ifdef HAS_ARGBTOUVROW_AVX2
void ARGBToUVRow_AVX2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_AVX2(src_argb, src_stride_argb, dst_u, dst_v, width,
&kArgbI601Constants);
}
#endif // HAS_ARGBTOUVROW_AVX2
#ifdef HAS_ARGBTOUVJ444ROW_SSSE3
void ARGBToUVJ444Row_SSSE3(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_SSSE3(src_argb, dst_u, dst_v, width,
&kArgbJPEGConstants);
}
#endif // HAS_ARGBTOUVJ444ROW_SSSE3
#ifdef HAS_ARGBTOUVJ444ROW_AVX2
void ARGBToUVJ444Row_AVX2(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_AVX2(src_argb, dst_u, dst_v, width, &kArgbJPEGConstants);
}
#endif // HAS_ARGBTOUVJ444ROW_AVX2
#ifdef HAS_ARGBTOUVJ444ROW_AVX512BW
void ARGBToUVJ444Row_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_AVX512BW(src_argb, dst_u, dst_v, width,
&kArgbJPEGConstants);
}
#endif // HAS_ARGBTOUVJ444ROW_AVX512BW
#ifdef HAS_ARGBTOUVJROW_SSSE3
void ARGBToUVJRow_SSSE3(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_SSSE3(src_argb, src_stride_argb, dst_u, dst_v, width,
&kArgbJPEGConstants);
}
#endif // HAS_ARGBTOUVJROW_SSSE3
#ifdef HAS_ARGBTOUVJROW_AVX2
void ARGBToUVJRow_AVX2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_AVX2(src_argb, src_stride_argb, dst_u, dst_v, width,
&kArgbJPEGConstants);
}
#endif // HAS_ARGBTOUVJROW_AVX2
#ifdef HAS_ARGBTOUVROW_AVX512BW
#ifdef HAS_ARGBTOUVMATRIXROW_AVX512BW
// 32x2 -> 16x1 ARGB pixels converted to 16 U and 16 V
// ARGBToUV does rounding average of 4 ARGB pixels
@ -2121,33 +1955,7 @@ void ARGBToUVMatrixRow_AVX512BW(const uint8_t* src_argb,
: "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6",
"xmm7", "xmm16", "xmm17", "xmm18", "xmm19");
}
void ARGBToUVRow_AVX512BW(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_AVX512BW(src_argb, src_stride_argb, dst_u, dst_v, width,
&kArgbI601Constants);
}
#ifdef HAS_ARGBTOUVJROW_AVX512BW
void ARGBToUVJRow_AVX512BW(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_AVX512BW(src_argb, src_stride_argb, dst_u, dst_v, width,
&kArgbJPEGConstants);
}
#endif // HAS_ARGBTOUVJROW_AVX512BW
#endif // HAS_ARGBTOUVROW_AVX512BW
#endif // HAS_ARGBTOUVMATRIXROW_AVX512BW
#if defined(HAS_I422TOARGBROW_SSSE3) || defined(HAS_I422TOARGBROW_AVX2)

View File

@ -786,82 +786,6 @@ void UYVYToUV422Row_LASX(const uint8_t* src_uyvy,
dst_v += 16;
}
}
void ARGBToUVRow_LASX(const uint8_t* src_argb0,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
int x;
int len = width / 32;
const uint8_t* src_argb1 = src_argb0 + src_stride_argb;
__m256i src0, src1, src2, src3, src4, src5, src6, src7;
__m256i vec0, vec1, vec2, vec3;
__m256i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, dst0, dst1;
__m256i const_0x70 = __lasx_xvldi(0x470);
__m256i const_0x4A = __lasx_xvldi(0x44A);
__m256i const_0x26 = __lasx_xvldi(0x426);
__m256i const_0x5E = __lasx_xvldi(0x45E);
__m256i const_0x12 = __lasx_xvldi(0x412);
__m256i control = {0x0000000400000000, 0x0000000500000001, 0x0000000600000002,
0x0000000700000003};
__m256i const_0x8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
0x8000800080008000, 0x8000800080008000};
for (x = 0; x < len; x++) {
DUP4_ARG2(__lasx_xvld, src_argb0, 0, src_argb0, 32, src_argb0, 64,
src_argb0, 96, src0, src1, src2, src3);
DUP4_ARG2(__lasx_xvld, src_argb1, 0, src_argb1, 32, src_argb1, 64,
src_argb1, 96, src4, src5, src6, src7);
vec0 = __lasx_xvaddwev_h_bu(src0, src4);
vec1 = __lasx_xvaddwev_h_bu(src1, src5);
vec2 = __lasx_xvaddwev_h_bu(src2, src6);
vec3 = __lasx_xvaddwev_h_bu(src3, src7);
tmp0 = __lasx_xvpickev_h(vec1, vec0);
tmp1 = __lasx_xvpickev_h(vec3, vec2);
tmp2 = __lasx_xvpickod_h(vec1, vec0);
tmp3 = __lasx_xvpickod_h(vec3, vec2);
vec0 = __lasx_xvaddwod_h_bu(src0, src4);
vec1 = __lasx_xvaddwod_h_bu(src1, src5);
vec2 = __lasx_xvaddwod_h_bu(src2, src6);
vec3 = __lasx_xvaddwod_h_bu(src3, src7);
tmp4 = __lasx_xvpickev_h(vec1, vec0);
tmp5 = __lasx_xvpickev_h(vec3, vec2);
vec0 = __lasx_xvpickev_h(tmp1, tmp0);
vec1 = __lasx_xvpickod_h(tmp1, tmp0);
src0 = __lasx_xvadd_h(vec0, vec1);
src0 = __lasx_xvsrari_h(src0, 2);
vec0 = __lasx_xvpickev_h(tmp3, tmp2);
vec1 = __lasx_xvpickod_h(tmp3, tmp2);
src1 = __lasx_xvadd_h(vec0, vec1);
src1 = __lasx_xvsrari_h(src1, 2);
vec0 = __lasx_xvpickev_h(tmp5, tmp4);
vec1 = __lasx_xvpickod_h(tmp5, tmp4);
src2 = __lasx_xvadd_h(vec0, vec1);
src2 = __lasx_xvsrari_h(src2, 2);
dst0 = __lasx_xvmadd_h(const_0x8000, src0, const_0x70);
dst0 = __lasx_xvmsub_h(dst0, src2, const_0x4A);
dst0 = __lasx_xvmsub_h(dst0, src1, const_0x26);
dst1 = __lasx_xvmadd_h(const_0x8000, src1, const_0x70);
dst1 = __lasx_xvmsub_h(dst1, src2, const_0x5E);
dst1 = __lasx_xvmsub_h(dst1, src0, const_0x12);
dst0 = __lasx_xvperm_w(dst0, control);
dst1 = __lasx_xvperm_w(dst1, control);
dst0 = __lasx_xvssrani_b_h(dst0, dst0, 8);
dst1 = __lasx_xvssrani_b_h(dst1, dst1, 8);
__lasx_xvstelm_d(dst0, dst_u, 0, 0);
__lasx_xvstelm_d(dst0, dst_u, 8, 2);
__lasx_xvstelm_d(dst1, dst_v, 0, 0);
__lasx_xvstelm_d(dst1, dst_v, 8, 2);
src_argb0 += 128;
src_argb1 += 128;
dst_u += 16;
dst_v += 16;
}
}
void ARGBToRGB24Row_LASX(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
int x;
int len = (width / 32) - 1;
@ -1034,59 +958,6 @@ void ARGBToARGB4444Row_LASX(const uint8_t* src_argb,
}
}
void ARGBToUV444Row_LASX(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int32_t width) {
int x;
int len = width / 32;
__m256i src0, src1, src2, src3;
__m256i tmp0, tmp1, tmp2, tmp3;
__m256i reg0, reg1, reg2, reg3, dst0, dst1;
__m256i const_112 = __lasx_xvldi(112);
__m256i const_74 = __lasx_xvldi(74);
__m256i const_38 = __lasx_xvldi(38);
__m256i const_94 = __lasx_xvldi(94);
__m256i const_18 = __lasx_xvldi(18);
__m256i const_0x8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
0x8000800080008000, 0x8000800080008000};
__m256i control = {0x0000000400000000, 0x0000000500000001, 0x0000000600000002,
0x0000000700000003};
for (x = 0; x < len; x++) {
DUP4_ARG2(__lasx_xvld, src_argb, 0, src_argb, 32, src_argb, 64, src_argb,
96, src0, src1, src2, src3);
tmp0 = __lasx_xvpickev_h(src1, src0);
tmp1 = __lasx_xvpickod_h(src1, src0);
tmp2 = __lasx_xvpickev_h(src3, src2);
tmp3 = __lasx_xvpickod_h(src3, src2);
reg0 = __lasx_xvmaddwev_h_bu(const_0x8000, tmp0, const_112);
reg1 = __lasx_xvmaddwev_h_bu(const_0x8000, tmp2, const_112);
reg2 = __lasx_xvmulwod_h_bu(tmp0, const_74);
reg3 = __lasx_xvmulwod_h_bu(tmp2, const_74);
reg2 = __lasx_xvmaddwev_h_bu(reg2, tmp1, const_38);
reg3 = __lasx_xvmaddwev_h_bu(reg3, tmp3, const_38);
reg0 = __lasx_xvsub_h(reg0, reg2);
reg1 = __lasx_xvsub_h(reg1, reg3);
dst0 = __lasx_xvssrani_b_h(reg1, reg0, 8);
dst0 = __lasx_xvperm_w(dst0, control);
reg0 = __lasx_xvmaddwev_h_bu(const_0x8000, tmp1, const_112);
reg1 = __lasx_xvmaddwev_h_bu(const_0x8000, tmp3, const_112);
reg2 = __lasx_xvmulwev_h_bu(tmp0, const_18);
reg3 = __lasx_xvmulwev_h_bu(tmp2, const_18);
reg2 = __lasx_xvmaddwod_h_bu(reg2, tmp0, const_94);
reg3 = __lasx_xvmaddwod_h_bu(reg3, tmp2, const_94);
reg0 = __lasx_xvsub_h(reg0, reg2);
reg1 = __lasx_xvsub_h(reg1, reg3);
dst1 = __lasx_xvssrani_b_h(reg1, reg0, 8);
dst1 = __lasx_xvperm_w(dst1, control);
__lasx_xvst(dst0, dst_u, 0);
__lasx_xvst(dst1, dst_v, 0);
dst_u += 32;
dst_v += 32;
src_argb += 128;
}
}
void ARGBMultiplyRow_LASX(const uint8_t* src_argb0,
const uint8_t* src_argb1,
uint8_t* dst_argb,
@ -2013,41 +1884,6 @@ void NV21ToARGBRow_LASX(const uint8_t* src_y,
}
}
// RGB to JPeg coefficients
// B * 0.1140 coefficient = 29
// G * 0.5870 coefficient = 150
// R * 0.2990 coefficient = 77
// Add 0.5 = 0x80
static const struct ArgbConstants kRgb24JPEGConstants = {{29, 150, 77, 0},
{0},
{0},
{128},
{0}};
static const struct ArgbConstants kRawJPEGConstants = {{77, 150, 29, 0},
{0},
{0},
{128},
{0}};
// RGB to BT.601 coefficients
// B * 0.1016 coefficient = 25
// G * 0.5078 coefficient = 129
// R * 0.2578 coefficient = 66
// Add 16.5 = 0x1080
static const struct ArgbConstants kRgb24I601Constants = {{25, 129, 66, 0},
{0},
{0},
{0x1080},
{0}};
static const struct ArgbConstants kRawI601Constants = {{66, 129, 25, 0},
{0},
{0},
{0x1080},
{0}};
// ARGB expects first 3 values to contain RGB and 4th value is ignored.
void ARGBToYMatrixRow_LASX(const uint8_t* src_argb,
uint8_t* dst_y,
@ -2096,20 +1932,10 @@ void ARGBToYMatrixRow_LASX(const uint8_t* src_argb,
: "memory");
}
void ARGBToYRow_LASX(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_LASX(src_argb, dst_y, width, &kRgb24I601Constants);
}
void ARGBToYJRow_LASX(const uint8_t* src_argb, uint8_t* dst_yj, int width) {
ARGBToYMatrixRow_LASX(src_argb, dst_yj, width, &kRgb24JPEGConstants);
}
static void RGBToYMatrixRow_LASX(const uint8_t* src_rgba,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c) {
void RGBToYMatrixRow_LASX(const uint8_t* src_rgba,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c) {
int8_t shuff[128] = {
0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23,
0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 18, 20, 21, 23,
@ -2163,91 +1989,6 @@ static void RGBToYMatrixRow_LASX(const uint8_t* src_rgba,
"r"(shuff) // %4
: "memory");
}
void ARGBToUVJRow_LASX(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
int x;
const uint8_t* next_argb = src_argb + src_stride_argb;
int len = width / 32;
__m256i src0, src1, src2, src3;
__m256i nex0, nex1, nex2, nex3;
__m256i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
__m256i reg0, reg1, dst0;
__m256i tmpb, tmpg, tmpr, nexb, nexg, nexr;
__m256i const_128 = __lasx_xvldi(0x480);
__m256i const_85 = __lasx_xvldi(0x455);
__m256i const_43 = __lasx_xvldi(0x42B);
__m256i const_107 = __lasx_xvldi(0x46B);
__m256i const_21 = __lasx_xvldi(0x415);
__m256i const_8000 = (__m256i)v4u64{0x8000800080008000, 0x8000800080008000,
0x8000800080008000, 0x8000800080008000};
__m256i shuff = {0x1614060412100200, 0x1E1C0E0C1A180A08, 0x1715070513110301,
0x1F1D0F0D1B190B09};
for (x = 0; x < len; x++) {
DUP4_ARG2(__lasx_xvld, src_argb, 0, src_argb, 32, src_argb, 64, src_argb,
96, src0, src1, src2, src3);
DUP4_ARG2(__lasx_xvld, next_argb, 0, next_argb, 32, next_argb, 64,
next_argb, 96, nex0, nex1, nex2, nex3);
tmp0 = __lasx_xvpickev_b(src1, src0);
tmp1 = __lasx_xvpickod_b(src1, src0);
tmp2 = __lasx_xvpickev_b(src3, src2);
tmp3 = __lasx_xvpickod_b(src3, src2);
tmpr = __lasx_xvpickod_b(tmp2, tmp0);
tmpb = __lasx_xvpickev_b(tmp2, tmp0);
tmpg = __lasx_xvpickev_b(tmp3, tmp1);
tmp0 = __lasx_xvpickev_b(nex1, nex0);
tmp1 = __lasx_xvpickod_b(nex1, nex0);
tmp2 = __lasx_xvpickev_b(nex3, nex2);
tmp3 = __lasx_xvpickod_b(nex3, nex2);
nexr = __lasx_xvpickod_b(tmp2, tmp0);
nexb = __lasx_xvpickev_b(tmp2, tmp0);
nexg = __lasx_xvpickev_b(tmp3, tmp1);
tmp0 = __lasx_xvaddwev_h_bu(tmpb, nexb);
tmp1 = __lasx_xvaddwod_h_bu(tmpb, nexb);
tmp2 = __lasx_xvaddwev_h_bu(tmpg, nexg);
tmp3 = __lasx_xvaddwod_h_bu(tmpg, nexg);
reg0 = __lasx_xvaddwev_h_bu(tmpr, nexr);
reg1 = __lasx_xvaddwod_h_bu(tmpr, nexr);
tmp4 = __lasx_xvaddwev_w_hu(tmp0, tmp1);
tmp5 = __lasx_xvaddwod_w_hu(tmp0, tmp1);
tmp0 = __lasx_xvilvl_w(tmp5, tmp4);
tmp1 = __lasx_xvilvh_w(tmp5, tmp4);
tmpb = __lasx_xvssrarni_hu_w(tmp1, tmp0, 2);
tmp4 = __lasx_xvaddwev_w_hu(tmp2, tmp3);
tmp5 = __lasx_xvaddwod_w_hu(tmp2, tmp3);
tmp2 = __lasx_xvilvl_w(tmp5, tmp4);
tmp3 = __lasx_xvilvh_w(tmp5, tmp4);
tmpg = __lasx_xvssrarni_hu_w(tmp3, tmp2, 2);
tmp4 = __lasx_xvaddwev_w_hu(reg0, reg1);
tmp5 = __lasx_xvaddwod_w_hu(reg0, reg1);
tmp0 = __lasx_xvilvl_w(tmp5, tmp4);
tmp1 = __lasx_xvilvh_w(tmp5, tmp4);
tmpr = __lasx_xvssrarni_hu_w(tmp1, tmp0, 2);
reg0 = __lasx_xvmadd_h(const_8000, const_128, tmpb);
reg1 = __lasx_xvmadd_h(const_8000, const_128, tmpr);
reg0 = __lasx_xvmsub_h(reg0, const_85, tmpg);
reg1 = __lasx_xvmsub_h(reg1, const_107, tmpg);
reg0 = __lasx_xvmsub_h(reg0, const_43, tmpr);
reg1 = __lasx_xvmsub_h(reg1, const_21, tmpb);
dst0 = __lasx_xvpackod_b(reg1, reg0);
tmp0 = __lasx_xvpermi_d(dst0, 0x44);
tmp1 = __lasx_xvpermi_d(dst0, 0xEE);
dst0 = __lasx_xvshuf_b(tmp1, tmp0, shuff);
__lasx_xvstelm_d(dst0, dst_u, 0, 0);
__lasx_xvstelm_d(dst0, dst_v, 0, 2);
__lasx_xvstelm_d(dst0, dst_u, 8, 1);
__lasx_xvstelm_d(dst0, dst_v, 8, 3);
dst_u += 16;
dst_v += 16;
src_argb += 128;
next_argb += 128;
}
}
// undef for unified sources build
#undef ALPHA_VAL
#undef YUVTORGB_SETUP

View File

@ -786,74 +786,6 @@ void UYVYToUV422Row_LSX(const uint8_t* src_uyvy,
dst_v += 8;
}
}
void ARGBToUVRow_LSX(const uint8_t* src_argb0,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
int x;
int len = width / 16;
const uint8_t* src_argb1 = src_argb0 + src_stride_argb;
__m128i src0, src1, src2, src3, src4, src5, src6, src7;
__m128i vec0, vec1, vec2, vec3;
__m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, dst0, dst1;
__m128i const_0x70 = __lsx_vldi(0x470);
__m128i const_0x4A = __lsx_vldi(0x44A);
__m128i const_0x26 = __lsx_vldi(0x426);
__m128i const_0x5E = __lsx_vldi(0x45E);
__m128i const_0x12 = __lsx_vldi(0x412);
__m128i const_0x8000 = (__m128i)v2u64{0x8000800080008000, 0x8000800080008000};
for (x = 0; x < len; x++) {
DUP4_ARG2(__lsx_vld, src_argb0, 0, src_argb0, 16, src_argb0, 32, src_argb0,
48, src0, src1, src2, src3);
DUP4_ARG2(__lsx_vld, src_argb1, 0, src_argb1, 16, src_argb1, 32, src_argb1,
48, src4, src5, src6, src7);
vec0 = __lsx_vaddwev_h_bu(src0, src4);
vec1 = __lsx_vaddwev_h_bu(src1, src5);
vec2 = __lsx_vaddwev_h_bu(src2, src6);
vec3 = __lsx_vaddwev_h_bu(src3, src7);
tmp0 = __lsx_vpickev_h(vec1, vec0);
tmp1 = __lsx_vpickev_h(vec3, vec2);
tmp2 = __lsx_vpickod_h(vec1, vec0);
tmp3 = __lsx_vpickod_h(vec3, vec2);
vec0 = __lsx_vaddwod_h_bu(src0, src4);
vec1 = __lsx_vaddwod_h_bu(src1, src5);
vec2 = __lsx_vaddwod_h_bu(src2, src6);
vec3 = __lsx_vaddwod_h_bu(src3, src7);
tmp4 = __lsx_vpickev_h(vec1, vec0);
tmp5 = __lsx_vpickev_h(vec3, vec2);
vec0 = __lsx_vpickev_h(tmp1, tmp0);
vec1 = __lsx_vpickod_h(tmp1, tmp0);
src0 = __lsx_vadd_h(vec0, vec1);
src0 = __lsx_vsrari_h(src0, 2);
vec0 = __lsx_vpickev_h(tmp3, tmp2);
vec1 = __lsx_vpickod_h(tmp3, tmp2);
src1 = __lsx_vadd_h(vec0, vec1);
src1 = __lsx_vsrari_h(src1, 2);
vec0 = __lsx_vpickev_h(tmp5, tmp4);
vec1 = __lsx_vpickod_h(tmp5, tmp4);
src2 = __lsx_vadd_h(vec0, vec1);
src2 = __lsx_vsrari_h(src2, 2);
dst0 = __lsx_vmadd_h(const_0x8000, src0, const_0x70);
dst0 = __lsx_vmsub_h(dst0, src2, const_0x4A);
dst0 = __lsx_vmsub_h(dst0, src1, const_0x26);
dst1 = __lsx_vmadd_h(const_0x8000, src1, const_0x70);
dst1 = __lsx_vmsub_h(dst1, src2, const_0x5E);
dst1 = __lsx_vmsub_h(dst1, src0, const_0x12);
dst0 = __lsx_vsrai_h(dst0, 8);
dst1 = __lsx_vsrai_h(dst1, 8);
dst0 = __lsx_vpickev_b(dst1, dst0);
__lsx_vstelm_d(dst0, dst_u, 0, 0);
__lsx_vstelm_d(dst0, dst_v, 0, 1);
src_argb0 += 64;
src_argb1 += 64;
dst_u += 8;
dst_v += 8;
}
}
void ARGBToRGB24Row_LSX(const uint8_t* src_argb, uint8_t* dst_rgb, int width) {
int x;
int len = (width / 16) - 1;
@ -992,60 +924,6 @@ void ARGBToARGB4444Row_LSX(const uint8_t* src_argb,
}
}
void ARGBToUV444Row_LSX(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int32_t width) {
int x;
int len = width / 16;
__m128i src0, src1, src2, src3;
__m128i tmp0, tmp1, tmp2, tmp3;
__m128i reg0, reg1, reg2, reg3, dst0, dst1;
__m128i const_112 = __lsx_vldi(112);
__m128i const_74 = __lsx_vldi(74);
__m128i const_38 = __lsx_vldi(38);
__m128i const_94 = __lsx_vldi(94);
__m128i const_18 = __lsx_vldi(18);
__m128i const_0x8000 = (__m128i)v2u64{0x8000800080008000, 0x8000800080008000};
for (x = 0; x < len; x++) {
DUP4_ARG2(__lsx_vld, src_argb, 0, src_argb, 16, src_argb, 32, src_argb, 48,
src0, src1, src2, src3);
tmp0 = __lsx_vpickev_h(src1, src0);
tmp1 = __lsx_vpickod_h(src1, src0);
tmp2 = __lsx_vpickev_h(src3, src2);
tmp3 = __lsx_vpickod_h(src3, src2);
reg0 = __lsx_vmaddwev_h_bu(const_0x8000, tmp0, const_112);
reg1 = __lsx_vmaddwev_h_bu(const_0x8000, tmp2, const_112);
reg2 = __lsx_vmulwod_h_bu(tmp0, const_74);
reg3 = __lsx_vmulwod_h_bu(tmp2, const_74);
reg2 = __lsx_vmaddwev_h_bu(reg2, tmp1, const_38);
reg3 = __lsx_vmaddwev_h_bu(reg3, tmp3, const_38);
reg0 = __lsx_vsub_h(reg0, reg2);
reg1 = __lsx_vsub_h(reg1, reg3);
reg0 = __lsx_vsrai_h(reg0, 8);
reg1 = __lsx_vsrai_h(reg1, 8);
dst0 = __lsx_vpickev_b(reg1, reg0);
reg0 = __lsx_vmaddwev_h_bu(const_0x8000, tmp1, const_112);
reg1 = __lsx_vmaddwev_h_bu(const_0x8000, tmp3, const_112);
reg2 = __lsx_vmulwev_h_bu(tmp0, const_18);
reg3 = __lsx_vmulwev_h_bu(tmp2, const_18);
reg2 = __lsx_vmaddwod_h_bu(reg2, tmp0, const_94);
reg3 = __lsx_vmaddwod_h_bu(reg3, tmp2, const_94);
reg0 = __lsx_vsub_h(reg0, reg2);
reg1 = __lsx_vsub_h(reg1, reg3);
reg0 = __lsx_vsrai_h(reg0, 8);
reg1 = __lsx_vsrai_h(reg1, 8);
dst1 = __lsx_vpickev_b(reg1, reg0);
__lsx_vst(dst0, dst_u, 0);
__lsx_vst(dst1, dst_v, 0);
dst_u += 16;
dst_v += 16;
src_argb += 64;
}
}
void ARGBMultiplyRow_LSX(const uint8_t* src_argb0,
const uint8_t* src_argb1,
uint8_t* dst_argb,
@ -2135,82 +2013,6 @@ void RGBAToUVRow_LSX(const uint8_t* src_rgba,
}
}
void ARGBToUVJRow_LSX(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
int x;
const uint8_t* next_argb = src_argb + src_stride_argb;
int len = width / 16;
__m128i src0, src1, src2, src3;
__m128i nex0, nex1, nex2, nex3;
__m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
__m128i reg0, reg1, dst0;
__m128i tmpb, tmpg, tmpr, nexb, nexg, nexr;
__m128i const_128 = __lsx_vldi(0x480);
__m128i const_85 = __lsx_vldi(0x455);
__m128i const_43 = __lsx_vldi(0x42B);
__m128i const_107 = __lsx_vldi(0x46B);
__m128i const_21 = __lsx_vldi(0x415);
__m128i const_8000 = (__m128i)v2u64{0x8000800080008000, 0x8000800080008000};
for (x = 0; x < len; x++) {
DUP4_ARG2(__lsx_vld, src_argb, 0, src_argb, 16, src_argb, 32, src_argb, 48,
src0, src1, src2, src3);
DUP4_ARG2(__lsx_vld, next_argb, 0, next_argb, 16, next_argb, 32, next_argb,
48, nex0, nex1, nex2, nex3);
tmp0 = __lsx_vpickev_b(src1, src0);
tmp1 = __lsx_vpickod_b(src1, src0);
tmp2 = __lsx_vpickev_b(src3, src2);
tmp3 = __lsx_vpickod_b(src3, src2);
tmpr = __lsx_vpickod_b(tmp2, tmp0);
tmpb = __lsx_vpickev_b(tmp2, tmp0);
tmpg = __lsx_vpickev_b(tmp3, tmp1);
tmp0 = __lsx_vpickev_b(nex1, nex0);
tmp1 = __lsx_vpickod_b(nex1, nex0);
tmp2 = __lsx_vpickev_b(nex3, nex2);
tmp3 = __lsx_vpickod_b(nex3, nex2);
nexr = __lsx_vpickod_b(tmp2, tmp0);
nexb = __lsx_vpickev_b(tmp2, tmp0);
nexg = __lsx_vpickev_b(tmp3, tmp1);
tmp0 = __lsx_vaddwev_h_bu(tmpb, nexb);
tmp1 = __lsx_vaddwod_h_bu(tmpb, nexb);
tmp2 = __lsx_vaddwev_h_bu(tmpg, nexg);
tmp3 = __lsx_vaddwod_h_bu(tmpg, nexg);
reg0 = __lsx_vaddwev_h_bu(tmpr, nexr);
reg1 = __lsx_vaddwod_h_bu(tmpr, nexr);
tmp4 = __lsx_vaddwev_w_hu(tmp0, tmp1);
tmp5 = __lsx_vaddwod_w_hu(tmp0, tmp1);
tmp0 = __lsx_vilvl_w(tmp5, tmp4);
tmp1 = __lsx_vilvh_w(tmp5, tmp4);
tmpb = __lsx_vssrarni_hu_w(tmp1, tmp0, 2);
tmp4 = __lsx_vaddwev_w_hu(tmp2, tmp3);
tmp5 = __lsx_vaddwod_w_hu(tmp2, tmp3);
tmp2 = __lsx_vilvl_w(tmp5, tmp4);
tmp3 = __lsx_vilvh_w(tmp5, tmp4);
tmpg = __lsx_vssrarni_hu_w(tmp3, tmp2, 2);
tmp4 = __lsx_vaddwev_w_hu(reg0, reg1);
tmp5 = __lsx_vaddwod_w_hu(reg0, reg1);
tmp0 = __lsx_vilvl_w(tmp5, tmp4);
tmp1 = __lsx_vilvh_w(tmp5, tmp4);
tmpr = __lsx_vssrarni_hu_w(tmp1, tmp0, 2);
reg0 = __lsx_vmadd_h(const_8000, const_128, tmpb);
reg1 = __lsx_vmadd_h(const_8000, const_128, tmpr);
reg0 = __lsx_vmsub_h(reg0, const_85, tmpg);
reg1 = __lsx_vmsub_h(reg1, const_107, tmpg);
reg0 = __lsx_vmsub_h(reg0, const_43, tmpr);
reg1 = __lsx_vmsub_h(reg1, const_21, tmpb);
dst0 = __lsx_vpickod_b(reg1, reg0);
__lsx_vstelm_d(dst0, dst_u, 0, 0);
__lsx_vstelm_d(dst0, dst_v, 0, 1);
dst_u += 8;
dst_v += 8;
src_argb += 64;
next_argb += 64;
}
}
void I444ToARGBRow_LSX(const uint8_t* src_y,
const uint8_t* src_u,
const uint8_t* src_v,
@ -2798,42 +2600,6 @@ void HalfFloatRow_LSX(const uint16_t* src,
}
}
// RGB to JPeg coefficients
// B * 0.1140 coefficient = 29
// G * 0.5870 coefficient = 150
// R * 0.2990 coefficient = 77
// Add 0.5 = 0x80
static const struct ArgbConstants kRgb24JPEGConstants = {{29, 150, 77, 0},
{0},
{0},
{128},
{0}};
static const struct ArgbConstants kRawJPEGConstants = {{77, 150, 29, 0},
{0},
{0},
{128},
{0}};
// RGB to BT.601 coefficients
// B * 0.1016 coefficient = 25
// G * 0.5078 coefficient = 129
// R * 0.2578 coefficient = 66
// Add 16.5 = 0x1080
static const struct ArgbConstants kRgb24I601Constants = {{25, 129, 66, 0},
{0},
{0},
{0x1080},
{0}};
static const struct ArgbConstants kRawI601Constants = {{66, 129, 25, 0},
{0},
{0},
{0x1080},
{0}};
// ARGB expects first 3 values to contain RGB and 4th value is ignored.
void ARGBToYMatrixRow_LSX(const uint8_t* src_argb,
uint8_t* dst_y,
@ -2879,20 +2645,10 @@ void ARGBToYMatrixRow_LSX(const uint8_t* src_argb,
: "memory");
}
void ARGBToYRow_LSX(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_LSX(src_argb, dst_y, width, &kRgb24I601Constants);
}
void ARGBToYJRow_LSX(const uint8_t* src_argb, uint8_t* dst_yj, int width) {
ARGBToYMatrixRow_LSX(src_argb, dst_yj, width, &kRgb24JPEGConstants);
}
static void RGBToYMatrixRow_LSX(const uint8_t* src_rgba,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c) {
void RGBToYMatrixRow_LSX(const uint8_t* src_rgba,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c) {
int8_t shuff[64] = {0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 18,
20, 21, 23, 24, 26, 27, 29, 30, 0, 1, 3, 4, 6,
7, 9, 10, 12, 13, 15, 1, 0, 4, 0, 7, 0, 10,

View File

@ -1897,20 +1897,6 @@ void ARGBToUV444MatrixRow_NEON(const uint8_t* src_argb,
"q10", "q11", "q12");
}
void ARGBToUV444Row_NEON(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_NEON(src_argb, dst_u, dst_v, width, &kArgbI601Constants);
}
void ARGBToUVJ444Row_NEON(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_NEON(src_argb, dst_u, dst_v, width, &kArgbJPEGConstants);
}
// clang-format off
// 16x2 pixels -> 8x1. width is number of argb pixels. e.g. 16.
#define RGBTOUV(QB, QG, QR) \
@ -1996,233 +1982,6 @@ void ARGBToUVMatrixRow_NEON(const uint8_t* src_argb,
"q9", "q11", "q12", "q14", "q15");
}
void ARGBToUVRow_NEON(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
asm volatile (
"add %1, %0, %1 \n" // src_stride + src_argb
"vmov.s16 q10, #112 \n" // UB/VR 0.875 coefficient
"vmov.s16 q11, #74 \n" // UG -0.5781 coefficient
"vmov.s16 q12, #38 \n" // UR -0.2969 coefficient
"vmov.s16 q13, #18 \n" // VB -0.1406 coefficient
"vmov.s16 q14, #94 \n" // VG -0.7344 coefficient
"vmov.u16 q15, #0x8000 \n" // 128.0
"1: \n"
"vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels.
"vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ARGB pixels.
"subs %4, %4, #16 \n" // 16 processed per loop.
"vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
"vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
"vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
"vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more ARGB pixels.
"vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 ARGB pixels.
"vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
"vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
"vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
"vrshr.u16 q0, q0, #2 \n" // average of 4
"vrshr.u16 q1, q1, #2 \n"
"vrshr.u16 q2, q2, #2 \n"
RGBTOUV(q0, q1, q2)
"vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
"vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
"bgt 1b \n"
: "+r"(src_argb), // %0
"+r"(src_stride_argb), // %1
"+r"(dst_u), // %2
"+r"(dst_v), // %3
"+r"(width) // %4
:
: "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
"q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
);
}
void ARGBToUVJRow_NEON(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
asm volatile (
"add %1, %0, %1 \n" // src_stride + src_argb
"vmov.s16 q10, #128 \n" // UB/VR 0.500 coefficient
"vmov.s16 q11, #85 \n" // UG -0.33126 coefficient
"vmov.s16 q12, #43 \n" // UR -0.16874 coefficient
"vmov.s16 q13, #21 \n" // VB -0.08131 coefficient
"vmov.s16 q14, #107 \n" // VG -0.41869 coefficient
"vmov.u16 q15, #0x8000 \n" // 128.0
"1: \n"
"vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB pixels.
"vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ARGB pixels.
"subs %4, %4, #16 \n" // 16 processed per loop.
"vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
"vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
"vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
"vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more ARGB pixels.
"vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 ARGB pixels.
"vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
"vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
"vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
"vrshr.u16 q0, q0, #2 \n" // average of 4
"vrshr.u16 q1, q1, #2 \n"
"vrshr.u16 q2, q2, #2 \n"
RGBTOUV(q0, q1, q2)
"vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
"vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
"bgt 1b \n"
: "+r"(src_argb), // %0
"+r"(src_stride_argb), // %1
"+r"(dst_u), // %2
"+r"(dst_v), // %3
"+r"(width) // %4
:
: "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
"q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
);
}
void ABGRToUVJRow_NEON(const uint8_t* src_abgr,
int src_stride_abgr,
uint8_t* dst_uj,
uint8_t* dst_vj,
int width) {
asm volatile (
"add %1, %0, %1 \n" // src_stride + src_abgr
"vmov.s16 q10, #128 \n" // UB/VR 0.500 coefficient
"vmov.s16 q11, #85 \n" // UG -0.33126 coefficient
"vmov.s16 q12, #43 \n" // UR -0.16874 coefficient
"vmov.s16 q13, #21 \n" // VB -0.08131 coefficient
"vmov.s16 q14, #107 \n" // VG -0.41869 coefficient
"vmov.u16 q15, #0x8000 \n" // 128.0
"1: \n"
"vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ABGR pixels.
"vld4.8 {d1, d3, d5, d7}, [%0]! \n" // load next 8 ABGR pixels.
"subs %4, %4, #16 \n" // 16 processed per loop.
"vpaddl.u8 q0, q0 \n" // R 16 bytes -> 8 shorts.
"vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
"vpaddl.u8 q2, q2 \n" // B 16 bytes -> 8 shorts.
"vld4.8 {d8, d10, d12, d14}, [%1]! \n" // load 8 more ABGR pixels.
"vld4.8 {d9, d11, d13, d15}, [%1]! \n" // load last 8 ABGR pixels.
"vpadal.u8 q0, q4 \n" // R 16 bytes -> 8 shorts.
"vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
"vpadal.u8 q2, q6 \n" // B 16 bytes -> 8 shorts.
"vrshr.u16 q0, q0, #2 \n" // average of 4
"vrshr.u16 q1, q1, #2 \n"
"vrshr.u16 q2, q2, #2 \n"
RGBTOUV(q2, q1, q0)
"vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
"vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
"bgt 1b \n"
: "+r"(src_abgr), // %0
"+r"(src_stride_abgr), // %1
"+r"(dst_uj), // %2
"+r"(dst_vj), // %3
"+r"(width) // %4
:
: "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
"q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
);
}
void RGB24ToUVJRow_NEON(const uint8_t* src_rgb24,
int src_stride_rgb24,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
asm volatile (
"add %1, %0, %1 \n" // src_stride + src_rgb24
"vmov.s16 q10, #128 \n" // UB/VR 0.500 coefficient
"vmov.s16 q11, #85 \n" // UG -0.33126 coefficient
"vmov.s16 q12, #43 \n" // UR -0.16874 coefficient
"vmov.s16 q13, #21 \n" // VB -0.08131 coefficient
"vmov.s16 q14, #107 \n" // VG -0.41869 coefficient
"vmov.u16 q15, #0x8000 \n" // 128.0
"1: \n"
"vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RGB24 pixels.
"vld3.8 {d1, d3, d5}, [%0]! \n" // load next 8 RGB24 pixels.
"subs %4, %4, #16 \n" // 16 processed per loop.
"vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
"vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
"vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
"vld3.8 {d8, d10, d12}, [%1]! \n" // load 8 more RGB24 pixels.
"vld3.8 {d9, d11, d13}, [%1]! \n" // load last 8 RGB24 pixels.
"vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
"vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
"vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
"vrshr.u16 q0, q0, #2 \n" // average of 4
"vrshr.u16 q1, q1, #2 \n"
"vrshr.u16 q2, q2, #2 \n"
RGBTOUV(q0, q1, q2)
"vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
"vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
"bgt 1b \n"
: "+r"(src_rgb24), // %0
"+r"(src_stride_rgb24), // %1
"+r"(dst_u), // %2
"+r"(dst_v), // %3
"+r"(width) // %4
:
: "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
"q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
);
}
void RAWToUVJRow_NEON(const uint8_t* src_raw,
int src_stride_raw,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
asm volatile (
"add %1, %0, %1 \n" // src_stride + src_raw
"vmov.s16 q10, #128 \n" // UB/VR 0.500 coefficient
"vmov.s16 q11, #85 \n" // UG -0.33126 coefficient
"vmov.s16 q12, #43 \n" // UR -0.16874 coefficient
"vmov.s16 q13, #21 \n" // VB -0.08131 coefficient
"vmov.s16 q14, #107 \n" // VG -0.41869 coefficient
"vmov.u16 q15, #0x8000 \n" // 128.0
"1: \n"
"vld3.8 {d0, d2, d4}, [%0]! \n" // load 8 RAW pixels.
"vld3.8 {d1, d3, d5}, [%0]! \n" // load next 8 RAW pixels.
"subs %4, %4, #16 \n" // 16 processed per loop.
"vpaddl.u8 q0, q0 \n" // B 16 bytes -> 8 shorts.
"vpaddl.u8 q1, q1 \n" // G 16 bytes -> 8 shorts.
"vpaddl.u8 q2, q2 \n" // R 16 bytes -> 8 shorts.
"vld3.8 {d8, d10, d12}, [%1]! \n" // load 8 more RAW pixels.
"vld3.8 {d9, d11, d13}, [%1]! \n" // load last 8 RAW pixels.
"vpadal.u8 q0, q4 \n" // B 16 bytes -> 8 shorts.
"vpadal.u8 q1, q5 \n" // G 16 bytes -> 8 shorts.
"vpadal.u8 q2, q6 \n" // R 16 bytes -> 8 shorts.
"vrshr.u16 q0, q0, #2 \n" // average of 4
"vrshr.u16 q1, q1, #2 \n"
"vrshr.u16 q2, q2, #2 \n"
RGBTOUV(q2, q1, q0)
"vst1.8 {d0}, [%2]! \n" // store 8 pixels U.
"vst1.8 {d1}, [%3]! \n" // store 8 pixels V.
"bgt 1b \n"
: "+r"(src_raw), // %0
"+r"(src_stride_raw), // %1
"+r"(dst_u), // %2
"+r"(dst_v), // %3
"+r"(width) // %4
:
: "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
"q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
);
}
void RGB24ToUVRow_NEON(const uint8_t* src_rgb24,
int src_stride_rgb24,
uint8_t* dst_u,
@ -2714,16 +2473,6 @@ void ARGBToYMatrixRow_NEON(const uint8_t* src_argb,
"d24", "d25");
}
void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_NEON(src_argb, dst_y, width, &kArgbI601Constants);
}
void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_yj, int width) {
ARGBToYMatrixRow_NEON(src_argb, dst_yj, width, &kArgbJPEGConstants);
}
void RGBToYMatrixRow_NEON(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,

View File

@ -2793,11 +2793,11 @@ void ARGBToUV444MatrixRow_NEON(const uint8_t* src_argb,
"v27", "v28");
}
static void ARGBToUV444MatrixRow_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c) {
void ARGBToUV444MatrixRow_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width,
const struct ArgbConstants* c) {
asm volatile(
"ldr q16, [%[c], #16] \n" // kRGBToU
"ldr q17, [%[c], #32] \n" // kRGBToV
@ -2838,37 +2838,6 @@ static void ARGBToUV444MatrixRow_NEON_I8MM(const uint8_t* src_argb,
// VB -0.1406 coefficient = -18
// VG -0.7344 coefficient = -94
// VR 0.875 coefficient = 112
void ARGBToUV444Row_NEON(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_NEON(src_argb, dst_u, dst_v, width, &kArgbI601Constants);
}
void ARGBToUV444Row_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_NEON_I8MM(src_argb, dst_u, dst_v, width,
&kArgbI601Constants);
}
void ARGBToUVJ444Row_NEON(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_NEON(src_argb, dst_u, dst_v, width, &kArgbJPEGConstants);
}
void ARGBToUVJ444Row_NEON_I8MM(const uint8_t* src_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUV444MatrixRow_NEON_I8MM(src_argb, dst_u, dst_v, width,
&kArgbJPEGConstants);
}
#define RGBTOUV_SETUP_REG \
"movi v20.8h, #112 \n" /* UB/VR coefficient (0.875) */ \
"movi v21.8h, #74 \n" /* UG coefficient (-0.5781) */ \
@ -2971,116 +2940,6 @@ void ARGBToUVMatrixRow_NEON(const uint8_t* src_argb,
"v28");
}
void ARGBToUVRow_NEON(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_NEON(src_argb, src_stride_argb, dst_u, dst_v, width,
&kArgbI601Constants);
}
void ARGBToUVJRow_NEON(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_NEON(src_argb, src_stride_argb, dst_u, dst_v, width,
&kArgbJPEGConstants);
}
void RGB24ToUVJRow_NEON(const uint8_t* src_rgb24,
int src_stride_rgb24,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
const uint8_t* src_rgb24_1 = src_rgb24 + src_stride_rgb24;
asm volatile (
"movi v20.8h, #128 \n" // UB/VR coeff (0.500)
"movi v21.8h, #85 \n" // UG coeff (-0.33126)
"movi v22.8h, #43 \n" // UR coeff (-0.16874)
"movi v23.8h, #21 \n" // VB coeff (-0.08131)
"movi v24.8h, #107 \n" // VG coeff (-0.41869)
"movi v25.8h, #0x80, lsl #8 \n" // 128.0 (0x8000 in 16-bit)
"1: \n"
"ld3 {v0.16b,v1.16b,v2.16b}, [%0], #48 \n" // load 16 pixels.
"subs %w4, %w4, #16 \n" // 16 processed per loop.
"uaddlp v0.8h, v0.16b \n" // B 16 bytes -> 8 shorts.
"prfm pldl1keep, [%0, 448] \n"
"uaddlp v1.8h, v1.16b \n" // G 16 bytes -> 8 shorts.
"uaddlp v2.8h, v2.16b \n" // R 16 bytes -> 8 shorts.
"ld3 {v4.16b,v5.16b,v6.16b}, [%1], #48 \n" // load next 16
"uadalp v0.8h, v4.16b \n" // B 16 bytes -> 8 shorts.
"prfm pldl1keep, [%1, 448] \n"
"uadalp v1.8h, v5.16b \n" // G 16 bytes -> 8 shorts.
"uadalp v2.8h, v6.16b \n" // R 16 bytes -> 8 shorts.
"urshr v0.8h, v0.8h, #2 \n" // average of 4
"urshr v1.8h, v1.8h, #2 \n"
"urshr v2.8h, v2.8h, #2 \n"
RGBTOUV(v0.8h, v1.8h, v2.8h)
"st1 {v0.8b}, [%2], #8 \n" // store 8 pixels U.
"st1 {v1.8b}, [%3], #8 \n" // store 8 pixels V.
"b.gt 1b \n"
: "+r"(src_rgb24), // %0
"+r"(src_rgb24_1), // %1
"+r"(dst_u), // %2
"+r"(dst_v), // %3
"+r"(width) // %4
:
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
"v20", "v21", "v22", "v23", "v24", "v25"
);
}
void RAWToUVJRow_NEON(const uint8_t* src_raw,
int src_stride_raw,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
const uint8_t* src_raw_1 = src_raw + src_stride_raw;
asm volatile (
"movi v20.8h, #128 \n" // UB/VR coeff (0.500)
"movi v21.8h, #85 \n" // UG coeff (-0.33126)
"movi v22.8h, #43 \n" // UR coeff (-0.16874)
"movi v23.8h, #21 \n" // VB coeff (-0.08131)
"movi v24.8h, #107 \n" // VG coeff (-0.41869)
"movi v25.8h, #0x80, lsl #8 \n" // 128.0 (0x8000 in 16-bit)
"1: \n"
"ld3 {v0.16b,v1.16b,v2.16b}, [%0], #48 \n" // load 16 pixels.
"subs %w4, %w4, #16 \n" // 16 processed per loop.
"uaddlp v0.8h, v0.16b \n" // B 16 bytes -> 8 shorts.
"prfm pldl1keep, [%0, 448] \n"
"uaddlp v1.8h, v1.16b \n" // G 16 bytes -> 8 shorts.
"uaddlp v2.8h, v2.16b \n" // R 16 bytes -> 8 shorts.
"ld3 {v4.16b,v5.16b,v6.16b}, [%1], #48 \n" // load next 16
"uadalp v0.8h, v4.16b \n" // B 16 bytes -> 8 shorts.
"prfm pldl1keep, [%1, 448] \n"
"uadalp v1.8h, v5.16b \n" // G 16 bytes -> 8 shorts.
"uadalp v2.8h, v6.16b \n" // R 16 bytes -> 8 shorts.
"urshr v0.8h, v0.8h, #2 \n" // average of 4
"urshr v1.8h, v1.8h, #2 \n"
"urshr v2.8h, v2.8h, #2 \n"
RGBTOUV(v2.8h, v1.8h, v0.8h)
"st1 {v0.8b}, [%2], #8 \n" // store 8 pixels U.
"st1 {v1.8b}, [%3], #8 \n" // store 8 pixels V.
"b.gt 1b \n"
: "+r"(src_raw), // %0
"+r"(src_raw_1), // %1
"+r"(dst_u), // %2
"+r"(dst_v), // %3
"+r"(width) // %4
:
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
"v20", "v21", "v22", "v23", "v24", "v25"
);
}
void RGB24ToUVRow_NEON(const uint8_t* src_rgb24,
int src_stride_rgb24,
uint8_t* dst_u,
@ -3375,28 +3234,6 @@ void ARGBToUVMatrixRow_NEON_I8MM(const uint8_t* src_argb,
width, c);
}
void ARGBToUVRow_NEON_I8MM(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_NEON_I8MM_Impl(src_argb, src_stride_argb, dst_u, dst_v,
width, &kArgbI601Constants);
}
void ARGBToUVJRow_NEON_I8MM(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_NEON_I8MM_Impl(src_argb, src_stride_argb, dst_u, dst_v,
width, &kArgbJPEGConstants);
}
void RGB565ToYRow_NEON(const uint8_t* src_rgb565, uint8_t* dst_y, int width) {
asm volatile(
"movi v24.16b, #25 \n" // B * 0.1016 coefficient
@ -3564,36 +3401,7 @@ void ARGBToYMatrixRow_NEON_DotProd(const uint8_t* src_argb,
"v17", "v18", "v19");
}
// RGB to JPeg coefficients
void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_NEON(src_argb, dst_y, width, &kArgbI601Constants);
}
void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_yj, int width) {
ARGBToYMatrixRow_NEON(src_argb, dst_yj, width, &kArgbJPEGConstants);
}
void ARGBToYRow_NEON_DotProd(const uint8_t* src_argb,
uint8_t* dst_y,
int width) {
ARGBToYMatrixRow_NEON_DotProd(src_argb, dst_y, width, &kArgbI601Constants);
}
void ARGBToYJRow_NEON_DotProd(const uint8_t* src_argb,
uint8_t* dst_yj,
int width) {
ARGBToYMatrixRow_NEON_DotProd(src_argb, dst_yj, width, &kArgbJPEGConstants);
}
// RGBA expects first value to be A and ignored, then 3 values to contain RGB.
void RGBToYMatrixRow_NEON(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,

View File

@ -1249,41 +1249,6 @@ void MergeUVRow_RVV(const uint8_t* src_u,
}
#endif
// RGB to JPeg coefficients
// B * 0.1140 coefficient = 29
// G * 0.5870 coefficient = 150
// R * 0.2990 coefficient = 77
// Add 0.5 = 0x80
static const struct ArgbConstants kRgb24JPEGConstants = {{29, 150, 77, 0},
{0},
{0},
{128},
{0}};
static const struct ArgbConstants kRawJPEGConstants = {{77, 150, 29, 0},
{0},
{0},
{128},
{0}};
// RGB to BT.601 coefficients
// B * 0.1016 coefficient = 25
// G * 0.5078 coefficient = 129
// R * 0.2578 coefficient = 66
// Add 16.5 = 0x1080
static const struct ArgbConstants kRgb24I601Constants = {{25, 129, 66, 0},
{0},
{0},
{0x1080},
{0}};
static const struct ArgbConstants kRawI601Constants = {{66, 129, 25, 0},
{0},
{0},
{0x1080},
{0}};
// ARGB expects first 3 values to contain RGB and 4th value is ignored
#ifdef HAS_ARGBTOYMATRIXROW_RVV
void ARGBToYMatrixRow_RVV(const uint8_t* src_argb,
@ -1320,25 +1285,11 @@ void ARGBToYMatrixRow_RVV(const uint8_t* src_argb,
}
#endif
#ifdef HAS_ARGBTOYROW_RVV
void ARGBToYRow_RVV(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_RVV(src_argb, dst_y, width, &kRgb24I601Constants);
}
#endif
#ifdef HAS_ARGBTOYJROW_RVV
void ARGBToYJRow_RVV(const uint8_t* src_argb, uint8_t* dst_yj, int width) {
ARGBToYMatrixRow_RVV(src_argb, dst_yj, width, &kRgb24JPEGConstants);
}
#endif
#ifdef HAS_RGBTOYMATRIXROW_RVV
static void RGBToYMatrixRow_RVV(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c) {
void RGBToYMatrixRow_RVV(const uint8_t* src_rgb,
uint8_t* dst_y,
int width,
const struct ArgbConstants* c) {
assert(width != 0);
size_t w = (size_t)width;
vuint8m2_t v_by, v_gy, v_ry; // vectors are to store RGBToY constant
@ -1369,18 +1320,6 @@ static void RGBToYMatrixRow_RVV(const uint8_t* src_rgb,
}
#endif
#ifdef HAS_RGB24TOYJROW_RVV
#endif
#ifdef HAS_RAWTOYJROW_RVV
#endif
#ifdef HAS_RGB24TOYROW_RVV
#endif
#ifdef HAS_RAWTOYROW_RVV
#endif
// Blend src_argb over src_argb1 and store to dst_argb.
// dst_argb may be src_argb or src_argb1.
// src_argb: RGB values have already been pre-multiplied by the a.

View File

@ -1135,26 +1135,6 @@ __arm_locally_streaming void ARGBToUVMatrixRow_SME(
uvconstants);
}
__arm_locally_streaming void ARGBToUVRow_SME(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_SVE_SC(src_argb, src_stride_argb, dst_u, dst_v, width,
kARGBToUVCoefficients);
}
__arm_locally_streaming void ARGBToUVJRow_SME(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_SVE_SC(src_argb, src_stride_argb, dst_u, dst_v, width,
kARGBToUVJCoefficients);
}
#endif // !defined(LIBYUV_DISABLE_SME) && defined(CLANG_HAS_SME) &&
// defined(__aarch64__)

View File

@ -231,26 +231,6 @@ void ARGBToUVMatrixRow_SVE2(const uint8_t* src_argb,
uvconstants);
}
void ARGBToUVRow_SVE2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_SVE_SC(src_argb, src_stride_argb, dst_u, dst_v, width,
kARGBToUVCoefficients);
}
void ARGBToUVJRow_SVE2(const uint8_t* src_argb,
int src_stride_argb,
uint8_t* dst_u,
uint8_t* dst_v,
int width) {
ARGBToUVMatrixRow_SVE_SC(src_argb, src_stride_argb, dst_u, dst_v, width,
kARGBToUVJCoefficients);
}
#define ARGBTORGB565_SVE \
/* Inputs: \
* z0: rrrrrxxxbbbbbxxx \

View File

@ -230,17 +230,6 @@ void ARGBToYMatrixRow_AVX2(const uint8_t* src_argb,
}
}
LIBYUV_TARGET_AVX2
void ARGBToYRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_AVX2(src_argb, dst_y, width, &kArgbI601Constants);
}
LIBYUV_TARGET_AVX2
void ARGBToYJRow_AVX2(const uint8_t* src_argb, uint8_t* dst_y, int width) {
ARGBToYMatrixRow_AVX2(src_argb, dst_y, width, &kArgbJPEGConstants);
}
#ifdef HAS_RAWTOARGBROW_AVX2
LIBYUV_TARGET_AVX2
void RAWToARGBRow_AVX2(const uint8_t* src_raw, uint8_t* dst_argb, int width) {

View File

@ -2736,86 +2736,6 @@ TEST_F(LibYUVConvertTest, TestUYVYToARGB) {
#endif
}
#ifdef ENABLE_ROW_TESTS
TEST_F(LibYUVConvertTest, TestARGBToUVRow) {
SIMD_ALIGNED(uint8_t orig_argb_pixels[256]);
SIMD_ALIGNED(uint8_t dest_u[32]);
SIMD_ALIGNED(uint8_t dest_v[32]);
for (int i = 0; i < 256; ++i) {
orig_argb_pixels[i] = i * 43;
}
orig_argb_pixels[0] = 0xff; // blue
orig_argb_pixels[1] = 0x0;
orig_argb_pixels[2] = 0x0;
orig_argb_pixels[3] = 0xff;
orig_argb_pixels[4] = 0xff; // blue
orig_argb_pixels[5] = 0x0;
orig_argb_pixels[6] = 0x0;
orig_argb_pixels[7] = 0xff;
orig_argb_pixels[8] = 0x0;
orig_argb_pixels[9] = 0xff; // green
orig_argb_pixels[10] = 0x0;
orig_argb_pixels[11] = 0xff;
orig_argb_pixels[12] = 0x0;
orig_argb_pixels[13] = 0xff; // green
orig_argb_pixels[14] = 0x0;
orig_argb_pixels[15] = 0xff;
orig_argb_pixels[16] = 0x0;
orig_argb_pixels[17] = 0x0;
orig_argb_pixels[18] = 0xff; // red
orig_argb_pixels[19] = 0xff;
orig_argb_pixels[20] = 0x0;
orig_argb_pixels[21] = 0x0;
orig_argb_pixels[22] = 0xff; // red
orig_argb_pixels[23] = 0xff;
orig_argb_pixels[24] = 0xff;
orig_argb_pixels[25] = 0xff;
orig_argb_pixels[26] = 0xff; // white
orig_argb_pixels[27] = 0xff;
orig_argb_pixels[28] = 0xff;
orig_argb_pixels[29] = 0xff;
orig_argb_pixels[30] = 0xff; // white
orig_argb_pixels[31] = 0xff;
int benchmark_iterations =
benchmark_width_ * benchmark_height_ * benchmark_iterations_ / 32;
for (int i = 0; i < benchmark_iterations; ++i) {
#if defined(HAS_ARGBTOUVROW_AVX2)
int has_avx2 = TestCpuFlag(kCpuHasAVX2);
if (has_avx2) {
ARGBToUVRow_AVX2(&orig_argb_pixels[0], 0, &dest_u[0], &dest_v[0], 64);
} else {
ARGBToUVRow_C(&orig_argb_pixels[0], 0, &dest_u[0], &dest_v[0], 64);
}
#elif defined(HAS_ARGBTOUVROW_NEON)
ARGBToUVRow_NEON(&orig_argb_pixels[0], 0, &dest_u[0], &dest_v[0], 64);
#else
ARGBToUVRow_C(&orig_argb_pixels[0], 0, &dest_u[0], &dest_v[0], 64);
#endif
}
printf("u: ");
for (int i = 0; i < 32; ++i) {
printf("%3d ", (int)dest_u[i]);
}
printf("\nv: ");
for (int i = 0; i < 32; ++i) {
printf("%3d ", (int)dest_v[i]);
}
printf("\n");
uint32_t checksum_u = HashDjb2(&dest_u[0], sizeof(dest_u), 5381);
ASSERT_EQ(192508756u, checksum_u);
uint32_t checksum_v = HashDjb2(&dest_v[0], sizeof(dest_v), 5381);
ASSERT_EQ(2590663990u, checksum_v);
}
#endif
#ifdef ENABLE_ROW_TESTS
TEST_F(LibYUVConvertTest, TestARGBToUVMatrixRow_Opt) {
const int kMaxWidth = 128;