diff --git a/README.chromium b/README.chromium index dfcb2665a..3d4e00c57 100644 --- a/README.chromium +++ b/README.chromium @@ -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 diff --git a/include/libyuv/row.h b/include/libyuv/row.h index ee830ccec..2cff19758 100644 --- a/include/libyuv/row.h +++ b/include/libyuv/row.h @@ -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); diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 085829faa..5e34c512c 100644 --- a/include/libyuv/version.h +++ b/include/libyuv/version.h @@ -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_ diff --git a/source/convert.cc b/source/convert.cc index f341c7b85..ad194d2ae 100644 --- a/source/convert.cc +++ b/source/convert.cc @@ -2242,11 +2242,12 @@ int ARGBToI420Alpha(const uint8_t* src_argb, int width, int height) { int y; - void (*ARGBToUVRow)(const uint8_t* src_argb0, int src_stride_argb, - uint8_t* dst_u, uint8_t* dst_v, int width) = - ARGBToUVRow_C; - void (*ARGBToYRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) = - ARGBToYRow_C; + void (*ARGBToYMatrixRow)(const uint8_t* src_argb, uint8_t* dst_y, int width, + const struct ArgbConstants* c) = ARGBToYMatrixRow_C; + void (*ARGBToUVMatrixRow)(const uint8_t* src_argb, int src_stride_argb, + uint8_t* dst_u, uint8_t* dst_v, int width, + const struct ArgbConstants* c) = + ARGBToUVMatrixRow_C; void (*ARGBExtractAlphaRow)(const uint8_t* src_argb, uint8_t* dst_a, int width) = ARGBExtractAlphaRow_C; if (!src_argb || !dst_y || !dst_u || !dst_v || !dst_a || width <= 0 || @@ -2259,120 +2260,124 @@ int ARGBToI420Alpha(const uint8_t* src_argb, src_argb = src_argb + (ptrdiff_t)(height - 1) * src_stride_argb; src_stride_argb = -src_stride_argb; } -#if defined(HAS_ARGBTOYROW_NEON) - if (TestCpuFlag(kCpuHasNEON)) { - ARGBToYRow = ARGBToYRow_Any_NEON; + +#if defined(HAS_ARGBTOYMATRIXROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_SSSE3; if (IS_ALIGNED(width, 16)) { - ARGBToYRow = ARGBToYRow_NEON; + ARGBToYMatrixRow = ARGBToYMatrixRow_SSSE3; } } #endif -#if defined(HAS_ARGBTOYROW_NEON_DOTPROD) +#if defined(HAS_ARGBTOYMATRIXROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW; + } + } +#endif +#if defined(HAS_ARGBTOYMATRIXROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_NEON; + } + } +#endif +#if defined(HAS_ARGBTOYMATRIXROW_NEON_DOTPROD) if (TestCpuFlag(kCpuHasNeonDotProd)) { - ARGBToYRow = ARGBToYRow_Any_NEON_DotProd; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_NEON_DotProd; if (IS_ALIGNED(width, 16)) { - ARGBToYRow = ARGBToYRow_NEON_DotProd; + ARGBToYMatrixRow = ARGBToYMatrixRow_NEON_DotProd; } } #endif -#if defined(HAS_ARGBTOUVROW_NEON) - if (TestCpuFlag(kCpuHasNEON)) { - ARGBToUVRow = ARGBToUVRow_Any_NEON; - if (IS_ALIGNED(width, 16)) { - ARGBToUVRow = ARGBToUVRow_NEON; - } - } -#endif -#if defined(HAS_ARGBTOUVROW_NEON_I8MM) - if (TestCpuFlag(kCpuHasNeonI8MM)) { - ARGBToUVRow = ARGBToUVRow_Any_NEON_I8MM; - if (IS_ALIGNED(width, 16)) { - ARGBToUVRow = ARGBToUVRow_NEON_I8MM; - } - } -#endif -#if defined(HAS_ARGBTOUVROW_SVE2) - if (TestCpuFlag(kCpuHasSVE2)) { - ARGBToUVRow = ARGBToUVRow_Any_SVE2; - if (IS_ALIGNED(width, 2)) { - ARGBToUVRow = ARGBToUVRow_SVE2; - } - } -#endif -#if defined(HAS_ARGBTOUVROW_SME) - if (TestCpuFlag(kCpuHasSME)) { - ARGBToUVRow = ARGBToUVRow_Any_SME; - if (IS_ALIGNED(width, 2)) { - ARGBToUVRow = ARGBToUVRow_SME; - } - } -#endif -#if defined(HAS_ARGBTOYROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToYRow = ARGBToYRow_Any_SSSE3; - if (IS_ALIGNED(width, 16)) { - ARGBToYRow = ARGBToYRow_SSSE3; - } - } -#endif -#if defined(HAS_ARGBTOUVROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToUVRow = ARGBToUVRow_Any_SSSE3; - if (IS_ALIGNED(width, 16)) { - ARGBToUVRow = ARGBToUVRow_SSSE3; - } - } -#endif -#if defined(HAS_ARGBTOYROW_AVX2) - if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToYRow = ARGBToYRow_Any_AVX2; - if (IS_ALIGNED(width, 32)) { - ARGBToYRow = ARGBToYRow_AVX2; - } - } -#endif -#if defined(HAS_ARGBTOYROW_AVX512BW) - if (TestCpuFlag(kCpuHasAVX512BW)) { - ARGBToYRow = ARGBToYRow_Any_AVX512BW; - if (IS_ALIGNED(width, 64)) { - ARGBToYRow = ARGBToYRow_AVX512BW; - } - } -#endif -#if defined(HAS_ARGBTOUVROW_AVX2) - if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToUVRow = ARGBToUVRow_Any_AVX2; - if (IS_ALIGNED(width, 32)) { - ARGBToUVRow = ARGBToUVRow_AVX2; - } - } -#endif -#if defined(HAS_ARGBTOUVROW_AVX512BW) - if (TestCpuFlag(kCpuHasAVX512BW)) { - ARGBToUVRow = ARGBToUVRow_Any_AVX512BW; - if (IS_ALIGNED(width, 64)) { - ARGBToUVRow = ARGBToUVRow_AVX512BW; - } - } -#endif -#if defined(HAS_ARGBTOYROW_LSX) +#if defined(HAS_ARGBTOYMATRIXROW_LSX) if (TestCpuFlag(kCpuHasLSX)) { - ARGBToYRow = ARGBToYRow_Any_LSX; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX; if (IS_ALIGNED(width, 16)) { - ARGBToYRow = ARGBToYRow_LSX; + ARGBToYMatrixRow = ARGBToYMatrixRow_LSX; } } #endif -#if defined(HAS_ARGBTOYROW_LASX) && defined(HAS_ARGBTOUVROW_LASX) +#if defined(HAS_ARGBTOYMATRIXROW_LASX) if (TestCpuFlag(kCpuHasLASX)) { - ARGBToYRow = ARGBToYRow_Any_LASX; - ARGBToUVRow = ARGBToUVRow_Any_LASX; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX; if (IS_ALIGNED(width, 32)) { - ARGBToYRow = ARGBToYRow_LASX; - ARGBToUVRow = ARGBToUVRow_LASX; + ARGBToYMatrixRow = ARGBToYMatrixRow_LASX; } } #endif +#if defined(HAS_ARGBTOYMATRIXROW_RVV) + if (TestCpuFlag(kCpuHasRVV)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_RVV; + } +#endif + +#if defined(HAS_ARGBTOUVMATRIXROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_NEON; + } + } +#endif +#if defined(HAS_ARGBTOUVMATRIXROW_NEON_I8MM) + if (TestCpuFlag(kCpuHasNEON) && TestCpuFlag(kCpuHasNeonI8MM)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_NEON_I8MM; + if (IS_ALIGNED(width, 16)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_NEON_I8MM; + } + } +#endif +#if defined(HAS_ARGBTOUVMATRIXROW_SVE2) + if (TestCpuFlag(kCpuHasSVE2)) { + if (IS_ALIGNED(width, 2)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_SVE2; + } + } +#endif +#if defined(HAS_ARGBTOUVMATRIXROW_SME) + if (TestCpuFlag(kCpuHasSME)) { + if (IS_ALIGNED(width, 2)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_SME; + } + } +#endif +#if defined(HAS_ARGBTOUVMATRIXROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBTOUVMATRIXROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBTOUVMATRIXROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToUVMatrixRow = ARGBToUVMatrixRow_AVX512BW; + } + } +#endif + #if defined(HAS_ARGBEXTRACTALPHAROW_SSE2) if (TestCpuFlag(kCpuHasSSE2)) { ARGBExtractAlphaRow = IS_ALIGNED(width, 8) ? ARGBExtractAlphaRow_SSE2 @@ -2404,9 +2409,11 @@ int ARGBToI420Alpha(const uint8_t* src_argb, #endif for (y = 0; y < height - 1; y += 2) { - ARGBToUVRow(src_argb, src_stride_argb, dst_u, dst_v, width); - ARGBToYRow(src_argb, dst_y, width); - ARGBToYRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width); + ARGBToUVMatrixRow(src_argb, src_stride_argb, dst_u, dst_v, width, + &kArgbI601Constants); + ARGBToYMatrixRow(src_argb, dst_y, width, &kArgbI601Constants); + ARGBToYMatrixRow(src_argb + src_stride_argb, dst_y + dst_stride_y, width, + &kArgbI601Constants); ARGBExtractAlphaRow(src_argb, dst_a, width); ARGBExtractAlphaRow(src_argb + src_stride_argb, dst_a + dst_stride_a, width); @@ -2417,8 +2424,8 @@ int ARGBToI420Alpha(const uint8_t* src_argb, dst_a += dst_stride_a * 2; } if (height & 1) { - ARGBToUVRow(src_argb, 0, dst_u, dst_v, width); - ARGBToYRow(src_argb, dst_y, width); + ARGBToUVMatrixRow(src_argb, 0, dst_u, dst_v, width, &kArgbI601Constants); + ARGBToYMatrixRow(src_argb, dst_y, width, &kArgbI601Constants); ARGBExtractAlphaRow(src_argb, dst_a, width); } return 0; @@ -2628,12 +2635,7 @@ int RGB24ToI420(const uint8_t* src_rgb24, } #undef HAS_RGB24TOYROW -// Enabled if 1 pass is available -#if defined(HAS_RGB24TOYJROW_NEON) || defined(HAS_RGB24TOYJROW_RVV) -#define HAS_RGB24TOYJROW -#endif - -// Convert RGB24 to J420. +/// Convert RGB24 to J420. LIBYUV_API int RGB24ToJ420(const uint8_t* src_rgb24, int src_stride_rgb24, @@ -2646,21 +2648,58 @@ int RGB24ToJ420(const uint8_t* src_rgb24, int width, int height) { int y; -#if defined(HAS_RGB24TOYJROW) - void (*RGB24ToUVJRow)(const uint8_t* src_rgb24, int src_stride_rgb24, - uint8_t* dst_u, uint8_t* dst_v, int width) = - RGB24ToUVJRow_C; - void (*RGB24ToYJRow)(const uint8_t* src_rgb24, uint8_t* dst_y, int width) = - RGB24ToYJRow_C; -#else - void (*RGB24ToARGBRow)(const uint8_t* src_rgb, uint8_t* dst_argb, int width) = - RGB24ToARGBRow_C; - void (*ARGBToUVJRow)(const uint8_t* src_argb0, int src_stride_argb, - uint8_t* dst_u, uint8_t* dst_v, int width) = - ARGBToUVJRow_C; - void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) = - ARGBToYJRow_C; + void (*RGBToUVMatrixRow)(const uint8_t* src_rgb, int src_stride_rgb, + uint8_t* dst_u, uint8_t* dst_v, int width, + const struct ArgbConstants* c) = RGBToUVMatrixRow_C; + void (*RGBToYMatrixRow)(const uint8_t* src_rgb, uint8_t* dst_y, int width, + const struct ArgbConstants* c) = RGBToYMatrixRow_C; + +#if defined(HAS_RGBTOYMATRIXROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + RGBToYMatrixRow = RGBToYMatrixRow_AVX2; + } + } #endif +#if defined(HAS_RGBTOUVMATRIXROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_AVX2; + } + } +#endif +#if defined(HAS_RGBTOUVMATRIXROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_AVX512BW; + } + } +#endif +#if defined(HAS_RGBTOUVMATRIXROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_NEON; + } + } +#endif +#if defined(HAS_RGBTOYMATRIXROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RGBToYMatrixRow = RGBToYMatrixRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + RGBToYMatrixRow = RGBToYMatrixRow_NEON; + } + } +#endif +#if defined(HAS_RGBTOYMATRIXROW_LSX) + if (TestCpuFlag(kCpuHasLSX)) { + RGBToYMatrixRow = RGBToYMatrixRow_LSX; // This uses the NEON/LSX names + } +#endif + if (!src_rgb24 || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0 || height == INT_MIN) { return -1; @@ -2672,187 +2711,23 @@ int RGB24ToJ420(const uint8_t* src_rgb24, src_stride_rgb24 = -src_stride_rgb24; } -#if defined(HAS_RGB24TOYJROW) - -// Neon version does direct RGB24 to YUV. -#if defined(HAS_RGB24TOYJROW_NEON) && defined(HAS_RGB24TOUVJROW_NEON) - if (TestCpuFlag(kCpuHasNEON)) { - RGB24ToUVJRow = RGB24ToUVJRow_Any_NEON; - RGB24ToYJRow = RGB24ToYJRow_Any_NEON; - if (IS_ALIGNED(width, 16)) { - RGB24ToYJRow = RGB24ToYJRow_NEON; - RGB24ToUVJRow = RGB24ToUVJRow_NEON; - } + for (y = 0; y < height - 1; y += 2) { + RGBToUVMatrixRow(src_rgb24, src_stride_rgb24, dst_u, dst_v, width, + &kArgbJPEGConstants); + RGBToYMatrixRow(src_rgb24, dst_y, width, &kArgbJPEGConstants); + RGBToYMatrixRow(src_rgb24 + src_stride_rgb24, dst_y + dst_stride_y, width, + &kArgbJPEGConstants); + src_rgb24 += src_stride_rgb24 * 2; + dst_y += dst_stride_y * 2; + dst_u += dst_stride_u; + dst_v += dst_stride_v; } -#endif -#if defined(HAS_RGB24TOYJROW_LSX) - if (TestCpuFlag(kCpuHasLSX)) { - RGB24ToYJRow = RGB24ToYJRow_Any_LSX; - if (IS_ALIGNED(width, 16)) { - RGB24ToYJRow = RGB24ToYJRow_LSX; - } - } -#endif -#if defined(HAS_RGB24TOYJROW_LASX) - if (TestCpuFlag(kCpuHasLASX)) { - RGB24ToYJRow = RGB24ToYJRow_Any_LASX; - if (IS_ALIGNED(width, 32)) { - RGB24ToYJRow = RGB24ToYJRow_LASX; - } - } -#endif -#if defined(HAS_RGB24TOYJROW_RVV) - if (TestCpuFlag(kCpuHasRVV)) { - RGB24ToYJRow = RGB24ToYJRow_RVV; - } -#endif - -// Other platforms do intermediate conversion from RGB24 to ARGB. -#else // HAS_RGB24TOYJROW - -#if defined(HAS_RGB24TOARGBROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3)) { - RGB24ToARGBRow = RGB24ToARGBRow_Any_SSSE3; - if (IS_ALIGNED(width, 16)) { - RGB24ToARGBRow = RGB24ToARGBRow_SSSE3; - } - } -#endif -#if defined(HAS_RGB24TOARGBROW_AVX2) - if (TestCpuFlag(kCpuHasAVX2)) { - RGB24ToARGBRow = RGB24ToARGBRow_Any_AVX2; - if (IS_ALIGNED(width, 32)) { - RGB24ToARGBRow = RGB24ToARGBRow_AVX2; - } - } -#endif -#if defined(HAS_RGB24TOARGBROW_AVX512BW) - if (TestCpuFlag(kCpuHasAVX512BW)) { - RGB24ToARGBRow = RGB24ToARGBRow_Any_AVX512BW; - if (IS_ALIGNED(width, 64)) { - RGB24ToARGBRow = RGB24ToARGBRow_AVX512BW; - } - } -#endif -#if defined(HAS_RGB24TOARGBROW_NEON) - if (TestCpuFlag(kCpuHasNEON)) { - RGB24ToARGBRow = RGB24ToARGBRow_Any_NEON; - if (IS_ALIGNED(width, 8)) { - RGB24ToARGBRow = RGB24ToARGBRow_NEON; - } - } -#endif -#if defined(HAS_RGB24TOARGBROW_SVE2) - if (TestCpuFlag(kCpuHasSVE2)) { - RGB24ToARGBRow = RGB24ToARGBRow_SVE2; - } -#endif -#if defined(HAS_RGB24TOARGBROW_LSX) - if (TestCpuFlag(kCpuHasLSX)) { - RGB24ToARGBRow = RGB24ToARGBRow_Any_LSX; - if (IS_ALIGNED(width, 16)) { - RGB24ToARGBRow = RGB24ToARGBRow_LSX; - } - } -#endif -#if defined(HAS_RGB24TOARGBROW_LASX) - if (TestCpuFlag(kCpuHasLASX)) { - RGB24ToARGBRow = RGB24ToARGBRow_Any_LASX; - if (IS_ALIGNED(width, 32)) { - RGB24ToARGBRow = RGB24ToARGBRow_LASX; - } - } -#endif -#if defined(HAS_RGB24TOARGBROW_RVV) - if (TestCpuFlag(kCpuHasRVV)) { - RGB24ToARGBRow = RGB24ToARGBRow_RVV; - } -#endif -#if defined(HAS_ARGBTOYJROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToYJRow = ARGBToYJRow_Any_SSSE3; - if (IS_ALIGNED(width, 16)) { - ARGBToYJRow = ARGBToYJRow_SSSE3; - } - } -#endif -#if defined(HAS_ARGBTOYJROW_AVX2) - if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToYJRow = ARGBToYJRow_Any_AVX2; - if (IS_ALIGNED(width, 32)) { - ARGBToYJRow = ARGBToYJRow_AVX2; - } - } -#endif -#if defined(HAS_ARGBTOYROW_AVX512BW) - if (TestCpuFlag(kCpuHasAVX512BW)) { - ARGBToYJRow = ARGBToYJRow_Any_AVX512BW; - if (IS_ALIGNED(width, 64)) { - ARGBToYJRow = ARGBToYJRow_AVX512BW; - } - } -#endif -#if defined(HAS_ARGBTOUVJROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3; - if (IS_ALIGNED(width, 16)) { - ARGBToUVJRow = ARGBToUVJRow_SSSE3; - } - } -#endif -#if defined(HAS_ARGBTOUVJROW_AVX2) - if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToUVJRow = ARGBToUVJRow_Any_AVX2; - if (IS_ALIGNED(width, 32)) { - ARGBToUVJRow = ARGBToUVJRow_AVX2; - } - } -#endif -#endif // HAS_RGB24TOYJROW - - { -#if !defined(HAS_RGB24TOYJROW) - // Allocate 2 rows of ARGB. - const int row_size = (width * 4 + 31) & ~31; - align_buffer_64(row, row_size * 2); - if (!row) - return 1; -#endif - - for (y = 0; y < height - 1; y += 2) { -#if defined(HAS_RGB24TOYJROW) - RGB24ToUVJRow(src_rgb24, src_stride_rgb24, dst_u, dst_v, width); - RGB24ToYJRow(src_rgb24, dst_y, width); - RGB24ToYJRow(src_rgb24 + src_stride_rgb24, dst_y + dst_stride_y, width); -#else - RGB24ToARGBRow(src_rgb24, row, width); - RGB24ToARGBRow(src_rgb24 + src_stride_rgb24, row + row_size, width); - ARGBToUVJRow(row, row_size, dst_u, dst_v, width); - ARGBToYJRow(row, dst_y, width); - ARGBToYJRow(row + row_size, dst_y + dst_stride_y, width); -#endif - src_rgb24 += src_stride_rgb24 * 2; - dst_y += dst_stride_y * 2; - dst_u += dst_stride_u; - dst_v += dst_stride_v; - } - if (height & 1) { -#if defined(HAS_RGB24TOYJROW) - RGB24ToUVJRow(src_rgb24, 0, dst_u, dst_v, width); - RGB24ToYJRow(src_rgb24, dst_y, width); -#else - RGB24ToARGBRow(src_rgb24, row, width); - ARGBToUVJRow(row, 0, dst_u, dst_v, width); - ARGBToYJRow(row, dst_y, width); -#endif - } -#if !defined(HAS_RGB24TOYJROW) - free_aligned_buffer_64(row); -#endif + if (height & 1) { + RGBToYMatrixRow(src_rgb24, dst_y, width, &kArgbJPEGConstants); + RGBToUVMatrixRow(src_rgb24, 0, dst_u, dst_v, width, &kArgbJPEGConstants); } return 0; } -#undef HAS_RGB24TOYJROW // Enabled if 1 pass is available #if (defined(HAS_RAWTOYROW_NEON) || defined(HAS_RAWTOYROW_LSX) || \ @@ -2955,11 +2830,6 @@ int RAWToI420(const uint8_t* src_raw, } #undef HAS_RAWTOYROW -// Enabled if 1 pass is available -#if defined(HAS_RAWTOYJROW_NEON) || defined(HAS_RAWTOYJROW_RVV) -#define HAS_RAWTOYJROW -#endif - // Convert RAW to J420. LIBYUV_API int RAWToJ420(const uint8_t* src_raw, @@ -2973,21 +2843,58 @@ int RAWToJ420(const uint8_t* src_raw, int width, int height) { int y; -#if defined(HAS_RAWTOYJROW) - void (*RAWToUVJRow)(const uint8_t* src_raw, int src_stride_raw, - uint8_t* dst_u, uint8_t* dst_v, int width) = - RAWToUVJRow_C; - void (*RAWToYJRow)(const uint8_t* src_raw, uint8_t* dst_y, int width) = - RAWToYJRow_C; -#else - void (*RAWToARGBRow)(const uint8_t* src_rgb, uint8_t* dst_argb, int width) = - RAWToARGBRow_C; - void (*ARGBToUVJRow)(const uint8_t* src_argb0, int src_stride_argb, - uint8_t* dst_u, uint8_t* dst_v, int width) = - ARGBToUVJRow_C; - void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) = - ARGBToYJRow_C; + void (*RGBToUVMatrixRow)(const uint8_t* src_rgb, int src_stride_rgb, + uint8_t* dst_u, uint8_t* dst_v, int width, + const struct ArgbConstants* c) = RGBToUVMatrixRow_C; + void (*RGBToYMatrixRow)(const uint8_t* src_rgb, uint8_t* dst_y, int width, + const struct ArgbConstants* c) = RGBToYMatrixRow_C; + +#if defined(HAS_RGBTOYMATRIXROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + RGBToYMatrixRow = RGBToYMatrixRow_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + RGBToYMatrixRow = RGBToYMatrixRow_AVX2; + } + } #endif +#if defined(HAS_RGBTOUVMATRIXROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_AVX2; + } + } +#endif +#if defined(HAS_RGBTOUVMATRIXROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_AVX512BW; + } + } +#endif +#if defined(HAS_RGBTOUVMATRIXROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + RGBToUVMatrixRow = RGBToUVMatrixRow_NEON; + } + } +#endif +#if defined(HAS_RGBTOYMATRIXROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RGBToYMatrixRow = RGBToYMatrixRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + RGBToYMatrixRow = RGBToYMatrixRow_NEON; + } + } +#endif +#if defined(HAS_RGBTOYMATRIXROW_LSX) + if (TestCpuFlag(kCpuHasLSX)) { + RGBToYMatrixRow = RGBToYMatrixRow_LSX; // This uses the NEON/LSX names + } +#endif + if (!src_raw || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0 || height == INT_MIN) { return -1; @@ -2999,183 +2906,23 @@ int RAWToJ420(const uint8_t* src_raw, src_stride_raw = -src_stride_raw; } -#if defined(HAS_RAWTOYJROW) - -// Neon version does direct RAW to YUV. -#if defined(HAS_RAWTOYJROW_NEON) && defined(HAS_RAWTOUVJROW_NEON) - if (TestCpuFlag(kCpuHasNEON)) { - RAWToUVJRow = RAWToUVJRow_Any_NEON; - RAWToYJRow = RAWToYJRow_Any_NEON; - if (IS_ALIGNED(width, 16)) { - RAWToYJRow = RAWToYJRow_NEON; - RAWToUVJRow = RAWToUVJRow_NEON; - } + for (y = 0; y < height - 1; y += 2) { + RGBToUVMatrixRow(src_raw, src_stride_raw, dst_u, dst_v, width, + &kAbgrJPEGConstants); + RGBToYMatrixRow(src_raw, dst_y, width, &kAbgrJPEGConstants); + RGBToYMatrixRow(src_raw + src_stride_raw, dst_y + dst_stride_y, width, + &kAbgrJPEGConstants); + src_raw += src_stride_raw * 2; + dst_y += dst_stride_y * 2; + dst_u += dst_stride_u; + dst_v += dst_stride_v; } -#endif -#if defined(HAS_RAWTOYJROW_LSX) && defined(HAS_RAWTOUVJROW_LSX) - if (TestCpuFlag(kCpuHasLSX)) { - RAWToUVJRow = RAWToUVJRow_Any_LSX; - RAWToYJRow = RAWToYJRow_Any_LSX; - if (IS_ALIGNED(width, 16)) { - RAWToYJRow = RAWToYJRow_LSX; - RAWToUVJRow = RAWToUVJRow_LSX; - } - } -#endif -#if defined(HAS_RAWTOYJROW_LASX) && defined(HAS_RAWTOUVJROW_LASX) - if (TestCpuFlag(kCpuHasLASX)) { - RAWToUVJRow = RAWToUVJRow_Any_LASX; - RAWToYJRow = RAWToYJRow_Any_LASX; - if (IS_ALIGNED(width, 32)) { - RAWToYJRow = RAWToYJRow_LASX; - RAWToUVJRow = RAWToUVJRow_LASX; - } - } -#endif -#if defined(HAS_RAWTOYJROW_RVV) - if (TestCpuFlag(kCpuHasRVV)) { - RAWToYJRow = RAWToYJRow_RVV; - } -#endif - -// Other platforms do intermediate conversion from RAW to ARGB. -#else // HAS_RAWTOYJROW - -#if defined(HAS_RAWTOARGBROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3)) { - RAWToARGBRow = RAWToARGBRow_Any_SSSE3; - if (IS_ALIGNED(width, 16)) { - RAWToARGBRow = RAWToARGBRow_SSSE3; - } - } -#endif -#if defined(HAS_RAWTOARGBROW_AVX2) - if (TestCpuFlag(kCpuHasAVX2)) { - RAWToARGBRow = RAWToARGBRow_Any_AVX2; - if (IS_ALIGNED(width, 32)) { - RAWToARGBRow = RAWToARGBRow_AVX2; - } - } -#endif -#if defined(HAS_RAWTOARGBROW_AVX512BW) - if (TestCpuFlag(kCpuHasAVX512BW)) { - RAWToARGBRow = RAWToARGBRow_Any_AVX512BW; - if (IS_ALIGNED(width, 64)) { - RAWToARGBRow = RAWToARGBRow_AVX512BW; - } - } -#endif -#if defined(HAS_RAWTOARGBROW_NEON) - if (TestCpuFlag(kCpuHasNEON)) { - RAWToARGBRow = RAWToARGBRow_Any_NEON; - if (IS_ALIGNED(width, 8)) { - RAWToARGBRow = RAWToARGBRow_NEON; - } - } -#endif -#if defined(HAS_RAWTOARGBROW_SVE2) - if (TestCpuFlag(kCpuHasSVE2)) { - RAWToARGBRow = RAWToARGBRow_SVE2; - } -#endif -#if defined(HAS_RAWTOARGBROW_LSX) - if (TestCpuFlag(kCpuHasLSX)) { - RAWToARGBRow = RAWToARGBRow_Any_LSX; - if (IS_ALIGNED(width, 16)) { - RAWToARGBRow = RAWToARGBRow_LSX; - } - } -#endif -#if defined(HAS_RAWTOARGBROW_LASX) - if (TestCpuFlag(kCpuHasLASX)) { - RAWToARGBRow = RAWToARGBRow_Any_LASX; - if (IS_ALIGNED(width, 32)) { - RAWToARGBRow = RAWToARGBRow_LASX; - } - } -#endif -#if defined(HAS_RAWTOARGBROW_RVV) - if (TestCpuFlag(kCpuHasRVV)) { - RAWToARGBRow = RAWToARGBRow_RVV; - } -#endif -#if defined(HAS_ARGBTOYJROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToYJRow = ARGBToYJRow_Any_SSSE3; - if (IS_ALIGNED(width, 16)) { - ARGBToYJRow = ARGBToYJRow_SSSE3; - } - } -#endif -#if defined(HAS_ARGBTOYJROW_AVX2) - if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToYJRow = ARGBToYJRow_Any_AVX2; - if (IS_ALIGNED(width, 32)) { - ARGBToYJRow = ARGBToYJRow_AVX2; - } - } -#endif -#if defined(HAS_ARGBTOUVJROW_SSSE3) - if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3; - if (IS_ALIGNED(width, 16)) { - ARGBToUVJRow = ARGBToUVJRow_SSSE3; - } - } -#endif -#if defined(HAS_ARGBTOUVJROW_AVX2) - if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToUVJRow = ARGBToUVJRow_Any_AVX2; - if (IS_ALIGNED(width, 32)) { - ARGBToUVJRow = ARGBToUVJRow_AVX2; - } - } -#endif -#endif // HAS_RAWTOYJROW - - { -#if !defined(HAS_RAWTOYJROW) - // Allocate 2 rows of ARGB. - const int row_size = (width * 4 + 31) & ~31; - align_buffer_64(row, row_size * 2); - if (!row) - return 1; -#endif - - for (y = 0; y < height - 1; y += 2) { -#if defined(HAS_RAWTOYJROW) - RAWToUVJRow(src_raw, src_stride_raw, dst_u, dst_v, width); - RAWToYJRow(src_raw, dst_y, width); - RAWToYJRow(src_raw + src_stride_raw, dst_y + dst_stride_y, width); -#else - RAWToARGBRow(src_raw, row, width); - RAWToARGBRow(src_raw + src_stride_raw, row + row_size, width); - ARGBToUVJRow(row, row_size, dst_u, dst_v, width); - ARGBToYJRow(row, dst_y, width); - ARGBToYJRow(row + row_size, dst_y + dst_stride_y, width); -#endif - src_raw += src_stride_raw * 2; - dst_y += dst_stride_y * 2; - dst_u += dst_stride_u; - dst_v += dst_stride_v; - } - if (height & 1) { -#if defined(HAS_RAWTOYJROW) - RAWToUVJRow(src_raw, 0, dst_u, dst_v, width); - RAWToYJRow(src_raw, dst_y, width); -#else - RAWToARGBRow(src_raw, row, width); - ARGBToUVJRow(row, 0, dst_u, dst_v, width); - ARGBToYJRow(row, dst_y, width); -#endif - } -#if !defined(HAS_RAWTOYJROW) - free_aligned_buffer_64(row); -#endif + if (height & 1) { + RGBToYMatrixRow(src_raw, dst_y, width, &kAbgrJPEGConstants); + RGBToUVMatrixRow(src_raw, 0, dst_u, dst_v, width, &kAbgrJPEGConstants); } return 0; } -#undef HAS_RAWTOYJROW // RAW big endian (rgb in memory) to I444 // 2 step conversion of RAWToARGB then ARGBToY and ARGBToUV444 @@ -3193,10 +2940,12 @@ int RAWToI444(const uint8_t* src_raw, int y; void (*RAWToARGBRow)(const uint8_t* src_rgb, uint8_t* dst_argb, int width) = RAWToARGBRow_C; - void (*ARGBToYRow)(const uint8_t* src_raw, uint8_t* dst_y, int width) = - ARGBToYRow_C; - void (*ARGBToUV444Row)(const uint8_t* src_raw, uint8_t* dst_u, uint8_t* dst_v, - int width) = ARGBToUV444Row_C; + void (*ARGBToYMatrixRow)(const uint8_t* src_raw, uint8_t* dst_y, int width, + const struct ArgbConstants* c) = ARGBToYMatrixRow_C; + void (*ARGBToUV444MatrixRow)(const uint8_t* src_raw, uint8_t* dst_u, + uint8_t* dst_v, int width, + const struct ArgbConstants* c) = + ARGBToUV444MatrixRow_C; if (!src_raw || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0 || height == INT_MIN) { return -1; @@ -3207,122 +2956,106 @@ int RAWToI444(const uint8_t* src_raw, src_stride_raw = -src_stride_raw; } // TODO: add row coalesce when main loop handles large width in blocks - // TODO: implement UV444 or trim the ifdef below -#if defined(HAS_ARGBTOUV444ROW_SSSE3) +#if defined(HAS_ARGBTOUV444MATRIXROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToUV444Row = ARGBToUV444Row_Any_SSSE3; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_SSSE3; if (IS_ALIGNED(width, 16)) { - ARGBToUV444Row = ARGBToUV444Row_SSSE3; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_SSSE3; } } #endif -#if defined(HAS_ARGBTOUV444ROW_AVX2) +#if defined(HAS_ARGBTOUV444MATRIXROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToUV444Row = ARGBToUV444Row_Any_AVX2; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX2; if (IS_ALIGNED(width, 32)) { - ARGBToUV444Row = ARGBToUV444Row_AVX2; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX2; } } #endif -#if defined(HAS_ARGBTOUV444ROW_AVX512BW) +#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512BW) if (TestCpuFlag(kCpuHasAVX512BW)) { - ARGBToUV444Row = ARGBToUV444Row_Any_AVX512BW; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512BW; if (IS_ALIGNED(width, 64)) { - ARGBToUV444Row = ARGBToUV444Row_AVX512BW; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512BW; } } #endif -#if defined(HAS_ARGBTOUV444ROW_NEON) +#if defined(HAS_ARGBTOUV444MATRIXROW_NEON) if (TestCpuFlag(kCpuHasNEON)) { - ARGBToUV444Row = ARGBToUV444Row_Any_NEON; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_NEON; if (IS_ALIGNED(width, 8)) { - ARGBToUV444Row = ARGBToUV444Row_NEON; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_NEON; } } #endif -#if defined(HAS_ARGBTOUV444ROW_NEON_I8MM) +#if defined(HAS_ARGBTOUV444MATRIXROW_NEON_I8MM) if (TestCpuFlag(kCpuHasNeonI8MM)) { - ARGBToUV444Row = ARGBToUV444Row_Any_NEON_I8MM; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_NEON_I8MM; if (IS_ALIGNED(width, 8)) { - ARGBToUV444Row = ARGBToUV444Row_NEON_I8MM; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_NEON_I8MM; } } #endif -#if defined(HAS_ARGBTOUV444ROW_LSX) - if (TestCpuFlag(kCpuHasLSX)) { - ARGBToUV444Row = ARGBToUV444Row_Any_LSX; - if (IS_ALIGNED(width, 16)) { - ARGBToUV444Row = ARGBToUV444Row_LSX; - } - } -#endif -#if defined(HAS_ARGBTOUV444ROW_LASX) - if (TestCpuFlag(kCpuHasLASX)) { - ARGBToUV444Row = ARGBToUV444Row_Any_LASX; - if (IS_ALIGNED(width, 32)) { - ARGBToUV444Row = ARGBToUV444Row_LASX; - } - } -#endif -#if defined(HAS_ARGBTOYROW_SSSE3) + +#if defined(HAS_ARGBTOYMATRIXROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToYRow = ARGBToYRow_Any_SSSE3; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_SSSE3; if (IS_ALIGNED(width, 16)) { - ARGBToYRow = ARGBToYRow_SSSE3; + ARGBToYMatrixRow = ARGBToYMatrixRow_SSSE3; } } #endif -#if defined(HAS_ARGBTOYROW_AVX2) +#if defined(HAS_ARGBTOYMATRIXROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToYRow = ARGBToYRow_Any_AVX2; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX2; if (IS_ALIGNED(width, 32)) { - ARGBToYRow = ARGBToYRow_AVX2; + ARGBToYMatrixRow = ARGBToYMatrixRow_AVX2; } } #endif -#if defined(HAS_ARGBTOYROW_AVX512BW) +#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW) if (TestCpuFlag(kCpuHasAVX512BW)) { - ARGBToYRow = ARGBToYRow_Any_AVX512BW; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW; if (IS_ALIGNED(width, 64)) { - ARGBToYRow = ARGBToYRow_AVX512BW; + ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW; } } #endif -#if defined(HAS_ARGBTOYROW_NEON) +#if defined(HAS_ARGBTOYMATRIXROW_NEON) if (TestCpuFlag(kCpuHasNEON)) { - ARGBToYRow = ARGBToYRow_Any_NEON; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_NEON; if (IS_ALIGNED(width, 16)) { - ARGBToYRow = ARGBToYRow_NEON; + ARGBToYMatrixRow = ARGBToYMatrixRow_NEON; } } #endif -#if defined(HAS_ARGBTOYROW_NEON_DOTPROD) +#if defined(HAS_ARGBTOYMATRIXROW_NEON_DOTPROD) if (TestCpuFlag(kCpuHasNeonDotProd)) { - ARGBToYRow = ARGBToYRow_Any_NEON_DotProd; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_NEON_DotProd; if (IS_ALIGNED(width, 16)) { - ARGBToYRow = ARGBToYRow_NEON_DotProd; + ARGBToYMatrixRow = ARGBToYMatrixRow_NEON_DotProd; } } #endif -#if defined(HAS_ARGBTOYROW_LSX) +#if defined(HAS_ARGBTOYMATRIXROW_LSX) if (TestCpuFlag(kCpuHasLSX)) { - ARGBToYRow = ARGBToYRow_Any_LSX; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX; if (IS_ALIGNED(width, 16)) { - ARGBToYRow = ARGBToYRow_LSX; + ARGBToYMatrixRow = ARGBToYMatrixRow_LSX; } } #endif -#if defined(HAS_ARGBTOYROW_LASX) +#if defined(HAS_ARGBTOYMATRIXROW_LASX) if (TestCpuFlag(kCpuHasLASX)) { - ARGBToYRow = ARGBToYRow_Any_LASX; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX; if (IS_ALIGNED(width, 32)) { - ARGBToYRow = ARGBToYRow_LASX; + ARGBToYMatrixRow = ARGBToYMatrixRow_LASX; } } #endif -#if defined(HAS_ARGBTOYROW_RVV) +#if defined(HAS_ARGBTOYMATRIXROW_RVV) if (TestCpuFlag(kCpuHasRVV)) { - ARGBToYRow = ARGBToYRow_RVV; + ARGBToYMatrixRow = ARGBToYMatrixRow_RVV; } #endif @@ -3394,8 +3127,8 @@ int RAWToI444(const uint8_t* src_raw, for (y = 0; y < height; ++y) { RAWToARGBRow(src_raw, row, width); - ARGBToUV444Row(row, dst_u, dst_v, width); - ARGBToYRow(row, dst_y, width); + ARGBToUV444MatrixRow(row, dst_u, dst_v, width, &kArgbI601Constants); + ARGBToYMatrixRow(row, dst_y, width, &kArgbI601Constants); src_raw += src_stride_raw; dst_y += dst_stride_y; dst_u += dst_stride_u; @@ -3422,10 +3155,12 @@ int RAWToJ444(const uint8_t* src_raw, int y; void (*RAWToARGBRow)(const uint8_t* src_rgb, uint8_t* dst_argb, int width) = RAWToARGBRow_C; - void (*ARGBToYJRow)(const uint8_t* src_raw, uint8_t* dst_y, int width) = - ARGBToYJRow_C; - void (*ARGBToUVJ444Row)(const uint8_t* src_raw, uint8_t* dst_u, - uint8_t* dst_v, int width) = ARGBToUVJ444Row_C; + void (*ARGBToYMatrixRow)(const uint8_t* src_raw, uint8_t* dst_y, int width, + const struct ArgbConstants* c) = ARGBToYMatrixRow_C; + void (*ARGBToUV444MatrixRow)(const uint8_t* src_raw, uint8_t* dst_u, + uint8_t* dst_v, int width, + const struct ArgbConstants* c) = + ARGBToUV444MatrixRow_C; if (!src_raw || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0 || height == INT_MIN) { return -1; @@ -3436,113 +3171,98 @@ int RAWToJ444(const uint8_t* src_raw, src_stride_raw = -src_stride_raw; } // TODO: add row coalesce when main loop handles large width in blocks -#if defined(HAS_ARGBTOUVJ444ROW_SSSE3) +#if defined(HAS_ARGBTOUV444MATRIXROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_Any_SSSE3; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_SSSE3; if (IS_ALIGNED(width, 16)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_SSSE3; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_SSSE3; } } #endif -#if defined(HAS_ARGBTOUVJ444ROW_AVX2) +#if defined(HAS_ARGBTOUV444MATRIXROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_Any_AVX2; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX2; if (IS_ALIGNED(width, 32)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_AVX2; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX2; } } #endif -#if defined(HAS_ARGBTOUVJ444ROW_AVX512BW) +#if defined(HAS_ARGBTOUV444MATRIXROW_AVX512BW) if (TestCpuFlag(kCpuHasAVX512BW)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_Any_AVX512BW; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_AVX512BW; if (IS_ALIGNED(width, 64)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_AVX512BW; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_AVX512BW; } } #endif -#if defined(HAS_ARGBTOUVJ444ROW_NEON) +#if defined(HAS_ARGBTOUV444MATRIXROW_NEON) if (TestCpuFlag(kCpuHasNEON)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_Any_NEON; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_Any_NEON; if (IS_ALIGNED(width, 8)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_NEON; + ARGBToUV444MatrixRow = ARGBToUV444MatrixRow_NEON; } } #endif -#if defined(HAS_ARGBTOUVJ444ROW_NEON_I8MM) - if (TestCpuFlag(kCpuHasNeonI8MM)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_Any_NEON_I8MM; - if (IS_ALIGNED(width, 8)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_NEON_I8MM; - } - } -#endif -#if defined(HAS_ARGBTOUVJ444ROW_LSX) - if (TestCpuFlag(kCpuHasLSX)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_Any_LSX; - if (IS_ALIGNED(width, 16)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_LSX; - } - } -#endif -#if defined(HAS_ARGBTOUVJ444ROW_LASX) - if (TestCpuFlag(kCpuHasLASX)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_Any_LASX; - if (IS_ALIGNED(width, 32)) { - ARGBToUVJ444Row = ARGBToUVJ444Row_LASX; - } - } -#endif -#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_ARGBTOYJROW_NEON) +#if defined(HAS_ARGBTOYMATRIXROW_AVX512BW) + if (TestCpuFlag(kCpuHasAVX512BW)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_AVX512BW; + if (IS_ALIGNED(width, 64)) { + ARGBToYMatrixRow = ARGBToYMatrixRow_AVX512BW; + } + } +#endif +#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_NEON_DOTPROD) +#if defined(HAS_ARGBTOYMATRIXROW_NEON_DOTPROD) if (TestCpuFlag(kCpuHasNeonDotProd)) { - ARGBToYJRow = ARGBToYJRow_Any_NEON_DotProd; + ARGBToYMatrixRow = ARGBToYMatrixRow_Any_NEON_DotProd; if (IS_ALIGNED(width, 16)) { - ARGBToYJRow = ARGBToYJRow_NEON_DotProd; + ARGBToYMatrixRow = ARGBToYMatrixRow_NEON_DotProd; } } #endif -#if defined(HAS_ARGBTOYJROW_LSX) +#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 @@ -3614,8 +3334,8 @@ int RAWToJ444(const uint8_t* src_raw, for (y = 0; y < height; ++y) { RAWToARGBRow(src_raw, row, width); - ARGBToUVJ444Row(row, dst_u, dst_v, width); - ARGBToYJRow(row, dst_y, width); + ARGBToUV444MatrixRow(row, dst_u, dst_v, width, &kArgbJPEGConstants); + ARGBToYMatrixRow(row, dst_y, width, &kArgbJPEGConstants); src_raw += src_stride_raw; dst_y += dst_stride_y; dst_u += dst_stride_u; diff --git a/source/convert_from_argb.cc b/source/convert_from_argb.cc index 4bfcb05a2..187d5a9c7 100644 --- a/source/convert_from_argb.cc +++ b/source/convert_from_argb.cc @@ -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) { diff --git a/source/planar_functions.cc b/source/planar_functions.cc index 3481d643d..eeba46b12 100644 --- a/source/planar_functions.cc +++ b/source/planar_functions.cc @@ -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]; diff --git a/source/row_any.cc b/source/row_any.cc index 8b30f8f21..ad8485848 100644 --- a/source/row_any.cc +++ b/source/row_any.cc @@ -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 diff --git a/source/row_common.cc b/source/row_common.cc index 04c4b557a..3f1ff4456 100644 --- a/source/row_common.cc +++ b/source/row_common.cc @@ -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) { diff --git a/source/row_gcc.cc b/source/row_gcc.cc index 725f7ce25..87e1e18b8 100644 --- a/source/row_gcc.cc +++ b/source/row_gcc.cc @@ -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) diff --git a/source/row_lasx.cc b/source/row_lasx.cc index c1c57812e..b743f9dd4 100644 --- a/source/row_lasx.cc +++ b/source/row_lasx.cc @@ -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 diff --git a/source/row_lsx.cc b/source/row_lsx.cc index f7034476c..ae747513c 100644 --- a/source/row_lsx.cc +++ b/source/row_lsx.cc @@ -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, diff --git a/source/row_neon.cc b/source/row_neon.cc index 48cac2ea7..dcdf68fef 100644 --- a/source/row_neon.cc +++ b/source/row_neon.cc @@ -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, diff --git a/source/row_neon64.cc b/source/row_neon64.cc index 8f9231222..ced4193ba 100644 --- a/source/row_neon64.cc +++ b/source/row_neon64.cc @@ -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, diff --git a/source/row_rvv.cc b/source/row_rvv.cc index 5df43f4ac..9e1ed7687 100644 --- a/source/row_rvv.cc +++ b/source/row_rvv.cc @@ -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. diff --git a/source/row_sme.cc b/source/row_sme.cc index 8ad26724b..553936cf8 100644 --- a/source/row_sme.cc +++ b/source/row_sme.cc @@ -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__) diff --git a/source/row_sve.cc b/source/row_sve.cc index 04c2ece0e..f5b5d32ba 100644 --- a/source/row_sve.cc +++ b/source/row_sve.cc @@ -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 \ diff --git a/source/row_win.cc b/source/row_win.cc index 27fe5ddf1..a71345107 100644 --- a/source/row_win.cc +++ b/source/row_win.cc @@ -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) { diff --git a/unit_test/convert_argb_test.cc b/unit_test/convert_argb_test.cc index 20a89dcfd..8411039d1 100644 --- a/unit_test/convert_argb_test.cc +++ b/unit_test/convert_argb_test.cc @@ -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;