| Index: source/libvpx/third_party/libyuv/source/convert_argb.cc
|
| diff --git a/source/libvpx/third_party/libyuv/source/convert_argb.cc b/source/libvpx/third_party/libyuv/source/convert_argb.cc
|
| index ac0bc3d156fcfe205cf9be16a9b9f67cd1f7cda4..66f7660793a4b17c3773b09686103c29dcaeb640 100644
|
| --- a/source/libvpx/third_party/libyuv/source/convert_argb.cc
|
| +++ b/source/libvpx/third_party/libyuv/source/convert_argb.cc
|
| @@ -11,7 +11,6 @@
|
| #include "libyuv/convert_argb.h"
|
|
|
| #include "libyuv/cpu_id.h"
|
| -#include "libyuv/format_conversion.h"
|
| #ifdef HAVE_JPEG
|
| #include "libyuv/mjpeg_decoder.h"
|
| #endif
|
| @@ -79,17 +78,15 @@ int I444ToARGB(const uint8* src_y, int src_stride_y,
|
| src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_I444TOARGBROW_SSSE3)
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| I444ToARGBRow = I444ToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 8)) {
|
| - I444ToARGBRow = I444ToARGBRow_Unaligned_SSSE3;
|
| - if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - I444ToARGBRow = I444ToARGBRow_SSSE3;
|
| - }
|
| + I444ToARGBRow = I444ToARGBRow_SSSE3;
|
| }
|
| }
|
| -#elif defined(HAS_I444TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_I444TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| I444ToARGBRow = I444ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| I444ToARGBRow = I444ToARGBRow_NEON;
|
| @@ -141,18 +138,15 @@ int I422ToARGB(const uint8* src_y, int src_stride_y,
|
| src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_I422TOARGBROW_SSSE3)
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| I422ToARGBRow = I422ToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 8)) {
|
| - I422ToARGBRow = I422ToARGBRow_Unaligned_SSSE3;
|
| - if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - I422ToARGBRow = I422ToARGBRow_SSSE3;
|
| - }
|
| + I422ToARGBRow = I422ToARGBRow_SSSE3;
|
| }
|
| }
|
| #endif
|
| #if defined(HAS_I422TOARGBROW_AVX2)
|
| - if (TestCpuFlag(kCpuHasAVX2) && width >= 16) {
|
| + if (TestCpuFlag(kCpuHasAVX2)) {
|
| I422ToARGBRow = I422ToARGBRow_Any_AVX2;
|
| if (IS_ALIGNED(width, 16)) {
|
| I422ToARGBRow = I422ToARGBRow_AVX2;
|
| @@ -160,7 +154,7 @@ int I422ToARGB(const uint8* src_y, int src_stride_y,
|
| }
|
| #endif
|
| #if defined(HAS_I422TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| I422ToARGBRow = I422ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| I422ToARGBRow = I422ToARGBRow_NEON;
|
| @@ -221,17 +215,15 @@ int I411ToARGB(const uint8* src_y, int src_stride_y,
|
| src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_I411TOARGBROW_SSSE3)
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| I411ToARGBRow = I411ToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 8)) {
|
| - I411ToARGBRow = I411ToARGBRow_Unaligned_SSSE3;
|
| - if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - I411ToARGBRow = I411ToARGBRow_SSSE3;
|
| - }
|
| + I411ToARGBRow = I411ToARGBRow_SSSE3;
|
| }
|
| }
|
| -#elif defined(HAS_I411TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_I411TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| I411ToARGBRow = I411ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| I411ToARGBRow = I411ToARGBRow_NEON;
|
| @@ -276,15 +268,23 @@ int I400ToARGB_Reference(const uint8* src_y, int src_stride_y,
|
| src_stride_y = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_YTOARGBROW_SSE2)
|
| - if (TestCpuFlag(kCpuHasSSE2) && width >= 8 &&
|
| - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| + if (TestCpuFlag(kCpuHasSSE2)) {
|
| YToARGBRow = YToARGBRow_Any_SSE2;
|
| if (IS_ALIGNED(width, 8)) {
|
| YToARGBRow = YToARGBRow_SSE2;
|
| }
|
| }
|
| -#elif defined(HAS_YTOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_YTOARGBROW_AVX2)
|
| + if (TestCpuFlag(kCpuHasAVX2)) {
|
| + YToARGBRow = YToARGBRow_Any_AVX2;
|
| + if (IS_ALIGNED(width, 16)) {
|
| + YToARGBRow = YToARGBRow_AVX2;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_YTOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| YToARGBRow = YToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| YToARGBRow = YToARGBRow_NEON;
|
| @@ -326,17 +326,15 @@ int I400ToARGB(const uint8* src_y, int src_stride_y,
|
| src_stride_y = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_I400TOARGBROW_SSE2)
|
| - if (TestCpuFlag(kCpuHasSSE2) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasSSE2)) {
|
| I400ToARGBRow = I400ToARGBRow_Any_SSE2;
|
| if (IS_ALIGNED(width, 8)) {
|
| - I400ToARGBRow = I400ToARGBRow_Unaligned_SSE2;
|
| - if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - I400ToARGBRow = I400ToARGBRow_SSE2;
|
| - }
|
| + I400ToARGBRow = I400ToARGBRow_SSE2;
|
| }
|
| }
|
| -#elif defined(HAS_I400TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_I400TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| I400ToARGBRow = I400ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| I400ToARGBRow = I400ToARGBRow_NEON;
|
| @@ -447,15 +445,15 @@ int RGB24ToARGB(const uint8* src_rgb24, int src_stride_rgb24,
|
| src_stride_rgb24 = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_RGB24TOARGBROW_SSSE3)
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 16 &&
|
| - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| RGB24ToARGBRow = RGB24ToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 16)) {
|
| RGB24ToARGBRow = RGB24ToARGBRow_SSSE3;
|
| }
|
| }
|
| -#elif defined(HAS_RGB24TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_RGB24TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| RGB24ToARGBRow = RGB24ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| RGB24ToARGBRow = RGB24ToARGBRow_NEON;
|
| @@ -497,15 +495,15 @@ int RAWToARGB(const uint8* src_raw, int src_stride_raw,
|
| src_stride_raw = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_RAWTOARGBROW_SSSE3)
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 16 &&
|
| - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| RAWToARGBRow = RAWToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 16)) {
|
| RAWToARGBRow = RAWToARGBRow_SSSE3;
|
| }
|
| }
|
| -#elif defined(HAS_RAWTOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_RAWTOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| RAWToARGBRow = RAWToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| RAWToARGBRow = RAWToARGBRow_NEON;
|
| @@ -547,15 +545,15 @@ int RGB565ToARGB(const uint8* src_rgb565, int src_stride_rgb565,
|
| src_stride_rgb565 = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_RGB565TOARGBROW_SSE2)
|
| - if (TestCpuFlag(kCpuHasSSE2) && width >= 8 &&
|
| - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| + if (TestCpuFlag(kCpuHasSSE2)) {
|
| RGB565ToARGBRow = RGB565ToARGBRow_Any_SSE2;
|
| if (IS_ALIGNED(width, 8)) {
|
| RGB565ToARGBRow = RGB565ToARGBRow_SSE2;
|
| }
|
| }
|
| -#elif defined(HAS_RGB565TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_RGB565TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| RGB565ToARGBRow = RGB565ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| RGB565ToARGBRow = RGB565ToARGBRow_NEON;
|
| @@ -597,15 +595,15 @@ int ARGB1555ToARGB(const uint8* src_argb1555, int src_stride_argb1555,
|
| src_stride_argb1555 = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_ARGB1555TOARGBROW_SSE2)
|
| - if (TestCpuFlag(kCpuHasSSE2) && width >= 8 &&
|
| - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| + if (TestCpuFlag(kCpuHasSSE2)) {
|
| ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_SSE2;
|
| if (IS_ALIGNED(width, 8)) {
|
| ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2;
|
| }
|
| }
|
| -#elif defined(HAS_ARGB1555TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_ARGB1555TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| ARGB1555ToARGBRow = ARGB1555ToARGBRow_NEON;
|
| @@ -647,15 +645,15 @@ int ARGB4444ToARGB(const uint8* src_argb4444, int src_stride_argb4444,
|
| src_stride_argb4444 = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_ARGB4444TOARGBROW_SSE2)
|
| - if (TestCpuFlag(kCpuHasSSE2) && width >= 8 &&
|
| - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| + if (TestCpuFlag(kCpuHasSSE2)) {
|
| ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_SSE2;
|
| if (IS_ALIGNED(width, 8)) {
|
| ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2;
|
| }
|
| }
|
| -#elif defined(HAS_ARGB4444TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_ARGB4444TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| ARGB4444ToARGBRow = ARGB4444ToARGBRow_NEON;
|
| @@ -693,17 +691,23 @@ int NV12ToARGB(const uint8* src_y, int src_stride_y,
|
| dst_stride_argb = -dst_stride_argb;
|
| }
|
| #if defined(HAS_NV12TOARGBROW_SSSE3)
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| NV12ToARGBRow = NV12ToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 8)) {
|
| - NV12ToARGBRow = NV12ToARGBRow_Unaligned_SSSE3;
|
| - if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - NV12ToARGBRow = NV12ToARGBRow_SSSE3;
|
| - }
|
| + NV12ToARGBRow = NV12ToARGBRow_SSSE3;
|
| }
|
| }
|
| -#elif defined(HAS_NV12TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_NV12TOARGBROW_AVX2)
|
| + if (TestCpuFlag(kCpuHasAVX2)) {
|
| + NV12ToARGBRow = NV12ToARGBRow_Any_AVX2;
|
| + if (IS_ALIGNED(width, 16)) {
|
| + NV12ToARGBRow = NV12ToARGBRow_AVX2;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_NV12TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| NV12ToARGBRow = NV12ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| NV12ToARGBRow = NV12ToARGBRow_NEON;
|
| @@ -744,18 +748,23 @@ int NV21ToARGB(const uint8* src_y, int src_stride_y,
|
| dst_stride_argb = -dst_stride_argb;
|
| }
|
| #if defined(HAS_NV21TOARGBROW_SSSE3)
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| NV21ToARGBRow = NV21ToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 8)) {
|
| - NV21ToARGBRow = NV21ToARGBRow_Unaligned_SSSE3;
|
| - if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - NV21ToARGBRow = NV21ToARGBRow_SSSE3;
|
| - }
|
| + NV21ToARGBRow = NV21ToARGBRow_SSSE3;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_NV21TOARGBROW_AVX2)
|
| + if (TestCpuFlag(kCpuHasAVX2)) {
|
| + NV21ToARGBRow = NV21ToARGBRow_Any_AVX2;
|
| + if (IS_ALIGNED(width, 16)) {
|
| + NV21ToARGBRow = NV21ToARGBRow_AVX2;
|
| }
|
| }
|
| #endif
|
| #if defined(HAS_NV21TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| NV21ToARGBRow = NV21ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| NV21ToARGBRow = NV21ToARGBRow_NEON;
|
| @@ -795,17 +804,23 @@ int M420ToARGB(const uint8* src_m420, int src_stride_m420,
|
| dst_stride_argb = -dst_stride_argb;
|
| }
|
| #if defined(HAS_NV12TOARGBROW_SSSE3)
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| NV12ToARGBRow = NV12ToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 8)) {
|
| - NV12ToARGBRow = NV12ToARGBRow_Unaligned_SSSE3;
|
| - if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - NV12ToARGBRow = NV12ToARGBRow_SSSE3;
|
| - }
|
| + NV12ToARGBRow = NV12ToARGBRow_SSSE3;
|
| }
|
| }
|
| -#elif defined(HAS_NV12TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#endif
|
| +#if defined(HAS_NV12TOARGBROW_AVX2)
|
| + if (TestCpuFlag(kCpuHasAVX2)) {
|
| + NV12ToARGBRow = NV12ToARGBRow_Any_AVX2;
|
| + if (IS_ALIGNED(width, 16)) {
|
| + NV12ToARGBRow = NV12ToARGBRow_AVX2;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_NV12TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| NV12ToARGBRow = NV12ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| NV12ToARGBRow = NV12ToARGBRow_NEON;
|
| @@ -852,19 +867,23 @@ int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2,
|
| src_stride_yuy2 = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_YUY2TOARGBROW_SSSE3)
|
| - // Posix is 16, Windows is 8.
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 16) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| YUY2ToARGBRow = YUY2ToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 16)) {
|
| - YUY2ToARGBRow = YUY2ToARGBRow_Unaligned_SSSE3;
|
| - if (IS_ALIGNED(src_yuy2, 16) && IS_ALIGNED(src_stride_yuy2, 16) &&
|
| - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - YUY2ToARGBRow = YUY2ToARGBRow_SSSE3;
|
| - }
|
| + YUY2ToARGBRow = YUY2ToARGBRow_SSSE3;
|
| }
|
| }
|
| -#elif defined(HAS_YUY2TOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#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 (TestCpuFlag(kCpuHasNEON)) {
|
| YUY2ToARGBRow = YUY2ToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| YUY2ToARGBRow = YUY2ToARGBRow_NEON;
|
| @@ -905,19 +924,23 @@ int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
|
| src_stride_uyvy = dst_stride_argb = 0;
|
| }
|
| #if defined(HAS_UYVYTOARGBROW_SSSE3)
|
| - // Posix is 16, Windows is 8.
|
| - if (TestCpuFlag(kCpuHasSSSE3) && width >= 16) {
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| UYVYToARGBRow = UYVYToARGBRow_Any_SSSE3;
|
| if (IS_ALIGNED(width, 16)) {
|
| - UYVYToARGBRow = UYVYToARGBRow_Unaligned_SSSE3;
|
| - if (IS_ALIGNED(src_uyvy, 16) && IS_ALIGNED(src_stride_uyvy, 16) &&
|
| - IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
| - UYVYToARGBRow = UYVYToARGBRow_SSSE3;
|
| - }
|
| + UYVYToARGBRow = UYVYToARGBRow_SSSE3;
|
| }
|
| }
|
| -#elif defined(HAS_UYVYTOARGBROW_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
|
| +#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 (TestCpuFlag(kCpuHasNEON)) {
|
| UYVYToARGBRow = UYVYToARGBRow_Any_NEON;
|
| if (IS_ALIGNED(width, 8)) {
|
| UYVYToARGBRow = UYVYToARGBRow_NEON;
|
| @@ -932,6 +955,152 @@ int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
|
| return 0;
|
| }
|
|
|
| +// Convert J420 to ARGB.
|
| +LIBYUV_API
|
| +int J420ToARGB(const uint8* src_y, int src_stride_y,
|
| + const uint8* src_u, int src_stride_u,
|
| + const uint8* src_v, int src_stride_v,
|
| + uint8* dst_argb, int dst_stride_argb,
|
| + int width, int height) {
|
| + int y;
|
| + void (*J422ToARGBRow)(const uint8* y_buf,
|
| + const uint8* u_buf,
|
| + const uint8* v_buf,
|
| + uint8* rgb_buf,
|
| + int width) = J422ToARGBRow_C;
|
| + if (!src_y || !src_u || !src_v || !dst_argb ||
|
| + width <= 0 || height == 0) {
|
| + return -1;
|
| + }
|
| + // Negative height means invert the image.
|
| + if (height < 0) {
|
| + height = -height;
|
| + dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
| + dst_stride_argb = -dst_stride_argb;
|
| + }
|
| +#if defined(HAS_J422TOARGBROW_SSSE3)
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| + J422ToARGBRow = J422ToARGBRow_Any_SSSE3;
|
| + if (IS_ALIGNED(width, 8)) {
|
| + J422ToARGBRow = J422ToARGBRow_SSSE3;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_J422TOARGBROW_AVX2)
|
| + if (TestCpuFlag(kCpuHasAVX2)) {
|
| + J422ToARGBRow = J422ToARGBRow_Any_AVX2;
|
| + if (IS_ALIGNED(width, 16)) {
|
| + J422ToARGBRow = J422ToARGBRow_AVX2;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_J422TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| + J422ToARGBRow = J422ToARGBRow_Any_NEON;
|
| + if (IS_ALIGNED(width, 8)) {
|
| + J422ToARGBRow = J422ToARGBRow_NEON;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_J422TOARGBROW_MIPS_DSPR2)
|
| + if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) &&
|
| + IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) &&
|
| + IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) &&
|
| + IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) &&
|
| + IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) {
|
| + J422ToARGBRow = J422ToARGBRow_MIPS_DSPR2;
|
| + }
|
| +#endif
|
| +
|
| + for (y = 0; y < height; ++y) {
|
| + J422ToARGBRow(src_y, src_u, src_v, dst_argb, width);
|
| + dst_argb += dst_stride_argb;
|
| + src_y += src_stride_y;
|
| + if (y & 1) {
|
| + src_u += src_stride_u;
|
| + src_v += src_stride_v;
|
| + }
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| +// Convert J422 to ARGB.
|
| +LIBYUV_API
|
| +int J422ToARGB(const uint8* src_y, int src_stride_y,
|
| + const uint8* src_u, int src_stride_u,
|
| + const uint8* src_v, int src_stride_v,
|
| + uint8* dst_argb, int dst_stride_argb,
|
| + int width, int height) {
|
| + int y;
|
| + void (*J422ToARGBRow)(const uint8* y_buf,
|
| + const uint8* u_buf,
|
| + const uint8* v_buf,
|
| + uint8* rgb_buf,
|
| + int width) = J422ToARGBRow_C;
|
| + if (!src_y || !src_u || !src_v ||
|
| + !dst_argb ||
|
| + width <= 0 || height == 0) {
|
| + return -1;
|
| + }
|
| + // Negative height means invert the image.
|
| + if (height < 0) {
|
| + height = -height;
|
| + dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
| + dst_stride_argb = -dst_stride_argb;
|
| + }
|
| + // Coalesce rows.
|
| + if (src_stride_y == width &&
|
| + src_stride_u * 2 == width &&
|
| + src_stride_v * 2 == width &&
|
| + dst_stride_argb == width * 4) {
|
| + width *= height;
|
| + height = 1;
|
| + src_stride_y = src_stride_u = src_stride_v = dst_stride_argb = 0;
|
| + }
|
| +#if defined(HAS_J422TOARGBROW_SSSE3)
|
| + if (TestCpuFlag(kCpuHasSSSE3)) {
|
| + J422ToARGBRow = J422ToARGBRow_Any_SSSE3;
|
| + if (IS_ALIGNED(width, 8)) {
|
| + J422ToARGBRow = J422ToARGBRow_SSSE3;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_J422TOARGBROW_AVX2)
|
| + if (TestCpuFlag(kCpuHasAVX2)) {
|
| + J422ToARGBRow = J422ToARGBRow_Any_AVX2;
|
| + if (IS_ALIGNED(width, 16)) {
|
| + J422ToARGBRow = J422ToARGBRow_AVX2;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_J422TOARGBROW_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| + J422ToARGBRow = J422ToARGBRow_Any_NEON;
|
| + if (IS_ALIGNED(width, 8)) {
|
| + J422ToARGBRow = J422ToARGBRow_NEON;
|
| + }
|
| + }
|
| +#endif
|
| +#if defined(HAS_J422TOARGBROW_MIPS_DSPR2)
|
| + if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) &&
|
| + IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) &&
|
| + IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) &&
|
| + IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) &&
|
| + IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) {
|
| + J422ToARGBRow = J422ToARGBRow_MIPS_DSPR2;
|
| + }
|
| +#endif
|
| +
|
| + for (y = 0; y < height; ++y) {
|
| + J422ToARGBRow(src_y, src_u, src_v, dst_argb, width);
|
| + dst_argb += dst_stride_argb;
|
| + src_y += src_stride_y;
|
| + src_u += src_stride_u;
|
| + src_v += src_stride_v;
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| #ifdef __cplusplus
|
| } // extern "C"
|
| } // namespace libyuv
|
|
|