Index: source/libvpx/third_party/libyuv/source/convert_from_argb.cc |
diff --git a/source/libvpx/third_party/libyuv/source/convert_from_argb.cc b/source/libvpx/third_party/libyuv/source/convert_from_argb.cc |
index dc2186a6a0843ec857a0a3d120666124d30daa58..8d1e97aec245cb598551f87d1bde25f37b44ad38 100644 |
--- a/source/libvpx/third_party/libyuv/source/convert_from_argb.cc |
+++ b/source/libvpx/third_party/libyuv/source/convert_from_argb.cc |
@@ -72,7 +72,14 @@ int ARGBToI444(const uint8* src_argb, int src_stride_argb, |
ARGBToYRow = ARGBToYRow_SSSE3; |
} |
} |
- |
+#endif |
+#if defined(HAS_ARGBTOYROW_AVX2) |
+ if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToYRow = ARGBToYRow_Any_AVX2; |
+ if (IS_ALIGNED(width, 32)) { |
+ ARGBToYRow = ARGBToYRow_AVX2; |
+ } |
+ } |
#endif |
#if defined(HAS_ARGBTOYROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
@@ -139,7 +146,6 @@ int ARGBToI422(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
- |
#if defined(HAS_ARGBTOYROW_SSSE3) |
if (TestCpuFlag(kCpuHasSSSE3)) { |
ARGBToYRow = ARGBToYRow_Any_SSSE3; |
@@ -148,6 +154,14 @@ int ARGBToI422(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
+#if defined(HAS_ARGBTOYROW_AVX2) |
+ if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToYRow = ARGBToYRow_Any_AVX2; |
+ if (IS_ALIGNED(width, 32)) { |
+ ARGBToYRow = ARGBToYRow_AVX2; |
+ } |
+ } |
+#endif |
#if defined(HAS_ARGBTOYROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
ARGBToYRow = ARGBToYRow_Any_NEON; |
@@ -275,6 +289,16 @@ int ARGBToNV12(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
+#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; |
+ } |
+ } |
+#endif |
#if defined(HAS_ARGBTOYROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
ARGBToYRow = ARGBToYRow_Any_NEON; |
@@ -317,8 +341,8 @@ int ARGBToNV12(const uint8* src_argb, int src_stride_argb, |
#endif |
{ |
// Allocate a rows of uv. |
- align_buffer_64(row_u, ((halfwidth + 15) & ~15) * 2); |
- uint8* row_v = row_u + ((halfwidth + 15) & ~15); |
+ align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2); |
+ uint8* row_v = row_u + ((halfwidth + 31) & ~31); |
for (y = 0; y < height - 1; y += 2) { |
ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width); |
@@ -374,6 +398,16 @@ int ARGBToNV21(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
+#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; |
+ } |
+ } |
+#endif |
#if defined(HAS_ARGBTOYROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
ARGBToYRow = ARGBToYRow_Any_NEON; |
@@ -416,8 +450,8 @@ int ARGBToNV21(const uint8* src_argb, int src_stride_argb, |
#endif |
{ |
// Allocate a rows of uv. |
- align_buffer_64(row_u, ((halfwidth + 15) & ~15) * 2); |
- uint8* row_v = row_u + ((halfwidth + 15) & ~15); |
+ align_buffer_64(row_u, ((halfwidth + 31) & ~31) * 2); |
+ uint8* row_v = row_u + ((halfwidth + 31) & ~31); |
for (y = 0; y < height - 1; y += 2) { |
ARGBToUVRow(src_argb, src_stride_argb, row_u, row_v, width); |
@@ -492,6 +526,14 @@ int ARGBToYUY2(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
+#if defined(HAS_ARGBTOYROW_AVX2) |
+ if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToYRow = ARGBToYRow_Any_AVX2; |
+ if (IS_ALIGNED(width, 32)) { |
+ ARGBToYRow = ARGBToYRow_AVX2; |
+ } |
+ } |
+#endif |
#if defined(HAS_ARGBTOYROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
ARGBToYRow = ARGBToYRow_Any_NEON; |
@@ -591,6 +633,14 @@ int ARGBToUYVY(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
+#if defined(HAS_ARGBTOYROW_AVX2) |
+ if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToYRow = ARGBToYRow_Any_AVX2; |
+ if (IS_ALIGNED(width, 32)) { |
+ ARGBToYRow = ARGBToYRow_AVX2; |
+ } |
+ } |
+#endif |
#if defined(HAS_ARGBTOYROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
ARGBToYRow = ARGBToYRow_Any_NEON; |
@@ -804,25 +854,22 @@ int ARGBToRAW(const uint8* src_argb, int src_stride_argb, |
return 0; |
} |
-static const uint8 kDither8x8[64] = { |
- 0, 128, 32, 160, 8, 136, 40, 168, |
- 192, 64, 224, 96, 200, 72, 232, 104, |
- 48, 176, 16, 144, 56, 184, 24, 152, |
- 240, 112, 208, 80, 248, 120, 216, 88, |
- 12, 140, 44, 172, 4, 132, 36, 164, |
- 204, 76, 236, 108, 196, 68, 228, 100, |
- 60, 188, 28, 156, 52, 180, 20, 148, |
- 252, 124, 220, 92, 244, 116, 212, 84, |
+// Ordered 8x8 dither for 888 to 565. Values from 0 to 7. |
+static const uint8 kDither565_4x4[16] = { |
+ 0, 4, 1, 5, |
+ 6, 2, 7, 3, |
+ 1, 5, 0, 4, |
+ 7, 3, 6, 2, |
}; |
-// Convert ARGB To RGB565 with 8x8 dither matrix (64 bytes). |
+// Convert ARGB To RGB565 with 4x4 dither matrix (16 bytes). |
LIBYUV_API |
int ARGBToRGB565Dither(const uint8* src_argb, int src_stride_argb, |
uint8* dst_rgb565, int dst_stride_rgb565, |
- const uint8* dither8x8, int width, int height) { |
+ const uint8* dither4x4, int width, int height) { |
int y; |
void (*ARGBToRGB565DitherRow)(const uint8* src_argb, uint8* dst_rgb, |
- const uint8* dither8x8, int pix) = ARGBToRGB565DitherRow_C; |
+ const uint32 dither4, int pix) = ARGBToRGB565DitherRow_C; |
if (!src_argb || !dst_rgb565 || width <= 0 || height == 0) { |
return -1; |
} |
@@ -831,13 +878,36 @@ int ARGBToRGB565Dither(const uint8* src_argb, int src_stride_argb, |
src_argb = src_argb + (height - 1) * src_stride_argb; |
src_stride_argb = -src_stride_argb; |
} |
- if (!dither8x8) { |
- dither8x8 = kDither8x8; |
- |
+ if (!dither4x4) { |
+ dither4x4 = kDither565_4x4; |
+ } |
+#if defined(HAS_ARGBTORGB565DITHERROW_SSE2) |
+ if (TestCpuFlag(kCpuHasSSE2)) { |
+ ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_SSE2; |
+ if (IS_ALIGNED(width, 4)) { |
+ ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_SSE2; |
+ } |
+ } |
+#endif |
+#if defined(HAS_ARGBTORGB565DITHERROW_AVX2) |
+ if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_AVX2; |
+ if (IS_ALIGNED(width, 8)) { |
+ ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_AVX2; |
+ } |
} |
+#endif |
+#if defined(HAS_ARGBTORGB565DITHERROW_NEON) |
+ if (TestCpuFlag(kCpuHasNEON)) { |
+ ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_NEON; |
+ if (IS_ALIGNED(width, 8)) { |
+ ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_NEON; |
+ } |
+ } |
+#endif |
for (y = 0; y < height; ++y) { |
ARGBToRGB565DitherRow(src_argb, dst_rgb565, |
- dither8x8 + ((y & 7) << 3), width); |
+ *(uint32*)(dither4x4 + ((y & 3) << 2)), width); |
src_argb += src_stride_argb; |
dst_rgb565 += dst_stride_rgb565; |
} |
@@ -845,6 +915,7 @@ int ARGBToRGB565Dither(const uint8* src_argb, int src_stride_argb, |
} |
// Convert ARGB To RGB565. |
+// TODO(fbarchard): Consider using dither function low level with zeros. |
LIBYUV_API |
int ARGBToRGB565(const uint8* src_argb, int src_stride_argb, |
uint8* dst_rgb565, int dst_stride_rgb565, |
@@ -1021,7 +1092,7 @@ int ARGBToJ420(const uint8* src_argb, int src_stride_argb, |
int width, int height) { |
int y; |
void (*ARGBToUVJRow)(const uint8* src_argb0, int src_stride_argb, |
- uint8* dst_u, uint8* dst_v, int width) = ARGBToUVJRow_C; |
+ uint8* dst_u, uint8* dst_v, int width) = ARGBToUVJRow_C; |
void (*ARGBToYJRow)(const uint8* src_argb, uint8* dst_yj, int pix) = |
ARGBToYJRow_C; |
if (!src_argb || |
@@ -1045,7 +1116,7 @@ int ARGBToJ420(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
-#if defined(HAS_ARGBTOYJROW_AVX2) && defined(HAS_ARGBTOUVJROW_AVX2) |
+#if defined(HAS_ARGBTOYJROW_AVX2) |
if (TestCpuFlag(kCpuHasAVX2)) { |
ARGBToYJRow = ARGBToYJRow_Any_AVX2; |
if (IS_ALIGNED(width, 32)) { |
@@ -1140,6 +1211,14 @@ int ARGBToJ422(const uint8* src_argb, int src_stride_argb, |
} |
} |
#endif |
+#if defined(HAS_ARGBTOYJROW_AVX2) |
+ if (TestCpuFlag(kCpuHasAVX2)) { |
+ ARGBToYJRow = ARGBToYJRow_Any_AVX2; |
+ if (IS_ALIGNED(width, 32)) { |
+ ARGBToYJRow = ARGBToYJRow_AVX2; |
+ } |
+ } |
+#endif |
#if defined(HAS_ARGBTOYJROW_NEON) |
if (TestCpuFlag(kCpuHasNEON)) { |
ARGBToYJRow = ARGBToYJRow_Any_NEON; |