1f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang/*
2f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang *  Copyright 2015 The LibYuv Project Authors. All rights reserved.
3f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang *
4f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang *  Use of this source code is governed by a BSD-style license
5f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang *  that can be found in the LICENSE file in the root of the source
6f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang *  tree. An additional intellectual property rights grant can be found
7f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang *  in the file PATENTS. All contributing project authors may
8f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang *  be found in the AUTHORS file in the root of the source tree.
9f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang */
10f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
11f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#include "libyuv/scale.h"
12f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#include "libyuv/scale_row.h"
13f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
14f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#include "libyuv/basic_types.h"
15f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
16f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef __cplusplus
17f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangnamespace libyuv {
18f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuangextern "C" {
19f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
20f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
21f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// Definition for ScaleFilterCols, ScaleARGBCols and ScaleARGBFilterCols
22b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#define CANY(NAMEANY, TERP_SIMD, TERP_C, BPP, MASK)                        \
23b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  void NAMEANY(uint8* dst_ptr, const uint8* src_ptr, int dst_width, int x, \
24b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard               int dx) {                                                   \
25b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    int n = dst_width & ~MASK;                                             \
26b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    if (n > 0) {                                                           \
27b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      TERP_SIMD(dst_ptr, src_ptr, n, x, dx);                               \
28b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    }                                                                      \
29b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    TERP_C(dst_ptr + n * BPP, src_ptr, dst_width & MASK, x + n * dx, dx);  \
30b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  }
31f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
32f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEFILTERCOLS_NEON
33f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangCANY(ScaleFilterCols_Any_NEON, ScaleFilterCols_NEON, ScaleFilterCols_C, 1, 7)
34f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
35f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEARGBCOLS_NEON
36f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangCANY(ScaleARGBCols_Any_NEON, ScaleARGBCols_NEON, ScaleARGBCols_C, 4, 7)
37f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
38f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEARGBFILTERCOLS_NEON
39b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardCANY(ScaleARGBFilterCols_Any_NEON,
40b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard     ScaleARGBFilterCols_NEON,
41b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard     ScaleARGBFilterCols_C,
42b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard     4,
43b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard     3)
44f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
45f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#undef CANY
46f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
47f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// Fixed scale down.
48b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#define SDANY(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, FACTOR, BPP, MASK) \
49b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  void NAMEANY(const uint8* src_ptr, ptrdiff_t src_stride, uint8* dst_ptr,   \
50b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard               int dst_width) {                                              \
51b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    int r = (int)((unsigned int)dst_width % (MASK + 1));                     \
52b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    int n = dst_width - r;                                                   \
53b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    if (n > 0) {                                                             \
54b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      SCALEROWDOWN_SIMD(src_ptr, src_stride, dst_ptr, n);                    \
55b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    }                                                                        \
56b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    SCALEROWDOWN_C(src_ptr + (n * FACTOR) * BPP, src_stride,                 \
57b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard                   dst_ptr + n * BPP, r);                                    \
58b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  }
59f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
60f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// Fixed scale down for odd source width.  Used by I420Blend subsampling.
61f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// Since dst_width is (width + 1) / 2, this function scales one less pixel
62f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// and copies the last pixel.
63b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#define SDODD(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, FACTOR, BPP, MASK) \
64b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  void NAMEANY(const uint8* src_ptr, ptrdiff_t src_stride, uint8* dst_ptr,   \
65b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard               int dst_width) {                                              \
66b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    int r = (int)((unsigned int)(dst_width - 1) % (MASK + 1));               \
67b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    int n = dst_width - r;                                                   \
68b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    if (n > 0) {                                                             \
69b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      SCALEROWDOWN_SIMD(src_ptr, src_stride, dst_ptr, n);                    \
70b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    }                                                                        \
71b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    SCALEROWDOWN_C(src_ptr + (n * FACTOR) * BPP, src_stride,                 \
72b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard                   dst_ptr + n * BPP, r);                                    \
73b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  }
74f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
75f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN2_SSSE3
76f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSDANY(ScaleRowDown2_Any_SSSE3, ScaleRowDown2_SSSE3, ScaleRowDown2_C, 2, 1, 15)
77b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2Linear_Any_SSSE3,
78b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Linear_SSSE3,
79b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Linear_C,
80b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
81b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
82b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      15)
83b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2Box_Any_SSSE3,
84b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_SSSE3,
85b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_C,
86b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
87b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
88b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      15)
89b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDODD(ScaleRowDown2Box_Odd_SSSE3,
90b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_SSSE3,
91b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_Odd_C,
92b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
93b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
94b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      15)
95f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
96f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN2_AVX2
97f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSDANY(ScaleRowDown2_Any_AVX2, ScaleRowDown2_AVX2, ScaleRowDown2_C, 2, 1, 31)
98b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2Linear_Any_AVX2,
99b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Linear_AVX2,
100b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Linear_C,
101b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
102b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
103b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      31)
104b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2Box_Any_AVX2,
105b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_AVX2,
106b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_C,
107b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
108b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
109b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      31)
110b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDODD(ScaleRowDown2Box_Odd_AVX2,
111b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_AVX2,
112b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_Odd_C,
113b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
114b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
115b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      31)
116f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
117f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN2_NEON
118f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSDANY(ScaleRowDown2_Any_NEON, ScaleRowDown2_NEON, ScaleRowDown2_C, 2, 1, 15)
119b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2Linear_Any_NEON,
120b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Linear_NEON,
121b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Linear_C,
122b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
123b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
124b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      15)
125b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2Box_Any_NEON,
126b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_NEON,
127b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_C,
128b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
129b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
130b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      15)
131b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDODD(ScaleRowDown2Box_Odd_NEON,
132b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_NEON,
133b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_Odd_C,
134b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
135b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
136b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      15)
137b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#endif
138b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#ifdef HAS_SCALEROWDOWN2_MSA
139b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2_Any_MSA, ScaleRowDown2_MSA, ScaleRowDown2_C, 2, 1, 31)
140b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2Linear_Any_MSA,
141b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Linear_MSA,
142b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Linear_C,
143b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
144b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
145b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      31)
146b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown2Box_Any_MSA,
147b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_MSA,
148b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown2Box_C,
149b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
150b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
151b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      31)
152f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
153f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN4_SSSE3
154f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSDANY(ScaleRowDown4_Any_SSSE3, ScaleRowDown4_SSSE3, ScaleRowDown4_C, 4, 1, 7)
155b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown4Box_Any_SSSE3,
156b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown4Box_SSSE3,
157b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown4Box_C,
158b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
159b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
160b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      7)
161f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
162f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN4_AVX2
163f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSDANY(ScaleRowDown4_Any_AVX2, ScaleRowDown4_AVX2, ScaleRowDown4_C, 4, 1, 15)
164b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown4Box_Any_AVX2,
165b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown4Box_AVX2,
166b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown4Box_C,
167b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
168b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
169b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      15)
170f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
171f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN4_NEON
172f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSDANY(ScaleRowDown4_Any_NEON, ScaleRowDown4_NEON, ScaleRowDown4_C, 4, 1, 7)
173b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown4Box_Any_NEON,
174b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown4Box_NEON,
175b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown4Box_C,
176b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
177b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
178b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      7)
179b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#endif
180b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#ifdef HAS_SCALEROWDOWN4_MSA
181b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown4_Any_MSA, ScaleRowDown4_MSA, ScaleRowDown4_C, 4, 1, 15)
182b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown4Box_Any_MSA,
183b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown4Box_MSA,
184b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown4Box_C,
185b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
186b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
187b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      15)
188f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
189f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN34_SSSE3
190b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown34_Any_SSSE3,
191b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_SSSE3,
192b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_C,
193b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4 / 3,
194b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
195b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      23)
196b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown34_0_Box_Any_SSSE3,
197b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_0_Box_SSSE3,
198b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_0_Box_C,
199b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4 / 3,
200b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
201b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      23)
202b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown34_1_Box_Any_SSSE3,
203b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_1_Box_SSSE3,
204b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_1_Box_C,
205b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4 / 3,
206b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
207b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      23)
208f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
209f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN34_NEON
210b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown34_Any_NEON,
211b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_NEON,
212b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_C,
213b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4 / 3,
214b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
215b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      23)
216b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown34_0_Box_Any_NEON,
217b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_0_Box_NEON,
218b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_0_Box_C,
219b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4 / 3,
220b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
221b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      23)
222b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown34_1_Box_Any_NEON,
223b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_1_Box_NEON,
224b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown34_1_Box_C,
225b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4 / 3,
226b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
227b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      23)
228f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
229f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN38_SSSE3
230b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_Any_SSSE3,
231b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_SSSE3,
232b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_C,
233b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
234b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
235b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      11)
236b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_3_Box_Any_SSSE3,
237b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_3_Box_SSSE3,
238b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_3_Box_C,
239b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
240b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
241b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      5)
242b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_2_Box_Any_SSSE3,
243b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_2_Box_SSSE3,
244b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_2_Box_C,
245b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
246b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
247b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      5)
248f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
249f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEROWDOWN38_NEON
250b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_Any_NEON,
251b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_NEON,
252b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_C,
253b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
254b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
255b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      11)
256b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_3_Box_Any_NEON,
257b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_3_Box_NEON,
258b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_3_Box_C,
259b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
260b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
261b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      11)
262b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_2_Box_Any_NEON,
263b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_2_Box_NEON,
264b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_2_Box_C,
265b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
266b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
267b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      11)
268b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#endif
269b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#ifdef HAS_SCALEROWDOWN38_MSA
270b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_Any_MSA,
271b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_MSA,
272b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_C,
273b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
274b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
275b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      11)
276b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_3_Box_Any_MSA,
277b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_3_Box_MSA,
278b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_3_Box_C,
279b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
280b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
281b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      11)
282b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleRowDown38_2_Box_Any_MSA,
283b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_2_Box_MSA,
284b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleRowDown38_2_Box_C,
285b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      8 / 3,
286b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      1,
287b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      11)
288f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
289f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
290f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEARGBROWDOWN2_SSE2
291b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2_Any_SSE2,
292b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2_SSE2,
293b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2_C,
294b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
295b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
296b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      3)
297b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2Linear_Any_SSE2,
298b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Linear_SSE2,
299b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Linear_C,
300b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
301b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
302b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      3)
303b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2Box_Any_SSE2,
304b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Box_SSE2,
305b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Box_C,
306b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
307b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
308b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      3)
309f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
310f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEARGBROWDOWN2_NEON
311b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2_Any_NEON,
312b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2_NEON,
313b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2_C,
314b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
315b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
316b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      7)
317b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2Linear_Any_NEON,
318b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Linear_NEON,
319b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Linear_C,
320b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
321b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
322b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      7)
323b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2Box_Any_NEON,
324b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Box_NEON,
325b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Box_C,
326b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
327b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
328b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      7)
329b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#endif
330b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#ifdef HAS_SCALEARGBROWDOWN2_MSA
331b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2_Any_MSA,
332b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2_MSA,
333b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2_C,
334b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
335b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
336b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      3)
337b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2Linear_Any_MSA,
338b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Linear_MSA,
339b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Linear_C,
340b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
341b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
342b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      3)
343b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDANY(ScaleARGBRowDown2Box_Any_MSA,
344b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Box_MSA,
345b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      ScaleARGBRowDown2Box_C,
346b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      2,
347b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      4,
348b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      3)
349f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
350f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#undef SDANY
351f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
352f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// Scale down by even scale factor.
353b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#define SDAANY(NAMEANY, SCALEROWDOWN_SIMD, SCALEROWDOWN_C, BPP, MASK)      \
354b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  void NAMEANY(const uint8* src_ptr, ptrdiff_t src_stride, int src_stepx,  \
355b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard               uint8* dst_ptr, int dst_width) {                            \
356b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    int r = (int)((unsigned int)dst_width % (MASK + 1));                   \
357b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    int n = dst_width - r;                                                 \
358b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    if (n > 0) {                                                           \
359b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      SCALEROWDOWN_SIMD(src_ptr, src_stride, src_stepx, dst_ptr, n);       \
360b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    }                                                                      \
361b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    SCALEROWDOWN_C(src_ptr + (n * src_stepx) * BPP, src_stride, src_stepx, \
362b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard                   dst_ptr + n * BPP, r);                                  \
363b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  }
364f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
365f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEARGBROWDOWNEVEN_SSE2
366b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDAANY(ScaleARGBRowDownEven_Any_SSE2,
367b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEven_SSE2,
368b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEven_C,
369b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       4,
370b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       3)
371b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDAANY(ScaleARGBRowDownEvenBox_Any_SSE2,
372b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEvenBox_SSE2,
373b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEvenBox_C,
374b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       4,
375b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       3)
376f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
377f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEARGBROWDOWNEVEN_NEON
378b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDAANY(ScaleARGBRowDownEven_Any_NEON,
379b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEven_NEON,
380b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEven_C,
381b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       4,
382b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       3)
383b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDAANY(ScaleARGBRowDownEvenBox_Any_NEON,
384b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEvenBox_NEON,
385b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEvenBox_C,
386b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       4,
387b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       3)
388b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#endif
389b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#ifdef HAS_SCALEARGBROWDOWNEVEN_MSA
390b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDAANY(ScaleARGBRowDownEven_Any_MSA,
391b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEven_MSA,
392b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEven_C,
393b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       4,
394b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       3)
395b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSDAANY(ScaleARGBRowDownEvenBox_Any_MSA,
396b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEvenBox_MSA,
397b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       ScaleARGBRowDownEvenBox_C,
398b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       4,
399b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard       3)
400f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
401f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
402f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang// Add rows box filter scale down.
403b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#define SAANY(NAMEANY, SCALEADDROW_SIMD, SCALEADDROW_C, MASK)          \
404b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  void NAMEANY(const uint8* src_ptr, uint16* dst_ptr, int src_width) { \
405b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    int n = src_width & ~MASK;                                         \
406b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    if (n > 0) {                                                       \
407b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard      SCALEADDROW_SIMD(src_ptr, dst_ptr, n);                           \
408b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    }                                                                  \
409b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard    SCALEADDROW_C(src_ptr + n, dst_ptr + n, src_width & MASK);         \
410b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard  }
411f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
412f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEADDROW_SSE2
413f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSAANY(ScaleAddRow_Any_SSE2, ScaleAddRow_SSE2, ScaleAddRow_C, 15)
414f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
415f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEADDROW_AVX2
416f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSAANY(ScaleAddRow_Any_AVX2, ScaleAddRow_AVX2, ScaleAddRow_C, 31)
417f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
418f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef HAS_SCALEADDROW_NEON
419f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu KuangSAANY(ScaleAddRow_Any_NEON, ScaleAddRow_NEON, ScaleAddRow_C, 15)
420f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
421b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#ifdef HAS_SCALEADDROW_MSA
422b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSAANY(ScaleAddRow_Any_MSA, ScaleAddRow_MSA, ScaleAddRow_C, 15)
423b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#endif
424b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#ifdef HAS_SCALEADDROW_DSPR2
425b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSAANY(ScaleAddRow_Any_DSPR2, ScaleAddRow_DSPR2, ScaleAddRow_C, 15)
426b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#endif
427f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#undef SAANY
428f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang
429f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#ifdef __cplusplus
430f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang}  // extern "C"
431f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang}  // namespace libyuv
432f047e7ca6983218eed7703c7afd51fed7bd3b5c9Hangyu Kuang#endif
433