Index: source/convert_from_argb.cc |
diff --git a/source/convert_from_argb.cc b/source/convert_from_argb.cc |
index 6796343c0fbbb5402d6b4fd5a33e00c0b706dfd1..2a8682b7eb42f17642d27ea5ff1cfd7759d4ddae 100644 |
--- a/source/convert_from_argb.cc |
+++ b/source/convert_from_argb.cc |
@@ -109,13 +109,16 @@ int ARGBToI422(const uint8* src_argb, int src_stride_argb, |
uint8* dst_v, int dst_stride_v, |
int width, int height) { |
int y; |
- void (*ARGBToUV422Row)(const uint8* src_argb, uint8* dst_u, uint8* dst_v, |
- int width) = ARGBToUV422Row_C; |
+ void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb, |
+ uint8* dst_u, uint8* dst_v, int width) = ARGBToUVRow_C; |
void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = |
ARGBToYRow_C; |
- if (!src_argb || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) { |
+ if (!src_argb || |
+ !dst_y || !dst_u || !dst_v || |
+ width <= 0 || height == 0) { |
return -1; |
} |
+ // Negative height means invert the image. |
if (height < 0) { |
height = -height; |
src_argb = src_argb + (height - 1) * src_stride_argb; |
@@ -130,34 +133,22 @@ int ARGBToI422(const uint8* src_argb, int src_stride_argb, |
height = 1; |
src_stride_argb = dst_stride_y = dst_stride_u = dst_stride_v = 0; |
} |
-#if defined(HAS_ARGBTOUV422ROW_SSSE3) |
- if (TestCpuFlag(kCpuHasSSSE3)) { |
- ARGBToUV422Row = ARGBToUV422Row_Any_SSSE3; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBToUV422Row = ARGBToUV422Row_SSSE3; |
- } |
- } |
-#endif |
-#if defined(HAS_ARGBTOUV422ROW_NEON) |
- if (TestCpuFlag(kCpuHasNEON)) { |
- ARGBToUV422Row = ARGBToUV422Row_Any_NEON; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBToUV422Row = ARGBToUV422Row_NEON; |
- } |
- } |
-#endif |
-#if defined(HAS_ARGBTOYROW_SSSE3) |
+#if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
if (TestCpuFlag(kCpuHasSSSE3)) { |
+ ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
ARGBToYRow = ARGBToYRow_Any_SSSE3; |
if (IS_ALIGNED(width, 16)) { |
+ ARGBToUVRow = ARGBToUVRow_SSSE3; |
ARGBToYRow = ARGBToYRow_SSSE3; |
} |
} |
#endif |
-#if defined(HAS_ARGBTOYROW_AVX2) |
+#if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
ARGBToYRow = ARGBToYRow_Any_AVX2; |
if (IS_ALIGNED(width, 32)) { |
+ ARGBToUVRow = ARGBToUVRow_AVX2; |
ARGBToYRow = ARGBToYRow_AVX2; |
} |
} |
@@ -170,9 +161,17 @@ int ARGBToI422(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
+#if defined(HAS_ARGBTOUVROW_NEON) |
+ if (TestCpuFlag(kCpuHasNEON)) { |
+ ARGBToUVRow = ARGBToUVRow_Any_NEON; |
+ if (IS_ALIGNED(width, 16)) { |
+ ARGBToUVRow = ARGBToUVRow_NEON; |
+ } |
+ } |
+#endif |
for (y = 0; y < height; ++y) { |
- ARGBToUV422Row(src_argb, dst_u, dst_v, width); |
+ ARGBToUVRow(src_argb, 0, dst_u, dst_v, width); |
ARGBToYRow(src_argb, dst_y, width); |
src_argb += src_stride_argb; |
dst_y += dst_stride_y; |
@@ -478,8 +477,8 @@ int ARGBToYUY2(const uint8* src_argb, int src_stride_argb, |
uint8* dst_yuy2, int dst_stride_yuy2, |
int width, int height) { |
int y; |
- void (*ARGBToUV422Row)(const uint8* src_argb, uint8* dst_u, uint8* dst_v, |
- int width) = ARGBToUV422Row_C; |
+ void (*ARGBToUVRow)(const uint8* src_argb, int src_stride_argb, |
+ uint8* dst_u, uint8* dst_v, int width) = ARGBToUVRow_C; |
void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = |
ARGBToYRow_C; |
void (*I422ToYUY2Row)(const uint8* src_y, const uint8* src_u, |
@@ -502,34 +501,22 @@ int ARGBToYUY2(const uint8* src_argb, int src_stride_argb, |
height = 1; |
src_stride_argb = dst_stride_yuy2 = 0; |
} |
-#if defined(HAS_ARGBTOUV422ROW_SSSE3) |
- if (TestCpuFlag(kCpuHasSSSE3)) { |
- ARGBToUV422Row = ARGBToUV422Row_Any_SSSE3; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBToUV422Row = ARGBToUV422Row_SSSE3; |
- } |
- } |
-#endif |
-#if defined(HAS_ARGBTOUV422ROW_NEON) |
- if (TestCpuFlag(kCpuHasNEON)) { |
- ARGBToUV422Row = ARGBToUV422Row_Any_NEON; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBToUV422Row = ARGBToUV422Row_NEON; |
- } |
- } |
-#endif |
-#if defined(HAS_ARGBTOYROW_SSSE3) |
+#if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
if (TestCpuFlag(kCpuHasSSSE3)) { |
+ ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
ARGBToYRow = ARGBToYRow_Any_SSSE3; |
if (IS_ALIGNED(width, 16)) { |
+ ARGBToUVRow = ARGBToUVRow_SSSE3; |
ARGBToYRow = ARGBToYRow_SSSE3; |
} |
} |
#endif |
-#if defined(HAS_ARGBTOYROW_AVX2) |
+#if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
ARGBToYRow = ARGBToYRow_Any_AVX2; |
if (IS_ALIGNED(width, 32)) { |
+ ARGBToUVRow = ARGBToUVRow_AVX2; |
ARGBToYRow = ARGBToYRow_AVX2; |
} |
} |
@@ -542,7 +529,14 @@ int ARGBToYUY2(const uint8* src_argb, int src_stride_argb, |
} |
} |
#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_I422TOYUY2ROW_SSE2) |
if (TestCpuFlag(kCpuHasSSE2)) { |
I422ToYUY2Row = I422ToYUY2Row_Any_SSE2; |
@@ -567,7 +561,7 @@ int ARGBToYUY2(const uint8* src_argb, int src_stride_argb, |
uint8* row_v = row_u + ((width + 63) & ~63) / 2; |
for (y = 0; y < height; ++y) { |
- ARGBToUV422Row(src_argb, row_u, row_v, width); |
+ ARGBToUVRow(src_argb, 0, row_u, row_v, width); |
ARGBToYRow(src_argb, row_y, width); |
I422ToYUY2Row(row_y, row_u, row_v, dst_yuy2, width); |
src_argb += src_stride_argb; |
@@ -585,8 +579,8 @@ int ARGBToUYVY(const uint8* src_argb, int src_stride_argb, |
uint8* dst_uyvy, int dst_stride_uyvy, |
int width, int height) { |
int y; |
- void (*ARGBToUV422Row)(const uint8* src_argb, uint8* dst_u, uint8* dst_v, |
- int width) = ARGBToUV422Row_C; |
+ void (*ARGBToUVRow)(const uint8* src_argb, int src_stride_argb, |
+ uint8* dst_u, uint8* dst_v, int width) = ARGBToUVRow_C; |
void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int width) = |
ARGBToYRow_C; |
void (*I422ToUYVYRow)(const uint8* src_y, const uint8* src_u, |
@@ -609,34 +603,22 @@ int ARGBToUYVY(const uint8* src_argb, int src_stride_argb, |
height = 1; |
src_stride_argb = dst_stride_uyvy = 0; |
} |
-#if defined(HAS_ARGBTOUV422ROW_SSSE3) |
- if (TestCpuFlag(kCpuHasSSSE3)) { |
- ARGBToUV422Row = ARGBToUV422Row_Any_SSSE3; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBToUV422Row = ARGBToUV422Row_SSSE3; |
- } |
- } |
-#endif |
-#if defined(HAS_ARGBTOUV422ROW_NEON) |
- if (TestCpuFlag(kCpuHasNEON)) { |
- ARGBToUV422Row = ARGBToUV422Row_Any_NEON; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBToUV422Row = ARGBToUV422Row_NEON; |
- } |
- } |
-#endif |
-#if defined(HAS_ARGBTOYROW_SSSE3) |
+#if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) |
if (TestCpuFlag(kCpuHasSSSE3)) { |
+ ARGBToUVRow = ARGBToUVRow_Any_SSSE3; |
ARGBToYRow = ARGBToYRow_Any_SSSE3; |
if (IS_ALIGNED(width, 16)) { |
+ ARGBToUVRow = ARGBToUVRow_SSSE3; |
ARGBToYRow = ARGBToYRow_SSSE3; |
} |
} |
#endif |
-#if defined(HAS_ARGBTOYROW_AVX2) |
+#if defined(HAS_ARGBTOYROW_AVX2) && defined(HAS_ARGBTOUVROW_AVX2) |
if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToUVRow = ARGBToUVRow_Any_AVX2; |
ARGBToYRow = ARGBToYRow_Any_AVX2; |
if (IS_ALIGNED(width, 32)) { |
+ ARGBToUVRow = ARGBToUVRow_AVX2; |
ARGBToYRow = ARGBToYRow_AVX2; |
} |
} |
@@ -649,7 +631,14 @@ int ARGBToUYVY(const uint8* src_argb, int src_stride_argb, |
} |
} |
#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_I422TOUYVYROW_SSE2) |
if (TestCpuFlag(kCpuHasSSE2)) { |
I422ToUYVYRow = I422ToUYVYRow_Any_SSE2; |
@@ -674,7 +663,7 @@ int ARGBToUYVY(const uint8* src_argb, int src_stride_argb, |
uint8* row_v = row_u + ((width + 63) & ~63) / 2; |
for (y = 0; y < height; ++y) { |
- ARGBToUV422Row(src_argb, row_u, row_v, width); |
+ ARGBToUVRow(src_argb, 0, row_u, row_v, width); |
ARGBToYRow(src_argb, row_y, width); |
I422ToUYVYRow(row_y, row_u, row_v, dst_uyvy, width); |
src_argb += src_stride_argb; |
@@ -1157,21 +1146,24 @@ int ARGBToJ420(const uint8* src_argb, int src_stride_argb, |
return 0; |
} |
-// ARGB little endian (bgra in memory) to J422 |
+// Convert ARGB to J422. (JPeg full range I422). |
LIBYUV_API |
int ARGBToJ422(const uint8* src_argb, int src_stride_argb, |
- uint8* dst_y, int dst_stride_y, |
+ uint8* dst_yj, int dst_stride_yj, |
uint8* dst_u, int dst_stride_u, |
uint8* dst_v, int dst_stride_v, |
int width, int height) { |
int y; |
- void (*ARGBToUVJ422Row)(const uint8* src_argb, uint8* dst_u, uint8* dst_v, |
- int width) = ARGBToUVJ422Row_C; |
- void (*ARGBToYJRow)(const uint8* src_argb, uint8* dst_y, int width) = |
+ void (*ARGBToUVJRow)(const uint8* src_argb0, int src_stride_argb, |
+ uint8* dst_u, uint8* dst_v, int width) = ARGBToUVJRow_C; |
+ void (*ARGBToYJRow)(const uint8* src_argb, uint8* dst_yj, int width) = |
ARGBToYJRow_C; |
- if (!src_argb || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) { |
+ if (!src_argb || |
+ !dst_yj || !dst_u || !dst_v || |
+ width <= 0 || height == 0) { |
return -1; |
} |
+ // Negative height means invert the image. |
if (height < 0) { |
height = -height; |
src_argb = src_argb + (height - 1) * src_stride_argb; |
@@ -1179,34 +1171,19 @@ int ARGBToJ422(const uint8* src_argb, int src_stride_argb, |
} |
// Coalesce rows. |
if (src_stride_argb == width * 4 && |
- dst_stride_y == width && |
+ dst_stride_yj == width && |
dst_stride_u * 2 == width && |
dst_stride_v * 2 == width) { |
width *= height; |
height = 1; |
- src_stride_argb = dst_stride_y = dst_stride_u = dst_stride_v = 0; |
- } |
-#if defined(HAS_ARGBTOUVJ422ROW_SSSE3) |
- if (TestCpuFlag(kCpuHasSSSE3)) { |
- ARGBToUVJ422Row = ARGBToUVJ422Row_Any_SSSE3; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBToUVJ422Row = ARGBToUVJ422Row_SSSE3; |
- } |
+ src_stride_argb = dst_stride_yj = dst_stride_u = dst_stride_v = 0; |
} |
-#endif |
-#if defined(HAS_ARGBTOUVJ422ROW_NEON) |
- if (TestCpuFlag(kCpuHasNEON)) { |
- ARGBToUVJ422Row = ARGBToUVJ422Row_Any_NEON; |
- if (IS_ALIGNED(width, 16)) { |
- ARGBToUVJ422Row = ARGBToUVJ422Row_NEON; |
- } |
- } |
-#endif |
- |
-#if defined(HAS_ARGBTOYJROW_SSSE3) |
+#if defined(HAS_ARGBTOYJROW_SSSE3) && defined(HAS_ARGBTOUVJROW_SSSE3) |
if (TestCpuFlag(kCpuHasSSSE3)) { |
+ ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3; |
ARGBToYJRow = ARGBToYJRow_Any_SSSE3; |
if (IS_ALIGNED(width, 16)) { |
+ ARGBToUVJRow = ARGBToUVJRow_SSSE3; |
ARGBToYJRow = ARGBToYJRow_SSSE3; |
} |
} |
@@ -1227,12 +1204,20 @@ int ARGBToJ422(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
+#if defined(HAS_ARGBTOUVJROW_NEON) |
+ if (TestCpuFlag(kCpuHasNEON)) { |
+ ARGBToUVJRow = ARGBToUVJRow_Any_NEON; |
+ if (IS_ALIGNED(width, 16)) { |
+ ARGBToUVJRow = ARGBToUVJRow_NEON; |
+ } |
+ } |
+#endif |
for (y = 0; y < height; ++y) { |
- ARGBToUVJ422Row(src_argb, dst_u, dst_v, width); |
- ARGBToYJRow(src_argb, dst_y, width); |
+ ARGBToUVJRow(src_argb, 0, dst_u, dst_v, width); |
+ ARGBToYJRow(src_argb, dst_yj, width); |
src_argb += src_stride_argb; |
- dst_y += dst_stride_y; |
+ dst_yj += dst_stride_yj; |
dst_u += dst_stride_u; |
dst_v += dst_stride_v; |
} |