| Index: source/scale_any.cc
|
| diff --git a/source/scale_any.cc b/source/scale_any.cc
|
| index 1da4dacde7596642d4be57f4225576282f773a97..ed76a9e4c0417da6b9cf8dd33a1d886f574eef1e 100644
|
| --- a/source/scale_any.cc
|
| +++ b/source/scale_any.cc
|
| @@ -55,12 +55,29 @@ CANY(ScaleARGBFilterCols_Any_NEON, ScaleARGBFilterCols_NEON,
|
| dst_ptr + n * BPP, r); \
|
| }
|
|
|
| +// Fixed scale down for odd source width. Used by I420Blend subsampling.
|
| +// Since dst_width is (width + 1) / 2, this function scales one less pixel
|
| +// and copies the last pixel.
|
| +#define SDODD(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, FACTOR, BPP, MASK) \
|
| + void NAMEANY(const uint8* src_ptr, ptrdiff_t src_stride, \
|
| + uint8* dst_ptr, int dst_width) { \
|
| + int r = (int)((unsigned int)(dst_width - 1) % (MASK + 1)); \
|
| + int n = dst_width - r; \
|
| + if (n > 0) { \
|
| + SCALEROWDOWN_SIMD(src_ptr, src_stride, dst_ptr, n); \
|
| + } \
|
| + SCALEROWDOWN_C(src_ptr + (n * FACTOR) * BPP, src_stride, \
|
| + dst_ptr + n * BPP, r); \
|
| + }
|
| +
|
| #ifdef HAS_SCALEROWDOWN2_SSSE3
|
| SDANY(ScaleRowDown2_Any_SSSE3, ScaleRowDown2_SSSE3, ScaleRowDown2_C, 2, 1, 15)
|
| SDANY(ScaleRowDown2Linear_Any_SSSE3, ScaleRowDown2Linear_SSSE3,
|
| ScaleRowDown2Linear_C, 2, 1, 15)
|
| SDANY(ScaleRowDown2Box_Any_SSSE3, ScaleRowDown2Box_SSSE3, ScaleRowDown2Box_C,
|
| 2, 1, 15)
|
| +SDODD(ScaleRowDown2Box_Odd_SSSE3, ScaleRowDown2Box_SSSE3,
|
| + ScaleRowDown2Box_Odd_C, 2, 1, 15)
|
| #endif
|
| #ifdef HAS_SCALEROWDOWN2_AVX2
|
| SDANY(ScaleRowDown2_Any_AVX2, ScaleRowDown2_AVX2, ScaleRowDown2_C, 2, 1, 31)
|
| @@ -68,6 +85,8 @@ SDANY(ScaleRowDown2Linear_Any_AVX2, ScaleRowDown2Linear_AVX2,
|
| ScaleRowDown2Linear_C, 2, 1, 31)
|
| SDANY(ScaleRowDown2Box_Any_AVX2, ScaleRowDown2Box_AVX2, ScaleRowDown2Box_C,
|
| 2, 1, 31)
|
| +SDODD(ScaleRowDown2Box_Odd_AVX2, ScaleRowDown2Box_AVX2, ScaleRowDown2Box_Odd_C,
|
| + 2, 1, 31)
|
| #endif
|
| #ifdef HAS_SCALEROWDOWN2_NEON
|
| SDANY(ScaleRowDown2_Any_NEON, ScaleRowDown2_NEON, ScaleRowDown2_C, 2, 1, 15)
|
| @@ -75,6 +94,8 @@ SDANY(ScaleRowDown2Linear_Any_NEON, ScaleRowDown2Linear_NEON,
|
| ScaleRowDown2Linear_C, 2, 1, 15)
|
| SDANY(ScaleRowDown2Box_Any_NEON, ScaleRowDown2Box_NEON,
|
| ScaleRowDown2Box_C, 2, 1, 15)
|
| +SDODD(ScaleRowDown2Box_Odd_NEON, ScaleRowDown2Box_NEON,
|
| + ScaleRowDown2Box_Odd_C, 2, 1, 15)
|
| #endif
|
| #ifdef HAS_SCALEROWDOWN4_SSSE3
|
| SDANY(ScaleRowDown4_Any_SSSE3, ScaleRowDown4_SSSE3, ScaleRowDown4_C, 4, 1, 7)
|
|
|