Index: source/convert_argb.cc |
diff --git a/source/convert_argb.cc b/source/convert_argb.cc |
index dc3071926c42f5c1747d2f65ddf91c1a125084e3..51817da167989ce2d6039f28186632eab41df5a8 100644 |
--- a/source/convert_argb.cc |
+++ b/source/convert_argb.cc |
@@ -336,16 +336,15 @@ int I420AlphaToARGB(const uint8* src_y, int src_stride_y, |
const uint8* src_v, int src_stride_v, |
const uint8* src_a, int src_stride_a, |
uint8* dst_argb, int dst_stride_argb, |
- int width, int height) { |
+ int width, int height, int attenuate) { |
int y; |
- void (*I422ToARGBRow)(const uint8* y_buf, |
- const uint8* u_buf, |
- const uint8* v_buf, |
- uint8* rgb_buf, |
- struct YuvConstants* yuvconstants, |
- int width) = I422ToARGBRow_C; |
- void (*ARGBCopyYToAlphaRow)(const uint8* src_y, uint8* dst_argb, int width) = |
- ARGBCopyYToAlphaRow_C; |
+ void (*I422AlphaToARGBRow)(const uint8* y_buf, |
+ const uint8* u_buf, |
+ const uint8* v_buf, |
+ const uint8* a_buf, |
+ uint8* dst_argb, |
+ struct YuvConstants* yuvconstants, |
+ int width) = I422AlphaToARGBRow_C; |
void (*ARGBAttenuateRow)(const uint8* src_argb, uint8* dst_argb, |
int width) = ARGBAttenuateRow_C; |
if (!src_y || !src_u || !src_v || !dst_argb || |
@@ -358,53 +357,37 @@ int I420AlphaToARGB(const uint8* src_y, int src_stride_y, |
dst_argb = dst_argb + (height - 1) * dst_stride_argb; |
dst_stride_argb = -dst_stride_argb; |
} |
-#if defined(HAS_I422TOARGBROW_SSSE3) |
+#if defined(HAS_I422ALPHATOARGBROW_SSSE3) |
if (TestCpuFlag(kCpuHasSSSE3)) { |
- I422ToARGBRow = I422ToARGBRow_Any_SSSE3; |
+ I422AlphaToARGBRow = I422AlphaToARGBRow_Any_SSSE3; |
if (IS_ALIGNED(width, 8)) { |
- I422ToARGBRow = I422ToARGBRow_SSSE3; |
+ I422AlphaToARGBRow = I422AlphaToARGBRow_SSSE3; |
} |
} |
#endif |
-#if defined(HAS_I422TOARGBROW_AVX2) |
+#if defined(HAS_I422ALPHATOARGBROW_AVX2) |
if (TestCpuFlag(kCpuHasAVX2)) { |
- I422ToARGBRow = I422ToARGBRow_Any_AVX2; |
+ I422AlphaToARGBRow = I422AlphaToARGBRow_Any_AVX2; |
if (IS_ALIGNED(width, 16)) { |
- I422ToARGBRow = I422ToARGBRow_AVX2; |
+ I422AlphaToARGBRow = I422AlphaToARGBRow_AVX2; |
} |
} |
#endif |
-#if defined(HAS_I422TOARGBROW_NEON) |
+#if defined(HAS_I422ALPHATOARGBROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
- I422ToARGBRow = I422ToARGBRow_Any_NEON; |
+ I422AlphaToARGBRow = I422AlphaToARGBRow_Any_NEON; |
if (IS_ALIGNED(width, 8)) { |
- I422ToARGBRow = I422ToARGBRow_NEON; |
+ I422AlphaToARGBRow = I422AlphaToARGBRow_NEON; |
} |
} |
#endif |
-#if defined(HAS_I422TOARGBROW_MIPS_DSPR2) |
+#if defined(HAS_I422ALPHATOARGBROW_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)) { |
- I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2; |
- } |
-#endif |
-#if defined(HAS_ARGBCOPYYTOALPHAROW_SSE2) |
- if (TestCpuFlag(kCpuHasSSE2)) { |
- ARGBCopyYToAlphaRow = ARGBCopyYToAlphaRow_Any_SSE2; |
- if (IS_ALIGNED(width, 8)) { |
- ARGBCopyYToAlphaRow = ARGBCopyYToAlphaRow_SSE2; |
- } |
- } |
-#endif |
-#if defined(HAS_ARGBCOPYYTOALPHAROW_AVX2) |
- if (TestCpuFlag(kCpuHasAVX2)) { |
- ARGBCopyYToAlphaRow = ARGBCopyYToAlphaRow_Any_AVX2; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBCopyYToAlphaRow = ARGBCopyYToAlphaRow_AVX2; |
- } |
+ I422AlphaToARGBRow = I422AlphaToARGBRow_MIPS_DSPR2; |
} |
#endif |
#if defined(HAS_ARGBATTENUATEROW_SSE2) |
@@ -441,9 +424,10 @@ int I420AlphaToARGB(const uint8* src_y, int src_stride_y, |
#endif |
for (y = 0; y < height; ++y) { |
- I422ToARGBRow(src_y, src_u, src_v, dst_argb, &kYuvConstants, width); |
- ARGBCopyYToAlphaRow(src_a, dst_argb, width); |
- ARGBAttenuateRow(dst_argb, dst_argb, width); |
+ I422AlphaToARGBRow(src_y, src_u, src_v, src_a, dst_argb, &kYuvConstants, width); |
+ if (attenuate) { |
+ ARGBAttenuateRow(dst_argb, dst_argb, width); |
+ } |
dst_argb += dst_stride_argb; |
src_a += src_stride_a; |
src_y += src_stride_y; |
@@ -454,24 +438,24 @@ int I420AlphaToARGB(const uint8* src_y, int src_stride_y, |
} |
return 0; |
} |
-// Convert I420 with Alpha to preattenuated ABGR. |
+ |
+// Convert I420 with Alpha to preattenuated ARGB. |
LIBYUV_API |
int I420AlphaToABGR(const uint8* src_y, int src_stride_y, |
const uint8* src_u, int src_stride_u, |
const uint8* src_v, int src_stride_v, |
const uint8* src_a, int src_stride_a, |
uint8* dst_abgr, int dst_stride_abgr, |
- int width, int height) { |
+ int width, int height, int attenuate) { |
int y; |
- void (*I422ToABGRRow)(const uint8* y_buf, |
- const uint8* u_buf, |
- const uint8* v_buf, |
- uint8* rgb_buf, |
- struct YuvConstants* yuvconstants, |
- int width) = I422ToABGRRow_C; |
- void (*ARGBCopyYToAlphaRow)(const uint8* src_y, uint8* dst_argb, int width) = |
- ARGBCopyYToAlphaRow_C; |
- void (*ARGBAttenuateRow)(const uint8* src_argb, uint8* dst_argb, |
+ void (*I422AlphaToABGRRow)(const uint8* y_buf, |
+ const uint8* u_buf, |
+ const uint8* v_buf, |
+ const uint8* a_buf, |
+ uint8* dst_abgr, |
+ struct YuvConstants* yuvconstants, |
+ int width) = I422AlphaToABGRRow_C; |
+ void (*ARGBAttenuateRow)(const uint8* src_abgr, uint8* dst_abgr, |
int width) = ARGBAttenuateRow_C; |
if (!src_y || !src_u || !src_v || !dst_abgr || |
width <= 0 || height == 0) { |
@@ -483,53 +467,37 @@ int I420AlphaToABGR(const uint8* src_y, int src_stride_y, |
dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; |
dst_stride_abgr = -dst_stride_abgr; |
} |
-#if defined(HAS_I422TOABGRROW_SSSE3) |
+#if defined(HAS_I422ALPHATOABGRROW_SSSE3) |
if (TestCpuFlag(kCpuHasSSSE3)) { |
- I422ToABGRRow = I422ToABGRRow_Any_SSSE3; |
+ I422AlphaToABGRRow = I422AlphaToABGRRow_Any_SSSE3; |
if (IS_ALIGNED(width, 8)) { |
- I422ToABGRRow = I422ToABGRRow_SSSE3; |
+ I422AlphaToABGRRow = I422AlphaToABGRRow_SSSE3; |
} |
} |
#endif |
-#if defined(HAS_I422TOABGRROW_AVX2) |
+#if defined(HAS_I422ALPHATOABGRROW_AVX2) |
if (TestCpuFlag(kCpuHasAVX2)) { |
- I422ToABGRRow = I422ToABGRRow_Any_AVX2; |
+ I422AlphaToABGRRow = I422AlphaToABGRRow_Any_AVX2; |
if (IS_ALIGNED(width, 16)) { |
- I422ToABGRRow = I422ToABGRRow_AVX2; |
+ I422AlphaToABGRRow = I422AlphaToABGRRow_AVX2; |
} |
} |
#endif |
-#if defined(HAS_I422TOABGRROW_NEON) |
+#if defined(HAS_I422ALPHATOABGRROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
- I422ToABGRRow = I422ToABGRRow_Any_NEON; |
+ I422AlphaToABGRRow = I422AlphaToABGRRow_Any_NEON; |
if (IS_ALIGNED(width, 8)) { |
- I422ToABGRRow = I422ToABGRRow_NEON; |
+ I422AlphaToABGRRow = I422AlphaToABGRRow_NEON; |
} |
} |
#endif |
-#if defined(HAS_I422TOABGRROW_MIPS_DSPR2) |
+#if defined(HAS_I422ALPHATOABGRROW_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_abgr, 4) && IS_ALIGNED(dst_stride_abgr, 4)) { |
- I422ToABGRRow = I422ToABGRRow_MIPS_DSPR2; |
- } |
-#endif |
-#if defined(HAS_ARGBCOPYYTOALPHAROW_SSE2) |
- if (TestCpuFlag(kCpuHasSSE2)) { |
- ARGBCopyYToAlphaRow = ARGBCopyYToAlphaRow_Any_SSE2; |
- if (IS_ALIGNED(width, 8)) { |
- ARGBCopyYToAlphaRow = ARGBCopyYToAlphaRow_SSE2; |
- } |
- } |
-#endif |
-#if defined(HAS_ARGBCOPYYTOALPHAROW_AVX2) |
- if (TestCpuFlag(kCpuHasAVX2)) { |
- ARGBCopyYToAlphaRow = ARGBCopyYToAlphaRow_Any_AVX2; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBCopyYToAlphaRow = ARGBCopyYToAlphaRow_AVX2; |
- } |
+ I422AlphaToABGRRow = I422AlphaToABGRRow_MIPS_DSPR2; |
} |
#endif |
#if defined(HAS_ARGBATTENUATEROW_SSE2) |
@@ -566,9 +534,10 @@ int I420AlphaToABGR(const uint8* src_y, int src_stride_y, |
#endif |
for (y = 0; y < height; ++y) { |
- I422ToABGRRow(src_y, src_u, src_v, dst_abgr, &kYuvConstants, width); |
- ARGBCopyYToAlphaRow(src_a, dst_abgr, width); |
- ARGBAttenuateRow(dst_abgr, dst_abgr, width); |
+ I422AlphaToABGRRow(src_y, src_u, src_v, src_a, dst_abgr, &kYuvConstants, width); |
+ if (attenuate) { |
+ ARGBAttenuateRow(dst_abgr, dst_abgr, width); |
+ } |
dst_abgr += dst_stride_abgr; |
src_a += src_stride_a; |
src_y += src_stride_y; |