mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2026-02-11 04:39:53 +08:00
YUY2 and UYVY to ARGB AVX2 versions via wrappers.
BUG=403 TESTED=UNTESTED R=harryjin@google.com Review URL: https://webrtc-codereview.appspot.com/34339004 git-svn-id: http://libyuv.googlecode.com/svn/trunk@1291 16f28f9a-4ce2-e073-06de-1de4eb20be90
This commit is contained in:
parent
2ee7a5d8e2
commit
239962fa00
@ -1,6 +1,6 @@
|
|||||||
Name: libyuv
|
Name: libyuv
|
||||||
URL: http://code.google.com/p/libyuv/
|
URL: http://code.google.com/p/libyuv/
|
||||||
Version: 1286
|
Version: 1291
|
||||||
License: BSD
|
License: BSD
|
||||||
License File: LICENSE
|
License File: LICENSE
|
||||||
|
|
||||||
|
|||||||
@ -181,6 +181,15 @@ extern "C" {
|
|||||||
#define VISUALC_HAS_AVX2 1
|
#define VISUALC_HAS_AVX2 1
|
||||||
#endif // VisualStudio >= 2012
|
#endif // VisualStudio >= 2012
|
||||||
|
|
||||||
|
// The following are available require VS2012. Port to GCC.
|
||||||
|
#if !defined(LIBYUV_DISABLE_X86) && defined(VISUALC_HAS_AVX2)
|
||||||
|
// TODO(fbarchard): fix AVX2 versions of YUV conversion. bug=393
|
||||||
|
#define HAS_I422TOABGRROW_AVX2
|
||||||
|
#define HAS_I422TOARGBROW_AVX2
|
||||||
|
#define HAS_I422TOBGRAROW_AVX2
|
||||||
|
#define HAS_I422TORGBAROW_AVX2
|
||||||
|
#endif
|
||||||
|
|
||||||
// The following are available on all x86 platforms, but
|
// The following are available on all x86 platforms, but
|
||||||
// require VS2012, clang 3.4 or gcc 4.7.
|
// require VS2012, clang 3.4 or gcc 4.7.
|
||||||
// The code supports NaCL but requires a new compiler and validator.
|
// The code supports NaCL but requires a new compiler and validator.
|
||||||
@ -207,6 +216,12 @@ extern "C" {
|
|||||||
#define HAS_YUY2TOUVROW_AVX2
|
#define HAS_YUY2TOUVROW_AVX2
|
||||||
#define HAS_YUY2TOYROW_AVX2
|
#define HAS_YUY2TOYROW_AVX2
|
||||||
|
|
||||||
|
// The following require HAS_I422TOARGBROW_AVX2
|
||||||
|
#if defined(HAS_I422TOARGBROW_AVX2)
|
||||||
|
#define HAS_YUY2TOARGBROW_AVX2
|
||||||
|
#define HAS_UYVYTOARGBROW_AVX2
|
||||||
|
#endif
|
||||||
|
|
||||||
// Effects:
|
// Effects:
|
||||||
#define HAS_ARGBADDROW_AVX2
|
#define HAS_ARGBADDROW_AVX2
|
||||||
#define HAS_ARGBATTENUATEROW_AVX2
|
#define HAS_ARGBATTENUATEROW_AVX2
|
||||||
@ -215,14 +230,6 @@ extern "C" {
|
|||||||
#define HAS_ARGBUNATTENUATEROW_AVX2
|
#define HAS_ARGBUNATTENUATEROW_AVX2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// The following are available require VS2012. Port to GCC.
|
|
||||||
#if !defined(LIBYUV_DISABLE_X86) && defined(VISUALC_HAS_AVX2)
|
|
||||||
// TODO(fbarchard): fix AVX2 versions of YUV conversion. bug=393
|
|
||||||
#define HAS_I422TOABGRROW_AVX2
|
|
||||||
#define HAS_I422TOARGBROW_AVX2
|
|
||||||
#define HAS_I422TOBGRAROW_AVX2
|
|
||||||
#define HAS_I422TORGBAROW_AVX2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// The following are Yasm x86 only:
|
// The following are Yasm x86 only:
|
||||||
// TODO(fbarchard): Port AVX2 to inline.
|
// TODO(fbarchard): Port AVX2 to inline.
|
||||||
@ -358,6 +365,7 @@ extern "C" {
|
|||||||
|
|
||||||
#if defined(_MSC_VER) && !defined(__CLR_VER)
|
#if defined(_MSC_VER) && !defined(__CLR_VER)
|
||||||
#define SIMD_ALIGNED(var) __declspec(align(16)) var
|
#define SIMD_ALIGNED(var) __declspec(align(16)) var
|
||||||
|
#define SIMD_ALIGNED32(var) __declspec(align(64)) var
|
||||||
typedef __declspec(align(16)) int16 vec16[8];
|
typedef __declspec(align(16)) int16 vec16[8];
|
||||||
typedef __declspec(align(16)) int32 vec32[4];
|
typedef __declspec(align(16)) int32 vec32[4];
|
||||||
typedef __declspec(align(16)) int8 vec8[16];
|
typedef __declspec(align(16)) int8 vec8[16];
|
||||||
@ -374,6 +382,7 @@ typedef __declspec(align(32)) uint8 ulvec8[32];
|
|||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
// Caveat GCC 4.2 to 4.7 have a known issue using vectors with const.
|
// Caveat GCC 4.2 to 4.7 have a known issue using vectors with const.
|
||||||
#define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
|
#define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
|
||||||
|
#define SIMD_ALIGNED32(var) var __attribute__((aligned(64)))
|
||||||
typedef int16 __attribute__((vector_size(16))) vec16;
|
typedef int16 __attribute__((vector_size(16))) vec16;
|
||||||
typedef int32 __attribute__((vector_size(16))) vec32;
|
typedef int32 __attribute__((vector_size(16))) vec32;
|
||||||
typedef int8 __attribute__((vector_size(16))) vec8;
|
typedef int8 __attribute__((vector_size(16))) vec8;
|
||||||
@ -388,6 +397,7 @@ typedef uint32 __attribute__((vector_size(32))) ulvec32;
|
|||||||
typedef uint8 __attribute__((vector_size(32))) ulvec8;
|
typedef uint8 __attribute__((vector_size(32))) ulvec8;
|
||||||
#else
|
#else
|
||||||
#define SIMD_ALIGNED(var) var
|
#define SIMD_ALIGNED(var) var
|
||||||
|
#define SIMD_ALIGNED32(var) var
|
||||||
typedef int16 vec16[8];
|
typedef int16 vec16[8];
|
||||||
typedef int32 vec32[4];
|
typedef int32 vec32[4];
|
||||||
typedef int8 vec8[16];
|
typedef int8 vec8[16];
|
||||||
@ -1043,6 +1053,12 @@ void YUY2ToARGBRow_SSSE3(const uint8* src_yuy2,
|
|||||||
void UYVYToARGBRow_SSSE3(const uint8* src_uyvy,
|
void UYVYToARGBRow_SSSE3(const uint8* src_uyvy,
|
||||||
uint8* dst_argb,
|
uint8* dst_argb,
|
||||||
int width);
|
int width);
|
||||||
|
void YUY2ToARGBRow_AVX2(const uint8* src_yuy2,
|
||||||
|
uint8* dst_argb,
|
||||||
|
int width);
|
||||||
|
void UYVYToARGBRow_AVX2(const uint8* src_uyvy,
|
||||||
|
uint8* dst_argb,
|
||||||
|
int width);
|
||||||
void J422ToARGBRow_SSSE3(const uint8* src_y,
|
void J422ToARGBRow_SSSE3(const uint8* src_y,
|
||||||
const uint8* src_u,
|
const uint8* src_u,
|
||||||
const uint8* src_v,
|
const uint8* src_v,
|
||||||
@ -1145,6 +1161,12 @@ void YUY2ToARGBRow_Any_SSSE3(const uint8* src_yuy2,
|
|||||||
void UYVYToARGBRow_Any_SSSE3(const uint8* src_uyvy,
|
void UYVYToARGBRow_Any_SSSE3(const uint8* src_uyvy,
|
||||||
uint8* dst_argb,
|
uint8* dst_argb,
|
||||||
int width);
|
int width);
|
||||||
|
void YUY2ToARGBRow_Any_AVX2(const uint8* src_yuy2,
|
||||||
|
uint8* dst_argb,
|
||||||
|
int width);
|
||||||
|
void UYVYToARGBRow_Any_AVX2(const uint8* src_uyvy,
|
||||||
|
uint8* dst_argb,
|
||||||
|
int width);
|
||||||
void I422ToBGRARow_Any_SSSE3(const uint8* src_y,
|
void I422ToBGRARow_Any_SSSE3(const uint8* src_y,
|
||||||
const uint8* src_u,
|
const uint8* src_u,
|
||||||
const uint8* src_v,
|
const uint8* src_v,
|
||||||
|
|||||||
@ -11,6 +11,6 @@
|
|||||||
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
||||||
#define INCLUDE_LIBYUV_VERSION_H_
|
#define INCLUDE_LIBYUV_VERSION_H_
|
||||||
|
|
||||||
#define LIBYUV_VERSION 1286
|
#define LIBYUV_VERSION 1291
|
||||||
|
|
||||||
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
||||||
|
|||||||
@ -843,7 +843,6 @@ int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2,
|
|||||||
src_stride_yuy2 = dst_stride_argb = 0;
|
src_stride_yuy2 = dst_stride_argb = 0;
|
||||||
}
|
}
|
||||||
#if defined(HAS_YUY2TOARGBROW_SSSE3)
|
#if defined(HAS_YUY2TOARGBROW_SSSE3)
|
||||||
// Posix is 16, Windows is 8.
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||||
YUY2ToARGBRow = YUY2ToARGBRow_Any_SSSE3;
|
YUY2ToARGBRow = YUY2ToARGBRow_Any_SSSE3;
|
||||||
if (IS_ALIGNED(width, 16)) {
|
if (IS_ALIGNED(width, 16)) {
|
||||||
@ -851,6 +850,14 @@ int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_YUY2TOARGBROW_AVX2)
|
||||||
|
if (TestCpuFlag(kCpuHasAVX2)) {
|
||||||
|
YUY2ToARGBRow = YUY2ToARGBRow_Any_AVX2;
|
||||||
|
if (IS_ALIGNED(width, 32)) {
|
||||||
|
YUY2ToARGBRow = YUY2ToARGBRow_AVX2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if defined(HAS_YUY2TOARGBROW_NEON)
|
#if defined(HAS_YUY2TOARGBROW_NEON)
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
if (TestCpuFlag(kCpuHasNEON)) {
|
||||||
YUY2ToARGBRow = YUY2ToARGBRow_Any_NEON;
|
YUY2ToARGBRow = YUY2ToARGBRow_Any_NEON;
|
||||||
@ -893,7 +900,6 @@ int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
|
|||||||
src_stride_uyvy = dst_stride_argb = 0;
|
src_stride_uyvy = dst_stride_argb = 0;
|
||||||
}
|
}
|
||||||
#if defined(HAS_UYVYTOARGBROW_SSSE3)
|
#if defined(HAS_UYVYTOARGBROW_SSSE3)
|
||||||
// Posix is 16, Windows is 8.
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||||
UYVYToARGBRow = UYVYToARGBRow_Any_SSSE3;
|
UYVYToARGBRow = UYVYToARGBRow_Any_SSSE3;
|
||||||
if (IS_ALIGNED(width, 16)) {
|
if (IS_ALIGNED(width, 16)) {
|
||||||
@ -901,6 +907,14 @@ int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_UYVYTOARGBROW_AVX2)
|
||||||
|
if (TestCpuFlag(kCpuHasAVX2)) {
|
||||||
|
UYVYToARGBRow = UYVYToARGBRow_Any_AVX2;
|
||||||
|
if (IS_ALIGNED(width, 32)) {
|
||||||
|
UYVYToARGBRow = UYVYToARGBRow_AVX2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if defined(HAS_UYVYTOARGBROW_NEON)
|
#if defined(HAS_UYVYTOARGBROW_NEON)
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
if (TestCpuFlag(kCpuHasNEON)) {
|
||||||
UYVYToARGBRow = UYVYToARGBRow_Any_NEON;
|
UYVYToARGBRow = UYVYToARGBRow_Any_NEON;
|
||||||
|
|||||||
@ -162,27 +162,20 @@ RGBANY(ARGBToARGB4444Row_Any_SSE2, ARGBToARGB4444Row_SSE2, ARGBToARGB4444Row_C,
|
|||||||
3, 4, 2)
|
3, 4, 2)
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAS_I400TOARGBROW_SSE2)
|
#if defined(HAS_I400TOARGBROW_SSE2)
|
||||||
RGBANY(I400ToARGBRow_Any_SSE2, I400ToARGBRow_SSE2, I400ToARGBRow_C,
|
RGBANY(I400ToARGBRow_Any_SSE2, I400ToARGBRow_SSE2, I400ToARGBRow_C, 7, 1, 4)
|
||||||
7, 1, 4)
|
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAS_YTOARGBROW_SSE2)
|
#if defined(HAS_YTOARGBROW_SSE2)
|
||||||
RGBANY(YToARGBRow_Any_SSE2, YToARGBRow_SSE2, YToARGBRow_C,
|
RGBANY(YToARGBRow_Any_SSE2, YToARGBRow_SSE2, YToARGBRow_C, 7, 1, 4)
|
||||||
7, 1, 4)
|
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAS_YTOARGBROW_AVX2)
|
#if defined(HAS_YTOARGBROW_AVX2)
|
||||||
RGBANY(YToARGBRow_Any_AVX2, YToARGBRow_AVX2, YToARGBRow_C,
|
RGBANY(YToARGBRow_Any_AVX2, YToARGBRow_AVX2, YToARGBRow_C, 15, 1, 4)
|
||||||
15, 1, 4)
|
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAS_YUY2TOARGBROW_SSSE3)
|
#if defined(HAS_YUY2TOARGBROW_SSSE3)
|
||||||
RGBANY(YUY2ToARGBRow_Any_SSSE3, YUY2ToARGBRow_SSSE3, YUY2ToARGBRow_C,
|
RGBANY(YUY2ToARGBRow_Any_SSSE3, YUY2ToARGBRow_SSSE3, YUY2ToARGBRow_C, 15, 2, 4)
|
||||||
15, 2, 4)
|
RGBANY(UYVYToARGBRow_Any_SSSE3, UYVYToARGBRow_SSSE3, UYVYToARGBRow_C, 15, 2, 4)
|
||||||
RGBANY(UYVYToARGBRow_Any_SSSE3, UYVYToARGBRow_SSSE3, UYVYToARGBRow_C,
|
|
||||||
15, 2, 4)
|
|
||||||
// These require alignment on ARGB, so C is used for remainder.
|
|
||||||
RGBANY(RGB24ToARGBRow_Any_SSSE3, RGB24ToARGBRow_SSSE3, RGB24ToARGBRow_C,
|
RGBANY(RGB24ToARGBRow_Any_SSSE3, RGB24ToARGBRow_SSSE3, RGB24ToARGBRow_C,
|
||||||
15, 3, 4)
|
15, 3, 4)
|
||||||
RGBANY(RAWToARGBRow_Any_SSSE3, RAWToARGBRow_SSSE3, RAWToARGBRow_C,
|
RGBANY(RAWToARGBRow_Any_SSSE3, RAWToARGBRow_SSSE3, RAWToARGBRow_C, 15, 3, 4)
|
||||||
15, 3, 4)
|
|
||||||
RGBANY(RGB565ToARGBRow_Any_SSE2, RGB565ToARGBRow_SSE2, RGB565ToARGBRow_C,
|
RGBANY(RGB565ToARGBRow_Any_SSE2, RGB565ToARGBRow_SSE2, RGB565ToARGBRow_C,
|
||||||
7, 2, 4)
|
7, 2, 4)
|
||||||
RGBANY(ARGB1555ToARGBRow_Any_SSE2, ARGB1555ToARGBRow_SSE2, ARGB1555ToARGBRow_C,
|
RGBANY(ARGB1555ToARGBRow_Any_SSE2, ARGB1555ToARGBRow_SSE2, ARGB1555ToARGBRow_C,
|
||||||
@ -190,6 +183,10 @@ RGBANY(ARGB1555ToARGBRow_Any_SSE2, ARGB1555ToARGBRow_SSE2, ARGB1555ToARGBRow_C,
|
|||||||
RGBANY(ARGB4444ToARGBRow_Any_SSE2, ARGB4444ToARGBRow_SSE2, ARGB4444ToARGBRow_C,
|
RGBANY(ARGB4444ToARGBRow_Any_SSE2, ARGB4444ToARGBRow_SSE2, ARGB4444ToARGBRow_C,
|
||||||
7, 2, 4)
|
7, 2, 4)
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_YUY2TOARGBROW_AVX2)
|
||||||
|
RGBANY(YUY2ToARGBRow_Any_AVX2, YUY2ToARGBRow_AVX2, YUY2ToARGBRow_C, 31, 2, 4)
|
||||||
|
RGBANY(UYVYToARGBRow_Any_AVX2, UYVYToARGBRow_AVX2, UYVYToARGBRow_C, 31, 2, 4)
|
||||||
|
#endif
|
||||||
#if defined(HAS_ARGBTORGB24ROW_NEON)
|
#if defined(HAS_ARGBTORGB24ROW_NEON)
|
||||||
RGBANY(ARGBToRGB24Row_Any_NEON, ARGBToRGB24Row_NEON, ARGBToRGB24Row_C, 7, 4, 3)
|
RGBANY(ARGBToRGB24Row_Any_NEON, ARGBToRGB24Row_NEON, ARGBToRGB24Row_C, 7, 4, 3)
|
||||||
RGBANY(ARGBToRAWRow_Any_NEON, ARGBToRAWRow_NEON, ARGBToRAWRow_C, 7, 4, 3)
|
RGBANY(ARGBToRAWRow_Any_NEON, ARGBToRAWRow_NEON, ARGBToRAWRow_C, 7, 4, 3)
|
||||||
@ -199,14 +196,10 @@ RGBANY(ARGBToARGB1555Row_Any_NEON, ARGBToARGB1555Row_NEON, ARGBToARGB1555Row_C,
|
|||||||
7, 4, 2)
|
7, 4, 2)
|
||||||
RGBANY(ARGBToARGB4444Row_Any_NEON, ARGBToARGB4444Row_NEON, ARGBToARGB4444Row_C,
|
RGBANY(ARGBToARGB4444Row_Any_NEON, ARGBToARGB4444Row_NEON, ARGBToARGB4444Row_C,
|
||||||
7, 4, 2)
|
7, 4, 2)
|
||||||
RGBANY(I400ToARGBRow_Any_NEON, I400ToARGBRow_NEON, I400ToARGBRow_C,
|
RGBANY(I400ToARGBRow_Any_NEON, I400ToARGBRow_NEON, I400ToARGBRow_C, 7, 1, 4)
|
||||||
7, 1, 4)
|
RGBANY(YToARGBRow_Any_NEON, YToARGBRow_NEON, YToARGBRow_C, 7, 1, 4)
|
||||||
RGBANY(YToARGBRow_Any_NEON, YToARGBRow_NEON, YToARGBRow_C,
|
RGBANY(YUY2ToARGBRow_Any_NEON, YUY2ToARGBRow_NEON, YUY2ToARGBRow_C, 7, 2, 4)
|
||||||
7, 1, 4)
|
RGBANY(UYVYToARGBRow_Any_NEON, UYVYToARGBRow_NEON, UYVYToARGBRow_C, 7, 2, 4)
|
||||||
RGBANY(YUY2ToARGBRow_Any_NEON, YUY2ToARGBRow_NEON, YUY2ToARGBRow_C,
|
|
||||||
7, 2, 4)
|
|
||||||
RGBANY(UYVYToARGBRow_Any_NEON, UYVYToARGBRow_NEON, UYVYToARGBRow_C,
|
|
||||||
7, 2, 4)
|
|
||||||
#endif
|
#endif
|
||||||
#undef RGBANY
|
#undef RGBANY
|
||||||
|
|
||||||
|
|||||||
@ -2123,7 +2123,7 @@ void I422ToUYVYRow_C(const uint8* src_y,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Maximum temporary width for wrappers to process at a time, in pixels.
|
// Maximum temporary width for wrappers to process at a time, in pixels.
|
||||||
#define MAXTWIDTH 4096
|
#define MAXTWIDTH 2048
|
||||||
|
|
||||||
#if !defined(LIBYUV_DISABLE_X86) && defined(HAS_I422TOARGBROW_SSSE3)
|
#if !defined(LIBYUV_DISABLE_X86) && defined(HAS_I422TOARGBROW_SSSE3)
|
||||||
// row_win.cc has asm version, but GCC uses 2 step wrapper.
|
// row_win.cc has asm version, but GCC uses 2 step wrapper.
|
||||||
@ -2250,6 +2250,40 @@ void UYVYToARGBRow_SSSE3(const uint8* src_uyvy, uint8* dst_argb, int width) {
|
|||||||
#endif // defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)
|
#endif // defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)
|
||||||
#endif // !defined(LIBYUV_DISABLE_X86)
|
#endif // !defined(LIBYUV_DISABLE_X86)
|
||||||
|
|
||||||
|
#if defined(HAS_YUY2TOARGBROW_AVX2)
|
||||||
|
void YUY2ToARGBRow_AVX2(const uint8* src_yuy2, uint8* dst_argb, int width) {
|
||||||
|
// Row buffers for intermediate YUV conversion.
|
||||||
|
SIMD_ALIGNED32(uint8 row_y[MAXTWIDTH]);
|
||||||
|
SIMD_ALIGNED32(uint8 row_u[MAXTWIDTH / 2]);
|
||||||
|
SIMD_ALIGNED32(uint8 row_v[MAXTWIDTH / 2]);
|
||||||
|
while (width > 0) {
|
||||||
|
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||||
|
YUY2ToUV422Row_AVX2(src_yuy2, row_u, row_v, twidth);
|
||||||
|
YUY2ToYRow_AVX2(src_yuy2, row_y, twidth);
|
||||||
|
I422ToARGBRow_AVX2(row_y, row_u, row_v, dst_argb, twidth);
|
||||||
|
src_yuy2 += twidth * 2;
|
||||||
|
dst_argb += twidth * 4;
|
||||||
|
width -= twidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UYVYToARGBRow_AVX2(const uint8* src_uyvy, uint8* dst_argb, int width) {
|
||||||
|
// Row buffers for intermediate YUV conversion.
|
||||||
|
SIMD_ALIGNED32(uint8 row_y[MAXTWIDTH]);
|
||||||
|
SIMD_ALIGNED32(uint8 row_u[MAXTWIDTH / 2]);
|
||||||
|
SIMD_ALIGNED32(uint8 row_v[MAXTWIDTH / 2]);
|
||||||
|
while (width > 0) {
|
||||||
|
int twidth = width > MAXTWIDTH ? MAXTWIDTH : width;
|
||||||
|
UYVYToUV422Row_AVX2(src_uyvy, row_u, row_v, twidth);
|
||||||
|
UYVYToYRow_AVX2(src_uyvy, row_y, twidth);
|
||||||
|
I422ToARGBRow_AVX2(row_y, row_u, row_v, dst_argb, twidth);
|
||||||
|
src_uyvy += twidth * 2;
|
||||||
|
dst_argb += twidth * 4;
|
||||||
|
width -= twidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void ARGBPolynomialRow_C(const uint8* src_argb,
|
void ARGBPolynomialRow_C(const uint8* src_argb,
|
||||||
uint8* dst_argb, const float* poly,
|
uint8* dst_argb, const float* poly,
|
||||||
int width) {
|
int width) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user