| 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;
|
| }
|
|
|