mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2026-06-15 00:16:08 +08:00
libyuv] Replace hardcoded RGB to YUV functions with Matrix variants
Removes non-matrix implementations for RGB24, RAW, RGB565, ARGB1555, and ARGB4444 conversions. Introduces RGBToYMatrixRow, RGBToUVMatrixRow, and equivalent functions for 16-bit and 24-bit formats. These functions utilize a 2-step conversion internally (to ARGB, then to YUV) inside row_common.cc for C, AVX2, and NEON, allowing the high-level convert.cc logic to execute in a single pass using ArgbConstants. Benchmark on Zen4 Test: libyuv_unittest --gtest_filter=*RGB*ToI420* Was BT.601-only ARGBToI420_Opt (115 ms) ARGB4444ToI420_Opt (190 ms) RGB565ToI420_Opt (194 ms) ARGB1555ToI420_Opt (207 ms) RGB24ToI420_Opt (143 ms) RGBAToI420_Opt (167 ms) 28.07% ARGBToUVMatrixRow_AVX512BW 19.65% ARGBToYMatrixRow_AVX512BW 11.32% RGBAToUVRow_SSSE3 10.24% ARGB1555ToARGBRow_SSE2 8.56% ARGB4444ToARGBRow_SSE2 8.47% RGB565ToARGBRow_SSE2 4.17% RGBAToYRow_AVX512BW 4.04% RGB24ToARGBRow_AVX512BW Now Matrix ARGBToI420_Opt (124 ms) ARGB4444ToI420_Opt (287 ms) RGB565ToI420_Opt (292 ms) ARGB1555ToI420_Opt (324 ms) RGB24ToI420_Opt (236 ms) RGBAToI420_Opt (126 ms) 29.74% ARGBToUVMatrixRow_AVX2 14.58% ARGB1555ToARGBRow_SSE2 12.59% RGB565ToARGBRow_SSE2 11.32% ARGB4444ToARGBRow_SSE2 9.35% ARGBToYMatrixRow_AVX2 8.45% RGB24ToARGBRow_SSSE3 5.56% ARGBToYMatrixRow_AVX512BW 1.37% ARGBToUVMatrixRow_Any_AVX2 0.74% ARGBToYMatrixRow_Any_AVX2 0.49% ARGB4444ToARGBRow_Any_SSE2 0.46% RGB565ToARGBRow_Any_SSE2 0.39% ARGB1555ToARGBRow_Any_SSE2 0.28% RGB24ToARGBRow_Any_SSSE3 0.11% ARGB4444ToYMatrixRow_AVX2 0.09% RGB565ToUVMatrixRow_AVX2 0.09% RGB565ToYMatrixRow_AVX2 0.07% RGBToYMatrixRow_AVX2 0.05% ARGB1555ToUVMatrixRow_AVX2 0.04% ARGB1555ToYMatrixRow_AVX2 0.03% RGBToUVMatrixRow_AVX2 0.02% ARGB4444ToUVMatrixRow_AVX2 Bug: libyuv:508639302 Change-Id: I362c0cfe4c86ee1f3ffb569fa4f784b84148f11a Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/7891045 Commit-Queue: Frank Barchard <fbarchard@google.com> Reviewed-by: richard winterton <rrwinterton@gmail.com>
This commit is contained in:
parent
957f295ea9
commit
3c5fa6ef27
@ -1,6 +1,6 @@
|
||||
Name: libyuv
|
||||
URL: https://chromium.googlesource.com/libyuv/libyuv/
|
||||
Version: 1944
|
||||
Version: 1945
|
||||
Revision: DEPS
|
||||
License: BSD-3-Clause
|
||||
License File: LICENSE
|
||||
|
||||
@ -138,6 +138,10 @@ extern "C" {
|
||||
#define HAS_ARGBMIRRORROW_AVX2
|
||||
#define HAS_RGB24MIRRORROW_AVX2
|
||||
#define HAS_ARGBTOUVMATRIXROW_AVX2
|
||||
#define HAS_RGBTOUVMATRIXROW_AVX2
|
||||
#define HAS_RGB565TOUVMATRIXROW_AVX2
|
||||
#define HAS_ARGB1555TOUVMATRIXROW_AVX2
|
||||
#define HAS_ARGB4444TOUVMATRIXROW_AVX2
|
||||
#define HAS_MERGEUVROW_AVX2
|
||||
#define HAS_MIRRORROW_AVX2
|
||||
#define HAS_MIRRORSPLITUVROW_AVX2
|
||||
@ -287,10 +291,18 @@ extern "C" {
|
||||
#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
|
||||
#define HAS_ARGB1555TOYMATRIXROW_AVX2
|
||||
#define HAS_ARGB4444TOYMATRIXROW_AVX2
|
||||
#define HAS_ARGBUNATTENUATEROW_AVX2
|
||||
#define HAS_CONVERT16TO8ROW_AVX2
|
||||
#define HAS_CONVERT8TO16ROW_AVX2
|
||||
@ -353,6 +365,10 @@ extern "C" {
|
||||
#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_ABGRTOYROW_AVX2
|
||||
#define HAS_ARGBTOYJROW_AVX2
|
||||
@ -426,11 +442,18 @@ extern "C" {
|
||||
#define HAS_ARGBTOUVJROW_NEON
|
||||
#if !defined(__GNUC__) || defined(__clang__)
|
||||
#define HAS_ARGBTOUVMATRIXROW_NEON
|
||||
#define HAS_RGBTOUVMATRIXROW_NEON
|
||||
#define HAS_RGB565TOUVMATRIXROW_NEON
|
||||
#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
|
||||
#endif
|
||||
#define HAS_ARGBTOYROW_NEON
|
||||
#define HAS_AYUVTOVUROW_NEON
|
||||
@ -572,6 +595,7 @@ extern "C" {
|
||||
#define HAS_ARGBTOUVJ444ROW_NEON_I8MM
|
||||
#define HAS_ARGBTOUVJROW_NEON_I8MM
|
||||
#define HAS_ARGBTOUVMATRIXROW_NEON_I8MM
|
||||
#define HAS_RGBTOUVMATRIXROW_NEON
|
||||
#define HAS_ARGBTOUVROW_NEON_I8MM
|
||||
#define HAS_BGRATOUVROW_NEON_I8MM
|
||||
#define HAS_RGBATOUVROW_NEON_I8MM
|
||||
@ -2161,12 +2185,37 @@ void ARGBToUVMatrixRow_C(const uint8_t* src_argb,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c);
|
||||
void RGBToYMatrixRow_C(const uint8_t* src_rgb,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c);
|
||||
void RGBToUVMatrixRow_C(const uint8_t* src_rgb,
|
||||
int src_stride_rgb,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c);
|
||||
void RGB565ToYMatrixRow_C(const uint8_t* src_rgb565,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c);
|
||||
void ARGB1555ToYMatrixRow_C(const uint8_t* src_argb1555, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void ARGB1555ToUVMatrixRow_C(const uint8_t* src_argb1555, int src_stride_argb1555, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void ARGB4444ToYMatrixRow_C(const uint8_t* src_argb4444, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void ARGB4444ToUVMatrixRow_C(const uint8_t* src_argb4444, int src_stride_argb4444, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void RGB565ToUVMatrixRow_C(const uint8_t* src_rgb565,
|
||||
int src_stride_rgb565,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c);
|
||||
void ARGBToUVMatrixRow_SSSE3(const uint8_t* src_argb,
|
||||
int src_stride_argb,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c);
|
||||
void RGBToUVMatrixRow_AVX2(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void ARGBToUVMatrixRow_AVX2(const uint8_t* src_argb,
|
||||
int src_stride_argb,
|
||||
uint8_t* dst_u,
|
||||
@ -2188,6 +2237,20 @@ void ARGBToYMatrixRow_SSSE3(const uint8_t* src_argb,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c);
|
||||
void RGBToYMatrixRow_AVX2(const uint8_t* src_rgb, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void RGB565ToYMatrixRow_AVX2(const uint8_t* src_rgb565, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void ARGB1555ToYMatrixRow_AVX2(const uint8_t* src_argb1555, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void ARGB1555ToUVMatrixRow_AVX2(const uint8_t* src_argb1555, int src_stride_argb1555, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void ARGB4444ToYMatrixRow_AVX2(const uint8_t* src_argb4444, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void ARGB4444ToUVMatrixRow_AVX2(const uint8_t* src_argb4444, int src_stride_argb4444, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void RGB565ToUVMatrixRow_AVX2(const uint8_t* src_rgb565, int src_stride_rgb565, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void RGB565ToYMatrixRow_NEON(const uint8_t* src_rgb565, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void ARGB1555ToYMatrixRow_NEON(const uint8_t* src_argb1555, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void ARGB1555ToUVMatrixRow_NEON(const uint8_t* src_argb1555, int src_stride_argb1555, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void ARGB4444ToYMatrixRow_NEON(const uint8_t* src_argb4444, uint8_t* dst_y, int width, const struct ArgbConstants* c);
|
||||
void ARGB4444ToUVMatrixRow_NEON(const uint8_t* src_argb4444, int src_stride_argb4444, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void RGB565ToUVMatrixRow_NEON(const uint8_t* src_rgb565, int src_stride_rgb565, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
|
||||
void ARGBToYMatrixRow_AVX2(const uint8_t* src_argb,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
@ -2214,6 +2277,7 @@ void RGBToYMatrixRow_NEON(const uint8_t* src_rgb,
|
||||
int width,
|
||||
const struct ArgbConstants* c);
|
||||
|
||||
void RGBToUVMatrixRow_NEON(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, int width, const struct ArgbConstants* c);
|
||||
void ARGBToYMatrixRow_NEON_DotProd(const uint8_t* src_argb,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
|
||||
@ -11,6 +11,6 @@
|
||||
#ifndef INCLUDE_LIBYUV_VERSION_H_
|
||||
#define INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
#define LIBYUV_VERSION 1944
|
||||
#define LIBYUV_VERSION 1945
|
||||
|
||||
#endif // INCLUDE_LIBYUV_VERSION_H_
|
||||
|
||||
1068
source/convert.cc
1068
source/convert.cc
File diff suppressed because it is too large
Load Diff
@ -4588,6 +4588,495 @@ void HalfMergeUVRow_C(const uint8_t* src_u,
|
||||
|
||||
#undef STATIC_CAST
|
||||
|
||||
void RGBToYMatrixRow_C(const uint8_t* src_rgb,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
RGB24ToARGBRow_C(src_rgb, row, twidth);
|
||||
ARGBToYMatrixRow_C(row, dst_y, twidth, c);
|
||||
src_rgb += twidth * 3;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void RGBToUVMatrixRow_C(const uint8_t* src_rgb,
|
||||
int src_stride_rgb,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
RGB24ToARGBRow_C(src_rgb, row, twidth);
|
||||
RGB24ToARGBRow_C(src_rgb + src_stride_rgb, row + MAXTWIDTH * 4, twidth);
|
||||
ARGBToUVMatrixRow_C(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_rgb += twidth * 3;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HAS_ARGBTOYMATRIXROW_AVX2)
|
||||
void RGBToYMatrixRow_AVX2(const uint8_t* src_rgb,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_RGB24TOARGBROW_SSSE3)
|
||||
RGB24ToARGBRow_Any_SSSE3(src_rgb, row, twidth);
|
||||
#else
|
||||
RGB24ToARGBRow_C(src_rgb, row, twidth);
|
||||
#endif
|
||||
ARGBToYMatrixRow_Any_AVX2(row, dst_y, twidth, c);
|
||||
src_rgb += twidth * 3;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
|
||||
void RGBToUVMatrixRow_AVX2(const uint8_t* src_rgb,
|
||||
int src_stride_rgb,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_RGB24TOARGBROW_SSSE3)
|
||||
RGB24ToARGBRow_Any_SSSE3(src_rgb, row, twidth);
|
||||
RGB24ToARGBRow_Any_SSSE3(src_rgb + src_stride_rgb, row + MAXTWIDTH * 4, twidth);
|
||||
#else
|
||||
RGB24ToARGBRow_C(src_rgb, row, twidth);
|
||||
RGB24ToARGBRow_C(src_rgb + src_stride_rgb, row + MAXTWIDTH * 4, twidth);
|
||||
#endif
|
||||
ARGBToUVMatrixRow_Any_AVX2(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_rgb += twidth * 3;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_ARGBTOUVMATRIXROW_NEON) && defined(HAS_RGB24TOARGBROW_NEON)
|
||||
void RGBToUVMatrixRow_NEON(const uint8_t* src_rgb,
|
||||
int src_stride_rgb,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
RGB24ToARGBRow_Any_NEON(src_rgb, row, twidth);
|
||||
RGB24ToARGBRow_Any_NEON(src_rgb + src_stride_rgb, row + MAXTWIDTH * 4, twidth);
|
||||
ARGBToUVMatrixRow_Any_NEON(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_rgb += twidth * 3;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void RGB565ToYMatrixRow_C(const uint8_t* src_rgb565,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
RGB565ToARGBRow_C(src_rgb565, row, twidth);
|
||||
ARGBToYMatrixRow_C(row, dst_y, twidth, c);
|
||||
src_rgb565 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void RGB565ToUVMatrixRow_C(const uint8_t* src_rgb565,
|
||||
int src_stride_rgb565,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
RGB565ToARGBRow_C(src_rgb565, row, twidth);
|
||||
RGB565ToARGBRow_C(src_rgb565 + src_stride_rgb565, row + MAXTWIDTH * 4, twidth);
|
||||
ARGBToUVMatrixRow_C(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_rgb565 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HAS_ARGBTOYMATRIXROW_AVX2)
|
||||
void RGB565ToYMatrixRow_AVX2(const uint8_t* src_rgb565,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_RGB565TOARGBROW_SSE2)
|
||||
RGB565ToARGBRow_Any_SSE2(src_rgb565, row, twidth);
|
||||
#else
|
||||
RGB565ToARGBRow_C(src_rgb565, row, twidth);
|
||||
#endif
|
||||
ARGBToYMatrixRow_Any_AVX2(row, dst_y, twidth, c);
|
||||
src_rgb565 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
|
||||
void RGB565ToUVMatrixRow_AVX2(const uint8_t* src_rgb565,
|
||||
int src_stride_rgb565,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_RGB565TOARGBROW_SSE2)
|
||||
RGB565ToARGBRow_Any_SSE2(src_rgb565, row, twidth);
|
||||
RGB565ToARGBRow_Any_SSE2(src_rgb565 + src_stride_rgb565, row + MAXTWIDTH * 4, twidth);
|
||||
#else
|
||||
RGB565ToARGBRow_C(src_rgb565, row, twidth);
|
||||
RGB565ToARGBRow_C(src_rgb565 + src_stride_rgb565, row + MAXTWIDTH * 4, twidth);
|
||||
#endif
|
||||
ARGBToUVMatrixRow_Any_AVX2(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_rgb565 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_RGB565TOYMATRIXROW_NEON) && defined(HAS_ARGBTOYMATRIXROW_NEON)
|
||||
void RGB565ToYMatrixRow_NEON(const uint8_t* src_rgb565,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_RGB565TOARGBROW_NEON)
|
||||
RGB565ToARGBRow_Any_NEON(src_rgb565, row, twidth);
|
||||
#else
|
||||
RGB565ToARGBRow_C(src_rgb565, row, twidth);
|
||||
#endif
|
||||
ARGBToYMatrixRow_Any_NEON(row, dst_y, twidth, c);
|
||||
src_rgb565 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_RGB565TOUVMATRIXROW_NEON)
|
||||
void RGB565ToUVMatrixRow_NEON(const uint8_t* src_rgb565,
|
||||
int src_stride_rgb565,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_RGB565TOARGBROW_NEON)
|
||||
RGB565ToARGBRow_Any_NEON(src_rgb565, row, twidth);
|
||||
RGB565ToARGBRow_Any_NEON(src_rgb565 + src_stride_rgb565, row + MAXTWIDTH * 4, twidth);
|
||||
#else
|
||||
RGB565ToARGBRow_C(src_rgb565, row, twidth);
|
||||
RGB565ToARGBRow_C(src_rgb565 + src_stride_rgb565, row + MAXTWIDTH * 4, twidth);
|
||||
#endif
|
||||
ARGBToUVMatrixRow_Any_NEON(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_rgb565 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void ARGB1555ToYMatrixRow_C(const uint8_t* src_argb1555,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
ARGB1555ToARGBRow_C(src_argb1555, row, twidth);
|
||||
ARGBToYMatrixRow_C(row, dst_y, twidth, c);
|
||||
src_argb1555 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void ARGB1555ToUVMatrixRow_C(const uint8_t* src_argb1555,
|
||||
int src_stride_argb1555,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
ARGB1555ToARGBRow_C(src_argb1555, row, twidth);
|
||||
ARGB1555ToARGBRow_C(src_argb1555 + src_stride_argb1555, row + MAXTWIDTH * 4, twidth);
|
||||
ARGBToUVMatrixRow_C(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_argb1555 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void ARGB4444ToYMatrixRow_C(const uint8_t* src_argb4444,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
ARGB4444ToARGBRow_C(src_argb4444, row, twidth);
|
||||
ARGBToYMatrixRow_C(row, dst_y, twidth, c);
|
||||
src_argb4444 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void ARGB4444ToUVMatrixRow_C(const uint8_t* src_argb4444,
|
||||
int src_stride_argb4444,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
ARGB4444ToARGBRow_C(src_argb4444, row, twidth);
|
||||
ARGB4444ToARGBRow_C(src_argb4444 + src_stride_argb4444, row + MAXTWIDTH * 4, twidth);
|
||||
ARGBToUVMatrixRow_C(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_argb4444 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(HAS_ARGBTOYMATRIXROW_AVX2)
|
||||
void ARGB1555ToYMatrixRow_AVX2(const uint8_t* src_argb1555,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_ARGB1555TOARGBROW_AVX2)
|
||||
ARGB1555ToARGBRow_Any_AVX2(src_argb1555, row, twidth);
|
||||
#elif defined(HAS_ARGB1555TOARGBROW_SSE2)
|
||||
ARGB1555ToARGBRow_Any_SSE2(src_argb1555, row, twidth);
|
||||
#else
|
||||
ARGB1555ToARGBRow_C(src_argb1555, row, twidth);
|
||||
#endif
|
||||
ARGBToYMatrixRow_Any_AVX2(row, dst_y, twidth, c);
|
||||
src_argb1555 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void ARGB4444ToYMatrixRow_AVX2(const uint8_t* src_argb4444,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_ARGB4444TOARGBROW_AVX2)
|
||||
ARGB4444ToARGBRow_Any_AVX2(src_argb4444, row, twidth);
|
||||
#elif defined(HAS_ARGB4444TOARGBROW_SSE2)
|
||||
ARGB4444ToARGBRow_Any_SSE2(src_argb4444, row, twidth);
|
||||
#else
|
||||
ARGB4444ToARGBRow_C(src_argb4444, row, twidth);
|
||||
#endif
|
||||
ARGBToYMatrixRow_Any_AVX2(row, dst_y, twidth, c);
|
||||
src_argb4444 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_ARGBTOUVMATRIXROW_AVX2)
|
||||
void ARGB1555ToUVMatrixRow_AVX2(const uint8_t* src_argb1555,
|
||||
int src_stride_argb1555,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_ARGB1555TOARGBROW_AVX2)
|
||||
ARGB1555ToARGBRow_Any_AVX2(src_argb1555, row, twidth);
|
||||
ARGB1555ToARGBRow_Any_AVX2(src_argb1555 + src_stride_argb1555, row + MAXTWIDTH * 4, twidth);
|
||||
#elif defined(HAS_ARGB1555TOARGBROW_SSE2)
|
||||
ARGB1555ToARGBRow_Any_SSE2(src_argb1555, row, twidth);
|
||||
ARGB1555ToARGBRow_Any_SSE2(src_argb1555 + src_stride_argb1555, row + MAXTWIDTH * 4, twidth);
|
||||
#else
|
||||
ARGB1555ToARGBRow_C(src_argb1555, row, twidth);
|
||||
ARGB1555ToARGBRow_C(src_argb1555 + src_stride_argb1555, row + MAXTWIDTH * 4, twidth);
|
||||
#endif
|
||||
ARGBToUVMatrixRow_Any_AVX2(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_argb1555 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void ARGB4444ToUVMatrixRow_AVX2(const uint8_t* src_argb4444,
|
||||
int src_stride_argb4444,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_ARGB4444TOARGBROW_AVX2)
|
||||
ARGB4444ToARGBRow_Any_AVX2(src_argb4444, row, twidth);
|
||||
ARGB4444ToARGBRow_Any_AVX2(src_argb4444 + src_stride_argb4444, row + MAXTWIDTH * 4, twidth);
|
||||
#elif defined(HAS_ARGB4444TOARGBROW_SSE2)
|
||||
ARGB4444ToARGBRow_Any_SSE2(src_argb4444, row, twidth);
|
||||
ARGB4444ToARGBRow_Any_SSE2(src_argb4444 + src_stride_argb4444, row + MAXTWIDTH * 4, twidth);
|
||||
#else
|
||||
ARGB4444ToARGBRow_C(src_argb4444, row, twidth);
|
||||
ARGB4444ToARGBRow_C(src_argb4444 + src_stride_argb4444, row + MAXTWIDTH * 4, twidth);
|
||||
#endif
|
||||
ARGBToUVMatrixRow_Any_AVX2(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_argb4444 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_ARGBTOYMATRIXROW_NEON)
|
||||
void ARGB1555ToYMatrixRow_NEON(const uint8_t* src_argb1555,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_ARGB1555TOARGBROW_NEON)
|
||||
ARGB1555ToARGBRow_Any_NEON(src_argb1555, row, twidth);
|
||||
#else
|
||||
ARGB1555ToARGBRow_C(src_argb1555, row, twidth);
|
||||
#endif
|
||||
ARGBToYMatrixRow_Any_NEON(row, dst_y, twidth, c);
|
||||
src_argb1555 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void ARGB4444ToYMatrixRow_NEON(const uint8_t* src_argb4444,
|
||||
uint8_t* dst_y,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_ARGB4444TOARGBROW_NEON)
|
||||
ARGB4444ToARGBRow_Any_NEON(src_argb4444, row, twidth);
|
||||
#else
|
||||
ARGB4444ToARGBRow_C(src_argb4444, row, twidth);
|
||||
#endif
|
||||
ARGBToYMatrixRow_Any_NEON(row, dst_y, twidth, c);
|
||||
src_argb4444 += twidth * 2;
|
||||
dst_y += twidth;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_ARGBTOUVMATRIXROW_NEON)
|
||||
void ARGB1555ToUVMatrixRow_NEON(const uint8_t* src_argb1555,
|
||||
int src_stride_argb1555,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_ARGB1555TOARGBROW_NEON)
|
||||
ARGB1555ToARGBRow_Any_NEON(src_argb1555, row, twidth);
|
||||
ARGB1555ToARGBRow_Any_NEON(src_argb1555 + src_stride_argb1555, row + MAXTWIDTH * 4, twidth);
|
||||
#else
|
||||
ARGB1555ToARGBRow_C(src_argb1555, row, twidth);
|
||||
ARGB1555ToARGBRow_C(src_argb1555 + src_stride_argb1555, row + MAXTWIDTH * 4, twidth);
|
||||
#endif
|
||||
ARGBToUVMatrixRow_Any_NEON(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_argb1555 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
|
||||
void ARGB4444ToUVMatrixRow_NEON(const uint8_t* src_argb4444,
|
||||
int src_stride_argb4444,
|
||||
uint8_t* dst_u,
|
||||
uint8_t* dst_v,
|
||||
int width,
|
||||
const struct ArgbConstants* c) {
|
||||
SIMD_ALIGNED(uint8_t row[MAXTWIDTH * 4 * 2]);
|
||||
while (width > 0) {
|
||||
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||
#if defined(HAS_ARGB4444TOARGBROW_NEON)
|
||||
ARGB4444ToARGBRow_Any_NEON(src_argb4444, row, twidth);
|
||||
ARGB4444ToARGBRow_Any_NEON(src_argb4444 + src_stride_argb4444, row + MAXTWIDTH * 4, twidth);
|
||||
#else
|
||||
ARGB4444ToARGBRow_C(src_argb4444, row, twidth);
|
||||
ARGB4444ToARGBRow_C(src_argb4444 + src_stride_argb4444, row + MAXTWIDTH * 4, twidth);
|
||||
#endif
|
||||
ARGBToUVMatrixRow_Any_NEON(row, MAXTWIDTH * 4, dst_u, dst_v, twidth, c);
|
||||
src_argb4444 += twidth * 2;
|
||||
dst_u += twidth / 2;
|
||||
dst_v += twidth / 2;
|
||||
width -= twidth;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
} // namespace libyuv
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user