| Index: source/libvpx/third_party/libyuv/source/scale_argb.cc
|
| diff --git a/source/libvpx/third_party/libyuv/source/scale_argb.cc b/source/libvpx/third_party/libyuv/source/scale_argb.cc
|
| index 05b58e1babae1a45a1e5fdccf4ef9e09368f6ea2..40a2d1ab205eb0c5672b8883a2fb0e3122b667d7 100644
|
| --- a/source/libvpx/third_party/libyuv/source/scale_argb.cc
|
| +++ b/source/libvpx/third_party/libyuv/source/scale_argb.cc
|
| @@ -53,16 +53,27 @@ static void ScaleARGBDown2(int src_width, int src_height,
|
| }
|
|
|
| #if defined(HAS_SCALEARGBROWDOWN2_SSE2)
|
| - if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 4)) {
|
| - ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_SSE2 :
|
| - (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_SSE2 :
|
| - ScaleARGBRowDown2Box_SSE2);
|
| + if (TestCpuFlag(kCpuHasSSE2)) {
|
| + ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_Any_SSE2 :
|
| + (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_Any_SSE2 :
|
| + ScaleARGBRowDown2Box_Any_SSE2);
|
| + if (IS_ALIGNED(dst_width, 4)) {
|
| + ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_SSE2 :
|
| + (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_SSE2 :
|
| + ScaleARGBRowDown2Box_SSE2);
|
| + }
|
| }
|
| #endif
|
| #if defined(HAS_SCALEARGBROWDOWN2_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(dst_width, 8)) {
|
| - ScaleARGBRowDown2 = filtering ? ScaleARGBRowDown2Box_NEON :
|
| - ScaleARGBRowDown2_NEON;
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_Any_NEON :
|
| + (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_Any_NEON :
|
| + ScaleARGBRowDown2Box_Any_NEON);
|
| + if (IS_ALIGNED(dst_width, 8)) {
|
| + ScaleARGBRowDown2 = filtering == kFilterNone ? ScaleARGBRowDown2_NEON :
|
| + (filtering == kFilterLinear ? ScaleARGBRowDown2Linear_NEON :
|
| + ScaleARGBRowDown2Box_NEON);
|
| + }
|
| }
|
| #endif
|
|
|
| @@ -86,7 +97,7 @@ static void ScaleARGBDown4Box(int src_width, int src_height,
|
| int x, int dx, int y, int dy) {
|
| int j;
|
| // Allocate 2 rows of ARGB.
|
| - const int kRowSize = (dst_width * 2 * 4 + 15) & ~15;
|
| + const int kRowSize = (dst_width * 2 * 4 + 31) & ~31;
|
| align_buffer_64(row, kRowSize * 2);
|
| int row_stride = src_stride * (dy >> 16);
|
| void (*ScaleARGBRowDown2)(const uint8* src_argb, ptrdiff_t src_stride,
|
| @@ -96,15 +107,22 @@ static void ScaleARGBDown4Box(int src_width, int src_height,
|
| assert(dx == 65536 * 4); // Test scale factor of 4.
|
| assert((dy & 0x3ffff) == 0); // Test vertical scale is multiple of 4.
|
| #if defined(HAS_SCALEARGBROWDOWN2_SSE2)
|
| - if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 4)) {
|
| - ScaleARGBRowDown2 = ScaleARGBRowDown2Box_SSE2;
|
| + if (TestCpuFlag(kCpuHasSSE2)) {
|
| + ScaleARGBRowDown2 = ScaleARGBRowDown2Box_Any_SSE2;
|
| + if (IS_ALIGNED(dst_width, 4)) {
|
| + ScaleARGBRowDown2 = ScaleARGBRowDown2Box_SSE2;
|
| + }
|
| }
|
| #endif
|
| #if defined(HAS_SCALEARGBROWDOWN2_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(dst_width, 8)) {
|
| - ScaleARGBRowDown2 = ScaleARGBRowDown2Box_NEON;
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBRowDown2 = ScaleARGBRowDown2Box_Any_NEON;
|
| + if (IS_ALIGNED(dst_width, 8)) {
|
| + ScaleARGBRowDown2 = ScaleARGBRowDown2Box_NEON;
|
| + }
|
| }
|
| #endif
|
| +
|
| for (j = 0; j < dst_height; ++j) {
|
| ScaleARGBRowDown2(src_argb, src_stride, row, dst_width * 2);
|
| ScaleARGBRowDown2(src_argb + src_stride * 2, src_stride,
|
| @@ -135,15 +153,23 @@ static void ScaleARGBDownEven(int src_width, int src_height,
|
| assert(IS_ALIGNED(src_height, 2));
|
| src_argb += (y >> 16) * src_stride + (x >> 16) * 4;
|
| #if defined(HAS_SCALEARGBROWDOWNEVEN_SSE2)
|
| - if (TestCpuFlag(kCpuHasSSE2) && IS_ALIGNED(dst_width, 4)) {
|
| - ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_SSE2 :
|
| - ScaleARGBRowDownEven_SSE2;
|
| + if (TestCpuFlag(kCpuHasSSE2)) {
|
| + ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_Any_SSE2 :
|
| + ScaleARGBRowDownEven_Any_SSE2;
|
| + if (IS_ALIGNED(dst_width, 4)) {
|
| + ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_SSE2 :
|
| + ScaleARGBRowDownEven_SSE2;
|
| + }
|
| }
|
| #endif
|
| #if defined(HAS_SCALEARGBROWDOWNEVEN_NEON)
|
| - if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(dst_width, 4)) {
|
| - ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_NEON :
|
| - ScaleARGBRowDownEven_NEON;
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_Any_NEON :
|
| + ScaleARGBRowDownEven_Any_NEON;
|
| + if (IS_ALIGNED(dst_width, 4)) {
|
| + ScaleARGBRowDownEven = filtering ? ScaleARGBRowDownEvenBox_NEON :
|
| + ScaleARGBRowDownEven_NEON;
|
| + }
|
| }
|
| #endif
|
|
|
| @@ -230,6 +256,14 @@ static void ScaleARGBBilinearDown(int src_width, int src_height,
|
| ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3;
|
| }
|
| #endif
|
| +#if defined(HAS_SCALEARGBFILTERCOLS_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBFilterCols = ScaleARGBFilterCols_Any_NEON;
|
| + if (IS_ALIGNED(dst_width, 4)) {
|
| + ScaleARGBFilterCols = ScaleARGBFilterCols_NEON;
|
| + }
|
| + }
|
| +#endif
|
| // TODO(fbarchard): Consider not allocating row buffer for kFilterLinear.
|
| // Allocate a row of ARGB.
|
| {
|
| @@ -321,11 +355,27 @@ static void ScaleARGBBilinearUp(int src_width, int src_height,
|
| ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3;
|
| }
|
| #endif
|
| +#if defined(HAS_SCALEARGBFILTERCOLS_NEON)
|
| + if (filtering && TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBFilterCols = ScaleARGBFilterCols_Any_NEON;
|
| + if (IS_ALIGNED(dst_width, 4)) {
|
| + ScaleARGBFilterCols = ScaleARGBFilterCols_NEON;
|
| + }
|
| + }
|
| +#endif
|
| #if defined(HAS_SCALEARGBCOLS_SSE2)
|
| if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
|
| ScaleARGBFilterCols = ScaleARGBCols_SSE2;
|
| }
|
| #endif
|
| +#if defined(HAS_SCALEARGBCOLS_NEON)
|
| + if (!filtering && TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBFilterCols = ScaleARGBCols_Any_NEON;
|
| + if (IS_ALIGNED(dst_width, 8)) {
|
| + ScaleARGBFilterCols = ScaleARGBCols_NEON;
|
| + }
|
| + }
|
| +#endif
|
| if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
|
| ScaleARGBFilterCols = ScaleARGBColsUp2_C;
|
| #if defined(HAS_SCALEARGBCOLSUP2_SSE2)
|
| @@ -344,7 +394,7 @@ static void ScaleARGBBilinearUp(int src_width, int src_height,
|
| const uint8* src = src_argb + yi * src_stride;
|
|
|
| // Allocate 2 rows of ARGB.
|
| - const int kRowSize = (dst_width * 4 + 15) & ~15;
|
| + const int kRowSize = (dst_width * 4 + 31) & ~31;
|
| align_buffer_64(row, kRowSize * 2);
|
|
|
| uint8* rowptr = row;
|
| @@ -495,11 +545,27 @@ static void ScaleYUVToARGBBilinearUp(int src_width, int src_height,
|
| ScaleARGBFilterCols = ScaleARGBFilterCols_SSSE3;
|
| }
|
| #endif
|
| +#if defined(HAS_SCALEARGBFILTERCOLS_NEON)
|
| + if (filtering && TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBFilterCols = ScaleARGBFilterCols_Any_NEON;
|
| + if (IS_ALIGNED(dst_width, 4)) {
|
| + ScaleARGBFilterCols = ScaleARGBFilterCols_NEON;
|
| + }
|
| + }
|
| +#endif
|
| #if defined(HAS_SCALEARGBCOLS_SSE2)
|
| if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
|
| ScaleARGBFilterCols = ScaleARGBCols_SSE2;
|
| }
|
| #endif
|
| +#if defined(HAS_SCALEARGBCOLS_NEON)
|
| + if (!filtering && TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBFilterCols = ScaleARGBCols_Any_NEON;
|
| + if (IS_ALIGNED(dst_width, 8)) {
|
| + ScaleARGBFilterCols = ScaleARGBCols_NEON;
|
| + }
|
| + }
|
| +#endif
|
| if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
|
| ScaleARGBFilterCols = ScaleARGBColsUp2_C;
|
| #if defined(HAS_SCALEARGBCOLSUP2_SSE2)
|
| @@ -521,7 +587,7 @@ static void ScaleYUVToARGBBilinearUp(int src_width, int src_height,
|
| const uint8* src_row_v = src_v + uv_yi * src_stride_v;
|
|
|
| // Allocate 2 rows of ARGB.
|
| - const int kRowSize = (dst_width * 4 + 15) & ~15;
|
| + const int kRowSize = (dst_width * 4 + 31) & ~31;
|
| align_buffer_64(row, kRowSize * 2);
|
|
|
| // Allocate 1 row of ARGB for source conversion.
|
| @@ -607,6 +673,14 @@ static void ScaleARGBSimple(int src_width, int src_height,
|
| ScaleARGBCols = ScaleARGBCols_SSE2;
|
| }
|
| #endif
|
| +#if defined(HAS_SCALEARGBCOLS_NEON)
|
| + if (TestCpuFlag(kCpuHasNEON)) {
|
| + ScaleARGBCols = ScaleARGBCols_Any_NEON;
|
| + if (IS_ALIGNED(dst_width, 8)) {
|
| + ScaleARGBCols = ScaleARGBCols_NEON;
|
| + }
|
| + }
|
| +#endif
|
| if (src_width * 2 == dst_width && x < 0x8000) {
|
| ScaleARGBCols = ScaleARGBColsUp2_C;
|
| #if defined(HAS_SCALEARGBCOLSUP2_SSE2)
|
| @@ -744,6 +818,7 @@ int ARGBScaleClip(const uint8* src_argb, int src_stride_argb,
|
| if (!src_argb || src_width == 0 || src_height == 0 ||
|
| !dst_argb || dst_width <= 0 || dst_height <= 0 ||
|
| clip_x < 0 || clip_y < 0 ||
|
| + clip_width > 32768 || clip_height > 32768 ||
|
| (clip_x + clip_width) > dst_width ||
|
| (clip_y + clip_height) > dst_height) {
|
| return -1;
|
| @@ -762,6 +837,7 @@ int ARGBScale(const uint8* src_argb, int src_stride_argb,
|
| int dst_width, int dst_height,
|
| enum FilterMode filtering) {
|
| if (!src_argb || src_width == 0 || src_height == 0 ||
|
| + src_width > 32768 || src_height > 32768 ||
|
| !dst_argb || dst_width <= 0 || dst_height <= 0) {
|
| return -1;
|
| }
|
|
|