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