• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2013 The LibYuv Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS. All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef INCLUDE_LIBYUV_SCALE_ROW_H_
12 #define INCLUDE_LIBYUV_SCALE_ROW_H_
13 
14 #include "libyuv/basic_types.h"
15 #include "libyuv/scale.h"
16 
17 #ifdef __cplusplus
18 namespace libyuv {
19 extern "C" {
20 #endif
21 
22 #if defined(__pnacl__) || defined(__CLR_VER) ||            \
23     (defined(__native_client__) && defined(__x86_64__)) || \
24     (defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
25 #define LIBYUV_DISABLE_X86
26 #endif
27 #if defined(__native_client__)
28 #define LIBYUV_DISABLE_NEON
29 #endif
30 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
31 #if defined(__has_feature)
32 #if __has_feature(memory_sanitizer) && !defined(LIBYUV_DISABLE_NEON)
33 #define LIBYUV_DISABLE_NEON
34 #endif
35 #if __has_feature(memory_sanitizer) && !defined(LIBYUV_DISABLE_X86)
36 #define LIBYUV_DISABLE_X86
37 #endif
38 #endif
39 // GCC >= 4.7.0 required for AVX2.
40 #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
41 #if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7))
42 #define GCC_HAS_AVX2 1
43 #endif  // GNUC >= 4.7
44 #endif  // __GNUC__
45 
46 // clang >= 3.4.0 required for AVX2.
47 #if defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
48 #if (__clang_major__ > 3) || (__clang_major__ == 3 && (__clang_minor__ >= 4))
49 #define CLANG_HAS_AVX2 1
50 #endif  // clang >= 3.4
51 #endif  // __clang__
52 
53 // Visual C 2012 required for AVX2.
54 #if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \
55     _MSC_VER >= 1700
56 #define VISUALC_HAS_AVX2 1
57 #endif  // VisualStudio >= 2012
58 
59 // The following are available on all x86 platforms:
60 #if !defined(LIBYUV_DISABLE_X86) && \
61     (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
62 #define HAS_FIXEDDIV1_X86
63 #define HAS_FIXEDDIV_X86
64 #define HAS_SCALEADDROW_SSE2
65 #define HAS_SCALEARGBCOLS_SSE2
66 #define HAS_SCALEARGBCOLSUP2_SSE2
67 #define HAS_SCALEARGBFILTERCOLS_SSSE3
68 #define HAS_SCALEARGBROWDOWN2_SSE2
69 #define HAS_SCALEARGBROWDOWNEVEN_SSE2
70 #define HAS_SCALECOLSUP2_SSE2
71 #define HAS_SCALEFILTERCOLS_SSSE3
72 #define HAS_SCALEROWDOWN2_SSSE3
73 #define HAS_SCALEROWDOWN34_SSSE3
74 #define HAS_SCALEROWDOWN38_SSSE3
75 #define HAS_SCALEROWDOWN4_SSSE3
76 #endif
77 
78 // The following are available for gcc/clang x86 platforms:
79 // TODO(fbarchard): Port to Visual C
80 #if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__))
81 #define HAS_SCALEUVROWDOWN2BOX_SSSE3
82 #define HAS_SCALEROWUP2_LINEAR_SSE2
83 #define HAS_SCALEROWUP2_LINEAR_SSSE3
84 #define HAS_SCALEROWUP2_BILINEAR_SSE2
85 #define HAS_SCALEROWUP2_BILINEAR_SSSE3
86 #define HAS_SCALEROWUP2_LINEAR_12_SSSE3
87 #define HAS_SCALEROWUP2_BILINEAR_12_SSSE3
88 #define HAS_SCALEROWUP2_LINEAR_16_SSE2
89 #define HAS_SCALEROWUP2_BILINEAR_16_SSE2
90 #define HAS_SCALEUVROWUP2_LINEAR_SSSE3
91 #define HAS_SCALEUVROWUP2_BILINEAR_SSSE3
92 #define HAS_SCALEUVROWUP2_LINEAR_16_SSE41
93 #define HAS_SCALEUVROWUP2_BILINEAR_16_SSE41
94 #endif
95 
96 // The following are available for gcc/clang x86 platforms, but
97 // require clang 3.4 or gcc 4.7.
98 // TODO(fbarchard): Port to Visual C
99 #if !defined(LIBYUV_DISABLE_X86) &&               \
100     (defined(__x86_64__) || defined(__i386__)) && \
101     (defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2))
102 #define HAS_SCALEUVROWDOWN2BOX_AVX2
103 #define HAS_SCALEROWUP2_LINEAR_AVX2
104 #define HAS_SCALEROWUP2_BILINEAR_AVX2
105 #define HAS_SCALEROWUP2_LINEAR_12_AVX2
106 #define HAS_SCALEROWUP2_BILINEAR_12_AVX2
107 #define HAS_SCALEROWUP2_LINEAR_16_AVX2
108 #define HAS_SCALEROWUP2_BILINEAR_16_AVX2
109 #define HAS_SCALEUVROWUP2_LINEAR_AVX2
110 #define HAS_SCALEUVROWUP2_BILINEAR_AVX2
111 #define HAS_SCALEUVROWUP2_LINEAR_16_AVX2
112 #define HAS_SCALEUVROWUP2_BILINEAR_16_AVX2
113 #endif
114 
115 // The following are available on all x86 platforms, but
116 // require VS2012, clang 3.4 or gcc 4.7.
117 // The code supports NaCL but requires a new compiler and validator.
118 #if !defined(LIBYUV_DISABLE_X86) &&                          \
119     (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \
120      defined(GCC_HAS_AVX2))
121 #define HAS_SCALEADDROW_AVX2
122 #define HAS_SCALEROWDOWN2_AVX2
123 #define HAS_SCALEROWDOWN4_AVX2
124 #endif
125 
126 // The following are available on Neon platforms:
127 #if !defined(LIBYUV_DISABLE_NEON) && \
128     (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__))
129 #define HAS_SCALEADDROW_NEON
130 #define HAS_SCALEARGBCOLS_NEON
131 #define HAS_SCALEARGBFILTERCOLS_NEON
132 #define HAS_SCALEARGBROWDOWN2_NEON
133 #define HAS_SCALEARGBROWDOWNEVEN_NEON
134 #define HAS_SCALEFILTERCOLS_NEON
135 #define HAS_SCALEROWDOWN2_NEON
136 #define HAS_SCALEROWDOWN34_NEON
137 #define HAS_SCALEROWDOWN38_NEON
138 #define HAS_SCALEROWDOWN4_NEON
139 #define HAS_SCALEUVROWDOWN2_NEON
140 #define HAS_SCALEUVROWDOWN2LINEAR_NEON
141 #define HAS_SCALEUVROWDOWN2BOX_NEON
142 #define HAS_SCALEUVROWDOWNEVEN_NEON
143 #define HAS_SCALEROWUP2_LINEAR_NEON
144 #define HAS_SCALEROWUP2_BILINEAR_NEON
145 #define HAS_SCALEROWUP2_LINEAR_12_NEON
146 #define HAS_SCALEROWUP2_BILINEAR_12_NEON
147 #define HAS_SCALEROWUP2_LINEAR_16_NEON
148 #define HAS_SCALEROWUP2_BILINEAR_16_NEON
149 #define HAS_SCALEUVROWUP2_LINEAR_NEON
150 #define HAS_SCALEUVROWUP2_BILINEAR_NEON
151 #define HAS_SCALEUVROWUP2_LINEAR_16_NEON
152 #define HAS_SCALEUVROWUP2_BILINEAR_16_NEON
153 #endif
154 
155 #if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa)
156 #define HAS_SCALEADDROW_MSA
157 #define HAS_SCALEARGBCOLS_MSA
158 #define HAS_SCALEARGBFILTERCOLS_MSA
159 #define HAS_SCALEARGBROWDOWN2_MSA
160 #define HAS_SCALEARGBROWDOWNEVEN_MSA
161 #define HAS_SCALEFILTERCOLS_MSA
162 #define HAS_SCALEROWDOWN2_MSA
163 #define HAS_SCALEROWDOWN34_MSA
164 #define HAS_SCALEROWDOWN38_MSA
165 #define HAS_SCALEROWDOWN4_MSA
166 #endif
167 
168 #if !defined(LIBYUV_DISABLE_LSX) && defined(__loongarch_sx)
169 #define HAS_SCALEARGBROWDOWN2_LSX
170 #define HAS_SCALEARGBROWDOWNEVEN_LSX
171 #define HAS_SCALEROWDOWN2_LSX
172 #define HAS_SCALEROWDOWN4_LSX
173 #define HAS_SCALEROWDOWN38_LSX
174 #define HAS_SCALEFILTERCOLS_LSX
175 #define HAS_SCALEADDROW_LSX
176 #define HAS_SCALEARGBCOLS_LSX
177 #define HAS_SCALEARGBFILTERCOLS_LSX
178 #define HAS_SCALEROWDOWN34_LSX
179 #endif
180 
181 #if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector)
182 #define HAS_SCALEADDROW_RVV
183 // TODO: Test ScaleARGBRowDownEven_RVV and enable it
184 // #define HAS_SCALEARGBROWDOWNEVEN_RVV
185 #define HAS_SCALEUVROWDOWN4_RVV
186 #define HAS_SCALEUVROWDOWNEVEN_RVV
187 #if __riscv_v_intrinsic == 11000
188 #define HAS_SCALEARGBROWDOWN2_RVV
189 #define HAS_SCALEARGBROWDOWN2BOX_RVV
190 #define HAS_SCALEARGBROWDOWN2LINEAR_RVV
191 #define HAS_SCALEARGBROWDOWNEVENBOX_RVV
192 #define HAS_SCALEROWDOWN2_RVV
193 #define HAS_SCALEROWDOWN2BOX_RVV
194 #define HAS_SCALEROWDOWN2LINEAR_RVV
195 #define HAS_SCALEROWDOWN34_0_BOX_RVV
196 #define HAS_SCALEROWDOWN34_1_BOX_RVV
197 #define HAS_SCALEROWDOWN34_RVV
198 #define HAS_SCALEROWDOWN38_2_BOX_RVV
199 #define HAS_SCALEROWDOWN38_3_BOX_RVV
200 #define HAS_SCALEROWDOWN38_RVV
201 #define HAS_SCALEROWDOWN4_RVV
202 #define HAS_SCALEROWDOWN4BOX_RVV
203 #define HAS_SCALEROWUP2_BILINEAR_RVV
204 #define HAS_SCALEROWUP2_LINEAR_RVV
205 #define HAS_SCALEUVROWDOWN2_RVV
206 #define HAS_SCALEUVROWDOWN2BOX_RVV
207 #define HAS_SCALEUVROWDOWN2LINEAR_RVV
208 #define HAS_SCALEUVROWUP2_BILINEAR_RVV
209 #define HAS_SCALEUVROWUP2_LINEAR_RVV
210 #endif
211 #endif
212 
213 // Scale ARGB vertically with bilinear interpolation.
214 void ScalePlaneVertical(int src_height,
215                         int dst_width,
216                         int dst_height,
217                         int src_stride,
218                         int dst_stride,
219                         const uint8_t* src_argb,
220                         uint8_t* dst_argb,
221                         int x,
222                         int y,
223                         int dy,
224                         int bpp,
225                         enum FilterMode filtering);
226 
227 void ScalePlaneVertical_16(int src_height,
228                            int dst_width,
229                            int dst_height,
230                            int src_stride,
231                            int dst_stride,
232                            const uint16_t* src_argb,
233                            uint16_t* dst_argb,
234                            int x,
235                            int y,
236                            int dy,
237                            int wpp,
238                            enum FilterMode filtering);
239 
240 void ScalePlaneVertical_16To8(int src_height,
241                               int dst_width,
242                               int dst_height,
243                               int src_stride,
244                               int dst_stride,
245                               const uint16_t* src_argb,
246                               uint8_t* dst_argb,
247                               int x,
248                               int y,
249                               int dy,
250                               int wpp,
251                               int scale,
252                               enum FilterMode filtering);
253 
254 void ScalePlaneDown2_16To8(int src_width,
255                            int src_height,
256                            int dst_width,
257                            int dst_height,
258                            int src_stride,
259                            int dst_stride,
260                            const uint16_t* src_ptr,
261                            uint8_t* dst_ptr,
262                            int scale,
263                            enum FilterMode filtering);
264 
265 // Simplify the filtering based on scale factors.
266 enum FilterMode ScaleFilterReduce(int src_width,
267                                   int src_height,
268                                   int dst_width,
269                                   int dst_height,
270                                   enum FilterMode filtering);
271 
272 // Divide num by div and return as 16.16 fixed point result.
273 int FixedDiv_C(int num, int div);
274 int FixedDiv_X86(int num, int div);
275 int FixedDiv_MIPS(int num, int div);
276 // Divide num - 1 by div - 1 and return as 16.16 fixed point result.
277 int FixedDiv1_C(int num, int div);
278 int FixedDiv1_X86(int num, int div);
279 int FixedDiv1_MIPS(int num, int div);
280 #ifdef HAS_FIXEDDIV_X86
281 #define FixedDiv FixedDiv_X86
282 #define FixedDiv1 FixedDiv1_X86
283 #elif defined HAS_FIXEDDIV_MIPS
284 #define FixedDiv FixedDiv_MIPS
285 #define FixedDiv1 FixedDiv1_MIPS
286 #else
287 #define FixedDiv FixedDiv_C
288 #define FixedDiv1 FixedDiv1_C
289 #endif
290 
291 // Compute slope values for stepping.
292 void ScaleSlope(int src_width,
293                 int src_height,
294                 int dst_width,
295                 int dst_height,
296                 enum FilterMode filtering,
297                 int* x,
298                 int* y,
299                 int* dx,
300                 int* dy);
301 
302 void ScaleRowDown2_C(const uint8_t* src_ptr,
303                      ptrdiff_t src_stride,
304                      uint8_t* dst,
305                      int dst_width);
306 void ScaleRowDown2_16_C(const uint16_t* src_ptr,
307                         ptrdiff_t src_stride,
308                         uint16_t* dst,
309                         int dst_width);
310 void ScaleRowDown2_16To8_C(const uint16_t* src_ptr,
311                            ptrdiff_t src_stride,
312                            uint8_t* dst,
313                            int dst_width,
314                            int scale);
315 void ScaleRowDown2_16To8_Odd_C(const uint16_t* src_ptr,
316                                ptrdiff_t src_stride,
317                                uint8_t* dst,
318                                int dst_width,
319                                int scale);
320 void ScaleRowDown2Linear_C(const uint8_t* src_ptr,
321                            ptrdiff_t src_stride,
322                            uint8_t* dst,
323                            int dst_width);
324 void ScaleRowDown2Linear_16_C(const uint16_t* src_ptr,
325                               ptrdiff_t src_stride,
326                               uint16_t* dst,
327                               int dst_width);
328 void ScaleRowDown2Linear_16To8_C(const uint16_t* src_ptr,
329                                  ptrdiff_t src_stride,
330                                  uint8_t* dst,
331                                  int dst_width,
332                                  int scale);
333 void ScaleRowDown2Linear_16To8_Odd_C(const uint16_t* src_ptr,
334                                      ptrdiff_t src_stride,
335                                      uint8_t* dst,
336                                      int dst_width,
337                                      int scale);
338 void ScaleRowDown2Box_C(const uint8_t* src_ptr,
339                         ptrdiff_t src_stride,
340                         uint8_t* dst,
341                         int dst_width);
342 void ScaleRowDown2Box_Odd_C(const uint8_t* src_ptr,
343                             ptrdiff_t src_stride,
344                             uint8_t* dst,
345                             int dst_width);
346 void ScaleRowDown2Box_16_C(const uint16_t* src_ptr,
347                            ptrdiff_t src_stride,
348                            uint16_t* dst,
349                            int dst_width);
350 void ScaleRowDown2Box_16To8_C(const uint16_t* src_ptr,
351                               ptrdiff_t src_stride,
352                               uint8_t* dst,
353                               int dst_width,
354                               int scale);
355 void ScaleRowDown2Box_16To8_Odd_C(const uint16_t* src_ptr,
356                                   ptrdiff_t src_stride,
357                                   uint8_t* dst,
358                                   int dst_width,
359                                   int scale);
360 void ScaleRowDown4_C(const uint8_t* src_ptr,
361                      ptrdiff_t src_stride,
362                      uint8_t* dst,
363                      int dst_width);
364 void ScaleRowDown4_16_C(const uint16_t* src_ptr,
365                         ptrdiff_t src_stride,
366                         uint16_t* dst,
367                         int dst_width);
368 void ScaleRowDown4Box_C(const uint8_t* src_ptr,
369                         ptrdiff_t src_stride,
370                         uint8_t* dst,
371                         int dst_width);
372 void ScaleRowDown4Box_16_C(const uint16_t* src_ptr,
373                            ptrdiff_t src_stride,
374                            uint16_t* dst,
375                            int dst_width);
376 void ScaleRowDown34_C(const uint8_t* src_ptr,
377                       ptrdiff_t src_stride,
378                       uint8_t* dst,
379                       int dst_width);
380 void ScaleRowDown34_16_C(const uint16_t* src_ptr,
381                          ptrdiff_t src_stride,
382                          uint16_t* dst,
383                          int dst_width);
384 void ScaleRowDown34_0_Box_C(const uint8_t* src_ptr,
385                             ptrdiff_t src_stride,
386                             uint8_t* d,
387                             int dst_width);
388 void ScaleRowDown34_0_Box_16_C(const uint16_t* src_ptr,
389                                ptrdiff_t src_stride,
390                                uint16_t* d,
391                                int dst_width);
392 void ScaleRowDown34_1_Box_C(const uint8_t* src_ptr,
393                             ptrdiff_t src_stride,
394                             uint8_t* d,
395                             int dst_width);
396 void ScaleRowDown34_1_Box_16_C(const uint16_t* src_ptr,
397                                ptrdiff_t src_stride,
398                                uint16_t* d,
399                                int dst_width);
400 
401 void ScaleRowUp2_Linear_C(const uint8_t* src_ptr,
402                           uint8_t* dst_ptr,
403                           int dst_width);
404 void ScaleRowUp2_Bilinear_C(const uint8_t* src_ptr,
405                             ptrdiff_t src_stride,
406                             uint8_t* dst_ptr,
407                             ptrdiff_t dst_stride,
408                             int dst_width);
409 void ScaleRowUp2_Linear_16_C(const uint16_t* src_ptr,
410                              uint16_t* dst_ptr,
411                              int dst_width);
412 void ScaleRowUp2_Bilinear_16_C(const uint16_t* src_ptr,
413                                ptrdiff_t src_stride,
414                                uint16_t* dst_ptr,
415                                ptrdiff_t dst_stride,
416                                int dst_width);
417 void ScaleRowUp2_Linear_Any_C(const uint8_t* src_ptr,
418                               uint8_t* dst_ptr,
419                               int dst_width);
420 void ScaleRowUp2_Bilinear_Any_C(const uint8_t* src_ptr,
421                                 ptrdiff_t src_stride,
422                                 uint8_t* dst_ptr,
423                                 ptrdiff_t dst_stride,
424                                 int dst_width);
425 void ScaleRowUp2_Linear_16_Any_C(const uint16_t* src_ptr,
426                                  uint16_t* dst_ptr,
427                                  int dst_width);
428 void ScaleRowUp2_Bilinear_16_Any_C(const uint16_t* src_ptr,
429                                    ptrdiff_t src_stride,
430                                    uint16_t* dst_ptr,
431                                    ptrdiff_t dst_stride,
432                                    int dst_width);
433 
434 void ScaleCols_C(uint8_t* dst_ptr,
435                  const uint8_t* src_ptr,
436                  int dst_width,
437                  int x,
438                  int dx);
439 void ScaleCols_16_C(uint16_t* dst_ptr,
440                     const uint16_t* src_ptr,
441                     int dst_width,
442                     int x,
443                     int dx);
444 void ScaleColsUp2_C(uint8_t* dst_ptr,
445                     const uint8_t* src_ptr,
446                     int dst_width,
447                     int,
448                     int);
449 void ScaleColsUp2_16_C(uint16_t* dst_ptr,
450                        const uint16_t* src_ptr,
451                        int dst_width,
452                        int,
453                        int);
454 void ScaleFilterCols_C(uint8_t* dst_ptr,
455                        const uint8_t* src_ptr,
456                        int dst_width,
457                        int x,
458                        int dx);
459 void ScaleFilterCols_16_C(uint16_t* dst_ptr,
460                           const uint16_t* src_ptr,
461                           int dst_width,
462                           int x,
463                           int dx);
464 void ScaleFilterCols64_C(uint8_t* dst_ptr,
465                          const uint8_t* src_ptr,
466                          int dst_width,
467                          int x32,
468                          int dx);
469 void ScaleFilterCols64_16_C(uint16_t* dst_ptr,
470                             const uint16_t* src_ptr,
471                             int dst_width,
472                             int x32,
473                             int dx);
474 void ScaleRowDown38_C(const uint8_t* src_ptr,
475                       ptrdiff_t src_stride,
476                       uint8_t* dst,
477                       int dst_width);
478 void ScaleRowDown38_16_C(const uint16_t* src_ptr,
479                          ptrdiff_t src_stride,
480                          uint16_t* dst,
481                          int dst_width);
482 void ScaleRowDown38_3_Box_C(const uint8_t* src_ptr,
483                             ptrdiff_t src_stride,
484                             uint8_t* dst_ptr,
485                             int dst_width);
486 void ScaleRowDown38_3_Box_16_C(const uint16_t* src_ptr,
487                                ptrdiff_t src_stride,
488                                uint16_t* dst_ptr,
489                                int dst_width);
490 void ScaleRowDown38_2_Box_C(const uint8_t* src_ptr,
491                             ptrdiff_t src_stride,
492                             uint8_t* dst_ptr,
493                             int dst_width);
494 void ScaleRowDown38_2_Box_16_C(const uint16_t* src_ptr,
495                                ptrdiff_t src_stride,
496                                uint16_t* dst_ptr,
497                                int dst_width);
498 void ScaleAddRow_C(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
499 void ScaleAddRow_16_C(const uint16_t* src_ptr,
500                       uint32_t* dst_ptr,
501                       int src_width);
502 void ScaleARGBRowDown2_C(const uint8_t* src_argb,
503                          ptrdiff_t src_stride,
504                          uint8_t* dst_argb,
505                          int dst_width);
506 void ScaleARGBRowDown2Linear_C(const uint8_t* src_argb,
507                                ptrdiff_t src_stride,
508                                uint8_t* dst_argb,
509                                int dst_width);
510 void ScaleARGBRowDown2Box_C(const uint8_t* src_argb,
511                             ptrdiff_t src_stride,
512                             uint8_t* dst_argb,
513                             int dst_width);
514 void ScaleARGBRowDownEven_C(const uint8_t* src_argb,
515                             ptrdiff_t src_stride,
516                             int src_stepx,
517                             uint8_t* dst_argb,
518                             int dst_width);
519 void ScaleARGBRowDownEvenBox_C(const uint8_t* src_argb,
520                                ptrdiff_t src_stride,
521                                int src_stepx,
522                                uint8_t* dst_argb,
523                                int dst_width);
524 void ScaleARGBCols_C(uint8_t* dst_argb,
525                      const uint8_t* src_argb,
526                      int dst_width,
527                      int x,
528                      int dx);
529 void ScaleARGBCols64_C(uint8_t* dst_argb,
530                        const uint8_t* src_argb,
531                        int dst_width,
532                        int x32,
533                        int dx);
534 void ScaleARGBColsUp2_C(uint8_t* dst_argb,
535                         const uint8_t* src_argb,
536                         int dst_width,
537                         int,
538                         int);
539 void ScaleARGBFilterCols_C(uint8_t* dst_argb,
540                            const uint8_t* src_argb,
541                            int dst_width,
542                            int x,
543                            int dx);
544 void ScaleARGBFilterCols64_C(uint8_t* dst_argb,
545                              const uint8_t* src_argb,
546                              int dst_width,
547                              int x32,
548                              int dx);
549 void ScaleUVRowDown2_C(const uint8_t* src_uv,
550                        ptrdiff_t src_stride,
551                        uint8_t* dst_uv,
552                        int dst_width);
553 void ScaleUVRowDown2Linear_C(const uint8_t* src_uv,
554                              ptrdiff_t src_stride,
555                              uint8_t* dst_uv,
556                              int dst_width);
557 void ScaleUVRowDown2Box_C(const uint8_t* src_uv,
558                           ptrdiff_t src_stride,
559                           uint8_t* dst_uv,
560                           int dst_width);
561 void ScaleUVRowDownEven_C(const uint8_t* src_uv,
562                           ptrdiff_t src_stride,
563                           int src_stepx,
564                           uint8_t* dst_uv,
565                           int dst_width);
566 void ScaleUVRowDownEvenBox_C(const uint8_t* src_uv,
567                              ptrdiff_t src_stride,
568                              int src_stepx,
569                              uint8_t* dst_uv,
570                              int dst_width);
571 
572 void ScaleUVRowUp2_Linear_C(const uint8_t* src_ptr,
573                             uint8_t* dst_ptr,
574                             int dst_width);
575 void ScaleUVRowUp2_Bilinear_C(const uint8_t* src_ptr,
576                               ptrdiff_t src_stride,
577                               uint8_t* dst_ptr,
578                               ptrdiff_t dst_stride,
579                               int dst_width);
580 void ScaleUVRowUp2_Linear_Any_C(const uint8_t* src_ptr,
581                                 uint8_t* dst_ptr,
582                                 int dst_width);
583 void ScaleUVRowUp2_Bilinear_Any_C(const uint8_t* src_ptr,
584                                   ptrdiff_t src_stride,
585                                   uint8_t* dst_ptr,
586                                   ptrdiff_t dst_stride,
587                                   int dst_width);
588 void ScaleUVRowUp2_Linear_16_C(const uint16_t* src_ptr,
589                                uint16_t* dst_ptr,
590                                int dst_width);
591 void ScaleUVRowUp2_Bilinear_16_C(const uint16_t* src_ptr,
592                                  ptrdiff_t src_stride,
593                                  uint16_t* dst_ptr,
594                                  ptrdiff_t dst_stride,
595                                  int dst_width);
596 void ScaleUVRowUp2_Linear_16_Any_C(const uint16_t* src_ptr,
597                                    uint16_t* dst_ptr,
598                                    int dst_width);
599 void ScaleUVRowUp2_Bilinear_16_Any_C(const uint16_t* src_ptr,
600                                      ptrdiff_t src_stride,
601                                      uint16_t* dst_ptr,
602                                      ptrdiff_t dst_stride,
603                                      int dst_width);
604 
605 void ScaleUVCols_C(uint8_t* dst_uv,
606                    const uint8_t* src_uv,
607                    int dst_width,
608                    int x,
609                    int dx);
610 void ScaleUVCols64_C(uint8_t* dst_uv,
611                      const uint8_t* src_uv,
612                      int dst_width,
613                      int x32,
614                      int dx);
615 void ScaleUVColsUp2_C(uint8_t* dst_uv,
616                       const uint8_t* src_uv,
617                       int dst_width,
618                       int,
619                       int);
620 void ScaleUVFilterCols_C(uint8_t* dst_uv,
621                          const uint8_t* src_uv,
622                          int dst_width,
623                          int x,
624                          int dx);
625 void ScaleUVFilterCols64_C(uint8_t* dst_uv,
626                            const uint8_t* src_uv,
627                            int dst_width,
628                            int x32,
629                            int dx);
630 
631 // Specialized scalers for x86.
632 void ScaleRowDown2_SSSE3(const uint8_t* src_ptr,
633                          ptrdiff_t src_stride,
634                          uint8_t* dst_ptr,
635                          int dst_width);
636 void ScaleRowDown2Linear_SSSE3(const uint8_t* src_ptr,
637                                ptrdiff_t src_stride,
638                                uint8_t* dst_ptr,
639                                int dst_width);
640 void ScaleRowDown2Box_SSSE3(const uint8_t* src_ptr,
641                             ptrdiff_t src_stride,
642                             uint8_t* dst_ptr,
643                             int dst_width);
644 void ScaleRowDown2_AVX2(const uint8_t* src_ptr,
645                         ptrdiff_t src_stride,
646                         uint8_t* dst_ptr,
647                         int dst_width);
648 void ScaleRowDown2Linear_AVX2(const uint8_t* src_ptr,
649                               ptrdiff_t src_stride,
650                               uint8_t* dst_ptr,
651                               int dst_width);
652 void ScaleRowDown2Box_AVX2(const uint8_t* src_ptr,
653                            ptrdiff_t src_stride,
654                            uint8_t* dst_ptr,
655                            int dst_width);
656 void ScaleRowDown4_SSSE3(const uint8_t* src_ptr,
657                          ptrdiff_t src_stride,
658                          uint8_t* dst_ptr,
659                          int dst_width);
660 void ScaleRowDown4Box_SSSE3(const uint8_t* src_ptr,
661                             ptrdiff_t src_stride,
662                             uint8_t* dst_ptr,
663                             int dst_width);
664 void ScaleRowDown4_AVX2(const uint8_t* src_ptr,
665                         ptrdiff_t src_stride,
666                         uint8_t* dst_ptr,
667                         int dst_width);
668 void ScaleRowDown4Box_AVX2(const uint8_t* src_ptr,
669                            ptrdiff_t src_stride,
670                            uint8_t* dst_ptr,
671                            int dst_width);
672 
673 void ScaleRowDown34_SSSE3(const uint8_t* src_ptr,
674                           ptrdiff_t src_stride,
675                           uint8_t* dst_ptr,
676                           int dst_width);
677 void ScaleRowDown34_1_Box_SSSE3(const uint8_t* src_ptr,
678                                 ptrdiff_t src_stride,
679                                 uint8_t* dst_ptr,
680                                 int dst_width);
681 void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr,
682                                 ptrdiff_t src_stride,
683                                 uint8_t* dst_ptr,
684                                 int dst_width);
685 void ScaleRowDown38_SSSE3(const uint8_t* src_ptr,
686                           ptrdiff_t src_stride,
687                           uint8_t* dst_ptr,
688                           int dst_width);
689 void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr,
690                                 ptrdiff_t src_stride,
691                                 uint8_t* dst_ptr,
692                                 int dst_width);
693 void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr,
694                                 ptrdiff_t src_stride,
695                                 uint8_t* dst_ptr,
696                                 int dst_width);
697 
698 void ScaleRowUp2_Linear_SSE2(const uint8_t* src_ptr,
699                              uint8_t* dst_ptr,
700                              int dst_width);
701 void ScaleRowUp2_Bilinear_SSE2(const uint8_t* src_ptr,
702                                ptrdiff_t src_stride,
703                                uint8_t* dst_ptr,
704                                ptrdiff_t dst_stride,
705                                int dst_width);
706 void ScaleRowUp2_Linear_12_SSSE3(const uint16_t* src_ptr,
707                                  uint16_t* dst_ptr,
708                                  int dst_width);
709 void ScaleRowUp2_Bilinear_12_SSSE3(const uint16_t* src_ptr,
710                                    ptrdiff_t src_stride,
711                                    uint16_t* dst_ptr,
712                                    ptrdiff_t dst_stride,
713                                    int dst_width);
714 void ScaleRowUp2_Linear_16_SSE2(const uint16_t* src_ptr,
715                                 uint16_t* dst_ptr,
716                                 int dst_width);
717 void ScaleRowUp2_Bilinear_16_SSE2(const uint16_t* src_ptr,
718                                   ptrdiff_t src_stride,
719                                   uint16_t* dst_ptr,
720                                   ptrdiff_t dst_stride,
721                                   int dst_width);
722 void ScaleRowUp2_Linear_SSSE3(const uint8_t* src_ptr,
723                               uint8_t* dst_ptr,
724                               int dst_width);
725 void ScaleRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr,
726                                 ptrdiff_t src_stride,
727                                 uint8_t* dst_ptr,
728                                 ptrdiff_t dst_stride,
729                                 int dst_width);
730 void ScaleRowUp2_Linear_AVX2(const uint8_t* src_ptr,
731                              uint8_t* dst_ptr,
732                              int dst_width);
733 void ScaleRowUp2_Bilinear_AVX2(const uint8_t* src_ptr,
734                                ptrdiff_t src_stride,
735                                uint8_t* dst_ptr,
736                                ptrdiff_t dst_stride,
737                                int dst_width);
738 void ScaleRowUp2_Linear_12_AVX2(const uint16_t* src_ptr,
739                                 uint16_t* dst_ptr,
740                                 int dst_width);
741 void ScaleRowUp2_Bilinear_12_AVX2(const uint16_t* src_ptr,
742                                   ptrdiff_t src_stride,
743                                   uint16_t* dst_ptr,
744                                   ptrdiff_t dst_stride,
745                                   int dst_width);
746 void ScaleRowUp2_Linear_16_AVX2(const uint16_t* src_ptr,
747                                 uint16_t* dst_ptr,
748                                 int dst_width);
749 void ScaleRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr,
750                                   ptrdiff_t src_stride,
751                                   uint16_t* dst_ptr,
752                                   ptrdiff_t dst_stride,
753                                   int dst_width);
754 void ScaleRowUp2_Linear_Any_SSE2(const uint8_t* src_ptr,
755                                  uint8_t* dst_ptr,
756                                  int dst_width);
757 void ScaleRowUp2_Bilinear_Any_SSE2(const uint8_t* src_ptr,
758                                    ptrdiff_t src_stride,
759                                    uint8_t* dst_ptr,
760                                    ptrdiff_t dst_stride,
761                                    int dst_width);
762 void ScaleRowUp2_Linear_12_Any_SSSE3(const uint16_t* src_ptr,
763                                      uint16_t* dst_ptr,
764                                      int dst_width);
765 void ScaleRowUp2_Bilinear_12_Any_SSSE3(const uint16_t* src_ptr,
766                                        ptrdiff_t src_stride,
767                                        uint16_t* dst_ptr,
768                                        ptrdiff_t dst_stride,
769                                        int dst_width);
770 void ScaleRowUp2_Linear_16_Any_SSE2(const uint16_t* src_ptr,
771                                     uint16_t* dst_ptr,
772                                     int dst_width);
773 void ScaleRowUp2_Bilinear_16_Any_SSE2(const uint16_t* src_ptr,
774                                       ptrdiff_t src_stride,
775                                       uint16_t* dst_ptr,
776                                       ptrdiff_t dst_stride,
777                                       int dst_width);
778 void ScaleRowUp2_Linear_Any_SSSE3(const uint8_t* src_ptr,
779                                   uint8_t* dst_ptr,
780                                   int dst_width);
781 void ScaleRowUp2_Bilinear_Any_SSSE3(const uint8_t* src_ptr,
782                                     ptrdiff_t src_stride,
783                                     uint8_t* dst_ptr,
784                                     ptrdiff_t dst_stride,
785                                     int dst_width);
786 void ScaleRowUp2_Linear_Any_AVX2(const uint8_t* src_ptr,
787                                  uint8_t* dst_ptr,
788                                  int dst_width);
789 void ScaleRowUp2_Bilinear_Any_AVX2(const uint8_t* src_ptr,
790                                    ptrdiff_t src_stride,
791                                    uint8_t* dst_ptr,
792                                    ptrdiff_t dst_stride,
793                                    int dst_width);
794 void ScaleRowUp2_Linear_12_Any_AVX2(const uint16_t* src_ptr,
795                                     uint16_t* dst_ptr,
796                                     int dst_width);
797 void ScaleRowUp2_Bilinear_12_Any_AVX2(const uint16_t* src_ptr,
798                                       ptrdiff_t src_stride,
799                                       uint16_t* dst_ptr,
800                                       ptrdiff_t dst_stride,
801                                       int dst_width);
802 void ScaleRowUp2_Linear_16_Any_AVX2(const uint16_t* src_ptr,
803                                     uint16_t* dst_ptr,
804                                     int dst_width);
805 void ScaleRowUp2_Bilinear_16_Any_AVX2(const uint16_t* src_ptr,
806                                       ptrdiff_t src_stride,
807                                       uint16_t* dst_ptr,
808                                       ptrdiff_t dst_stride,
809                                       int dst_width);
810 
811 void ScaleRowDown2_Any_SSSE3(const uint8_t* src_ptr,
812                              ptrdiff_t src_stride,
813                              uint8_t* dst_ptr,
814                              int dst_width);
815 void ScaleRowDown2Linear_Any_SSSE3(const uint8_t* src_ptr,
816                                    ptrdiff_t src_stride,
817                                    uint8_t* dst_ptr,
818                                    int dst_width);
819 void ScaleRowDown2Box_Any_SSSE3(const uint8_t* src_ptr,
820                                 ptrdiff_t src_stride,
821                                 uint8_t* dst_ptr,
822                                 int dst_width);
823 void ScaleRowDown2Box_Odd_SSSE3(const uint8_t* src_ptr,
824                                 ptrdiff_t src_stride,
825                                 uint8_t* dst_ptr,
826                                 int dst_width);
827 void ScaleRowDown2_Any_AVX2(const uint8_t* src_ptr,
828                             ptrdiff_t src_stride,
829                             uint8_t* dst_ptr,
830                             int dst_width);
831 void ScaleRowDown2Linear_Any_AVX2(const uint8_t* src_ptr,
832                                   ptrdiff_t src_stride,
833                                   uint8_t* dst_ptr,
834                                   int dst_width);
835 void ScaleRowDown2Box_Any_AVX2(const uint8_t* src_ptr,
836                                ptrdiff_t src_stride,
837                                uint8_t* dst_ptr,
838                                int dst_width);
839 void ScaleRowDown2Box_Odd_AVX2(const uint8_t* src_ptr,
840                                ptrdiff_t src_stride,
841                                uint8_t* dst_ptr,
842                                int dst_width);
843 void ScaleRowDown4_Any_SSSE3(const uint8_t* src_ptr,
844                              ptrdiff_t src_stride,
845                              uint8_t* dst_ptr,
846                              int dst_width);
847 void ScaleRowDown4Box_Any_SSSE3(const uint8_t* src_ptr,
848                                 ptrdiff_t src_stride,
849                                 uint8_t* dst_ptr,
850                                 int dst_width);
851 void ScaleRowDown4_Any_AVX2(const uint8_t* src_ptr,
852                             ptrdiff_t src_stride,
853                             uint8_t* dst_ptr,
854                             int dst_width);
855 void ScaleRowDown4Box_Any_AVX2(const uint8_t* src_ptr,
856                                ptrdiff_t src_stride,
857                                uint8_t* dst_ptr,
858                                int dst_width);
859 
860 void ScaleRowDown34_Any_SSSE3(const uint8_t* src_ptr,
861                               ptrdiff_t src_stride,
862                               uint8_t* dst_ptr,
863                               int dst_width);
864 void ScaleRowDown34_1_Box_Any_SSSE3(const uint8_t* src_ptr,
865                                     ptrdiff_t src_stride,
866                                     uint8_t* dst_ptr,
867                                     int dst_width);
868 void ScaleRowDown34_0_Box_Any_SSSE3(const uint8_t* src_ptr,
869                                     ptrdiff_t src_stride,
870                                     uint8_t* dst_ptr,
871                                     int dst_width);
872 void ScaleRowDown38_Any_SSSE3(const uint8_t* src_ptr,
873                               ptrdiff_t src_stride,
874                               uint8_t* dst_ptr,
875                               int dst_width);
876 void ScaleRowDown38_3_Box_Any_SSSE3(const uint8_t* src_ptr,
877                                     ptrdiff_t src_stride,
878                                     uint8_t* dst_ptr,
879                                     int dst_width);
880 void ScaleRowDown38_2_Box_Any_SSSE3(const uint8_t* src_ptr,
881                                     ptrdiff_t src_stride,
882                                     uint8_t* dst_ptr,
883                                     int dst_width);
884 
885 void ScaleAddRow_SSE2(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
886 void ScaleAddRow_AVX2(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
887 void ScaleAddRow_Any_SSE2(const uint8_t* src_ptr,
888                           uint16_t* dst_ptr,
889                           int src_width);
890 void ScaleAddRow_Any_AVX2(const uint8_t* src_ptr,
891                           uint16_t* dst_ptr,
892                           int src_width);
893 
894 void ScaleFilterCols_SSSE3(uint8_t* dst_ptr,
895                            const uint8_t* src_ptr,
896                            int dst_width,
897                            int x,
898                            int dx);
899 void ScaleColsUp2_SSE2(uint8_t* dst_ptr,
900                        const uint8_t* src_ptr,
901                        int dst_width,
902                        int x,
903                        int dx);
904 
905 // ARGB Column functions
906 void ScaleARGBCols_SSE2(uint8_t* dst_argb,
907                         const uint8_t* src_argb,
908                         int dst_width,
909                         int x,
910                         int dx);
911 void ScaleARGBFilterCols_SSSE3(uint8_t* dst_argb,
912                                const uint8_t* src_argb,
913                                int dst_width,
914                                int x,
915                                int dx);
916 void ScaleARGBColsUp2_SSE2(uint8_t* dst_argb,
917                            const uint8_t* src_argb,
918                            int dst_width,
919                            int x,
920                            int dx);
921 void ScaleARGBFilterCols_NEON(uint8_t* dst_argb,
922                               const uint8_t* src_argb,
923                               int dst_width,
924                               int x,
925                               int dx);
926 void ScaleARGBCols_NEON(uint8_t* dst_argb,
927                         const uint8_t* src_argb,
928                         int dst_width,
929                         int x,
930                         int dx);
931 void ScaleARGBFilterCols_Any_NEON(uint8_t* dst_ptr,
932                                   const uint8_t* src_ptr,
933                                   int dst_width,
934                                   int x,
935                                   int dx);
936 void ScaleARGBCols_Any_NEON(uint8_t* dst_ptr,
937                             const uint8_t* src_ptr,
938                             int dst_width,
939                             int x,
940                             int dx);
941 void ScaleARGBFilterCols_MSA(uint8_t* dst_argb,
942                              const uint8_t* src_argb,
943                              int dst_width,
944                              int x,
945                              int dx);
946 void ScaleARGBCols_MSA(uint8_t* dst_argb,
947                        const uint8_t* src_argb,
948                        int dst_width,
949                        int x,
950                        int dx);
951 void ScaleARGBFilterCols_Any_MSA(uint8_t* dst_ptr,
952                                  const uint8_t* src_ptr,
953                                  int dst_width,
954                                  int x,
955                                  int dx);
956 void ScaleARGBCols_Any_MSA(uint8_t* dst_ptr,
957                            const uint8_t* src_ptr,
958                            int dst_width,
959                            int x,
960                            int dx);
961 
962 // ARGB Row functions
963 void ScaleARGBRowDown2_SSE2(const uint8_t* src_argb,
964                             ptrdiff_t src_stride,
965                             uint8_t* dst_argb,
966                             int dst_width);
967 void ScaleARGBRowDown2Linear_SSE2(const uint8_t* src_argb,
968                                   ptrdiff_t src_stride,
969                                   uint8_t* dst_argb,
970                                   int dst_width);
971 void ScaleARGBRowDown2Box_SSE2(const uint8_t* src_argb,
972                                ptrdiff_t src_stride,
973                                uint8_t* dst_argb,
974                                int dst_width);
975 void ScaleARGBRowDown2_NEON(const uint8_t* src_ptr,
976                             ptrdiff_t src_stride,
977                             uint8_t* dst,
978                             int dst_width);
979 void ScaleARGBRowDown2Linear_NEON(const uint8_t* src_argb,
980                                   ptrdiff_t src_stride,
981                                   uint8_t* dst_argb,
982                                   int dst_width);
983 void ScaleARGBRowDown2Box_NEON(const uint8_t* src_ptr,
984                                ptrdiff_t src_stride,
985                                uint8_t* dst,
986                                int dst_width);
987 void ScaleARGBRowDown2_RVV(const uint8_t* src_argb,
988                            ptrdiff_t src_stride,
989                            uint8_t* dst_argb,
990                            int dst_width);
991 void ScaleARGBRowDown2Linear_RVV(const uint8_t* src_argb,
992                                  ptrdiff_t src_stride,
993                                  uint8_t* dst_argb,
994                                  int dst_width);
995 void ScaleARGBRowDown2Box_RVV(const uint8_t* src_argb,
996                               ptrdiff_t src_stride,
997                               uint8_t* dst_argb,
998                               int dst_width);
999 void ScaleARGBRowDown2_MSA(const uint8_t* src_argb,
1000                            ptrdiff_t src_stride,
1001                            uint8_t* dst_argb,
1002                            int dst_width);
1003 void ScaleARGBRowDown2Linear_MSA(const uint8_t* src_argb,
1004                                  ptrdiff_t src_stride,
1005                                  uint8_t* dst_argb,
1006                                  int dst_width);
1007 void ScaleARGBRowDown2Box_MSA(const uint8_t* src_argb,
1008                               ptrdiff_t src_stride,
1009                               uint8_t* dst_argb,
1010                               int dst_width);
1011 void ScaleARGBRowDown2_LSX(const uint8_t* src_argb,
1012                            ptrdiff_t src_stride,
1013                            uint8_t* dst_argb,
1014                            int dst_width);
1015 void ScaleARGBRowDown2Linear_LSX(const uint8_t* src_argb,
1016                                  ptrdiff_t src_stride,
1017                                  uint8_t* dst_argb,
1018                                  int dst_width);
1019 void ScaleARGBRowDown2Box_LSX(const uint8_t* src_argb,
1020                               ptrdiff_t src_stride,
1021                               uint8_t* dst_argb,
1022                               int dst_width);
1023 void ScaleARGBRowDown2_Any_SSE2(const uint8_t* src_ptr,
1024                                 ptrdiff_t src_stride,
1025                                 uint8_t* dst_ptr,
1026                                 int dst_width);
1027 void ScaleARGBRowDown2Linear_Any_SSE2(const uint8_t* src_ptr,
1028                                       ptrdiff_t src_stride,
1029                                       uint8_t* dst_ptr,
1030                                       int dst_width);
1031 void ScaleARGBRowDown2Box_Any_SSE2(const uint8_t* src_ptr,
1032                                    ptrdiff_t src_stride,
1033                                    uint8_t* dst_ptr,
1034                                    int dst_width);
1035 void ScaleARGBRowDown2_Any_NEON(const uint8_t* src_ptr,
1036                                 ptrdiff_t src_stride,
1037                                 uint8_t* dst_ptr,
1038                                 int dst_width);
1039 void ScaleARGBRowDown2Linear_Any_NEON(const uint8_t* src_ptr,
1040                                       ptrdiff_t src_stride,
1041                                       uint8_t* dst_ptr,
1042                                       int dst_width);
1043 void ScaleARGBRowDown2Box_Any_NEON(const uint8_t* src_ptr,
1044                                    ptrdiff_t src_stride,
1045                                    uint8_t* dst_ptr,
1046                                    int dst_width);
1047 void ScaleARGBRowDown2_Any_MSA(const uint8_t* src_ptr,
1048                                ptrdiff_t src_stride,
1049                                uint8_t* dst_ptr,
1050                                int dst_width);
1051 void ScaleARGBRowDown2Linear_Any_MSA(const uint8_t* src_ptr,
1052                                      ptrdiff_t src_stride,
1053                                      uint8_t* dst_ptr,
1054                                      int dst_width);
1055 void ScaleARGBRowDown2Box_Any_MSA(const uint8_t* src_ptr,
1056                                   ptrdiff_t src_stride,
1057                                   uint8_t* dst_ptr,
1058                                   int dst_width);
1059 void ScaleARGBRowDown2_Any_LSX(const uint8_t* src_ptr,
1060                                ptrdiff_t src_stride,
1061                                uint8_t* dst_ptr,
1062                                int dst_width);
1063 void ScaleARGBRowDown2Linear_Any_LSX(const uint8_t* src_ptr,
1064                                      ptrdiff_t src_stride,
1065                                      uint8_t* dst_ptr,
1066                                      int dst_width);
1067 void ScaleARGBRowDown2Box_Any_LSX(const uint8_t* src_ptr,
1068                                   ptrdiff_t src_stride,
1069                                   uint8_t* dst_ptr,
1070                                   int dst_width);
1071 void ScaleARGBRowDownEven_SSE2(const uint8_t* src_argb,
1072                                ptrdiff_t src_stride,
1073                                int src_stepx,
1074                                uint8_t* dst_argb,
1075                                int dst_width);
1076 void ScaleARGBRowDownEvenBox_SSE2(const uint8_t* src_argb,
1077                                   ptrdiff_t src_stride,
1078                                   int src_stepx,
1079                                   uint8_t* dst_argb,
1080                                   int dst_width);
1081 void ScaleARGBRowDownEven_NEON(const uint8_t* src_argb,
1082                                ptrdiff_t src_stride,
1083                                int src_stepx,
1084                                uint8_t* dst_argb,
1085                                int dst_width);
1086 void ScaleARGBRowDownEvenBox_NEON(const uint8_t* src_argb,
1087                                   ptrdiff_t src_stride,
1088                                   int src_stepx,
1089                                   uint8_t* dst_argb,
1090                                   int dst_width);
1091 void ScaleARGBRowDownEven_MSA(const uint8_t* src_argb,
1092                               ptrdiff_t src_stride,
1093                               int32_t src_stepx,
1094                               uint8_t* dst_argb,
1095                               int dst_width);
1096 void ScaleARGBRowDownEvenBox_MSA(const uint8_t* src_argb,
1097                                  ptrdiff_t src_stride,
1098                                  int src_stepx,
1099                                  uint8_t* dst_argb,
1100                                  int dst_width);
1101 void ScaleARGBRowDownEven_LSX(const uint8_t* src_argb,
1102                               ptrdiff_t src_stride,
1103                               int32_t src_stepx,
1104                               uint8_t* dst_argb,
1105                               int dst_width);
1106 void ScaleARGBRowDownEvenBox_LSX(const uint8_t* src_argb,
1107                                  ptrdiff_t src_stride,
1108                                  int src_stepx,
1109                                  uint8_t* dst_argb,
1110                                  int dst_width);
1111 void ScaleARGBRowDownEven_RVV(const uint8_t* src_argb,
1112                               ptrdiff_t src_stride,
1113                               int32_t src_stepx,
1114                               uint8_t* dst_argb,
1115                               int dst_width);
1116 void ScaleARGBRowDownEvenBox_RVV(const uint8_t* src_argb,
1117                                  ptrdiff_t src_stride,
1118                                  int src_stepx,
1119                                  uint8_t* dst_argb,
1120                                  int dst_width);
1121 void ScaleARGBRowDownEven_Any_SSE2(const uint8_t* src_ptr,
1122                                    ptrdiff_t src_stride,
1123                                    int src_stepx,
1124                                    uint8_t* dst_ptr,
1125                                    int dst_width);
1126 void ScaleARGBRowDownEvenBox_Any_SSE2(const uint8_t* src_ptr,
1127                                       ptrdiff_t src_stride,
1128                                       int src_stepx,
1129                                       uint8_t* dst_ptr,
1130                                       int dst_width);
1131 void ScaleARGBRowDownEven_Any_NEON(const uint8_t* src_ptr,
1132                                    ptrdiff_t src_stride,
1133                                    int src_stepx,
1134                                    uint8_t* dst_ptr,
1135                                    int dst_width);
1136 void ScaleARGBRowDownEvenBox_Any_NEON(const uint8_t* src_ptr,
1137                                       ptrdiff_t src_stride,
1138                                       int src_stepx,
1139                                       uint8_t* dst_ptr,
1140                                       int dst_width);
1141 void ScaleARGBRowDownEven_Any_MSA(const uint8_t* src_ptr,
1142                                   ptrdiff_t src_stride,
1143                                   int32_t src_stepx,
1144                                   uint8_t* dst_ptr,
1145                                   int dst_width);
1146 void ScaleARGBRowDownEvenBox_Any_MSA(const uint8_t* src_ptr,
1147                                      ptrdiff_t src_stride,
1148                                      int src_stepx,
1149                                      uint8_t* dst_ptr,
1150                                      int dst_width);
1151 void ScaleARGBRowDownEven_Any_LSX(const uint8_t* src_ptr,
1152                                   ptrdiff_t src_stride,
1153                                   int32_t src_stepx,
1154                                   uint8_t* dst_ptr,
1155                                   int dst_width);
1156 void ScaleARGBRowDownEvenBox_Any_LSX(const uint8_t* src_ptr,
1157                                      ptrdiff_t src_stride,
1158                                      int src_stepx,
1159                                      uint8_t* dst_ptr,
1160                                      int dst_width);
1161 
1162 // UV Row functions
1163 void ScaleUVRowDown2_SSSE3(const uint8_t* src_ptr,
1164                            ptrdiff_t src_stride,
1165                            uint8_t* dst_uv,
1166                            int dst_width);
1167 void ScaleUVRowDown2Linear_SSSE3(const uint8_t* src_ptr,
1168                                  ptrdiff_t src_stride,
1169                                  uint8_t* dst_uv,
1170                                  int dst_width);
1171 void ScaleUVRowDown2Box_SSSE3(const uint8_t* src_ptr,
1172                               ptrdiff_t src_stride,
1173                               uint8_t* dst_uv,
1174                               int dst_width);
1175 void ScaleUVRowDown2Box_AVX2(const uint8_t* src_ptr,
1176                              ptrdiff_t src_stride,
1177                              uint8_t* dst_uv,
1178                              int dst_width);
1179 void ScaleUVRowDown2_NEON(const uint8_t* src_ptr,
1180                           ptrdiff_t src_stride,
1181                           uint8_t* dst,
1182                           int dst_width);
1183 void ScaleUVRowDown2Linear_NEON(const uint8_t* src_ptr,
1184                                 ptrdiff_t src_stride,
1185                                 uint8_t* dst_uv,
1186                                 int dst_width);
1187 void ScaleUVRowDown2Box_NEON(const uint8_t* src_ptr,
1188                              ptrdiff_t src_stride,
1189                              uint8_t* dst,
1190                              int dst_width);
1191 void ScaleUVRowDown2_MSA(const uint8_t* src_ptr,
1192                          ptrdiff_t src_stride,
1193                          uint8_t* dst_uv,
1194                          int dst_width);
1195 void ScaleUVRowDown2Linear_MSA(const uint8_t* src_ptr,
1196                                ptrdiff_t src_stride,
1197                                uint8_t* dst_uv,
1198                                int dst_width);
1199 void ScaleUVRowDown2Box_MSA(const uint8_t* src_ptr,
1200                             ptrdiff_t src_stride,
1201                             uint8_t* dst_uv,
1202                             int dst_width);
1203 void ScaleUVRowDown2_RVV(const uint8_t* src_ptr,
1204                          ptrdiff_t src_stride,
1205                          uint8_t* dst_uv,
1206                          int dst_width);
1207 void ScaleUVRowDown2Linear_RVV(const uint8_t* src_ptr,
1208                                ptrdiff_t src_stride,
1209                                uint8_t* dst_uv,
1210                                int dst_width);
1211 void ScaleUVRowDown2Box_RVV(const uint8_t* src_ptr,
1212                             ptrdiff_t src_stride,
1213                             uint8_t* dst,
1214                             int dst_width);
1215 void ScaleUVRowDown2_Any_SSSE3(const uint8_t* src_ptr,
1216                                ptrdiff_t src_stride,
1217                                uint8_t* dst_ptr,
1218                                int dst_width);
1219 void ScaleUVRowDown2Linear_Any_SSSE3(const uint8_t* src_ptr,
1220                                      ptrdiff_t src_stride,
1221                                      uint8_t* dst_ptr,
1222                                      int dst_width);
1223 void ScaleUVRowDown2Box_Any_SSSE3(const uint8_t* src_ptr,
1224                                   ptrdiff_t src_stride,
1225                                   uint8_t* dst_ptr,
1226                                   int dst_width);
1227 void ScaleUVRowDown2Box_Any_AVX2(const uint8_t* src_ptr,
1228                                  ptrdiff_t src_stride,
1229                                  uint8_t* dst_ptr,
1230                                  int dst_width);
1231 void ScaleUVRowDown2_Any_NEON(const uint8_t* src_ptr,
1232                               ptrdiff_t src_stride,
1233                               uint8_t* dst_ptr,
1234                               int dst_width);
1235 void ScaleUVRowDown2Linear_Any_NEON(const uint8_t* src_ptr,
1236                                     ptrdiff_t src_stride,
1237                                     uint8_t* dst_ptr,
1238                                     int dst_width);
1239 void ScaleUVRowDown2Box_Any_NEON(const uint8_t* src_ptr,
1240                                  ptrdiff_t src_stride,
1241                                  uint8_t* dst_ptr,
1242                                  int dst_width);
1243 void ScaleUVRowDown2_Any_MSA(const uint8_t* src_ptr,
1244                              ptrdiff_t src_stride,
1245                              uint8_t* dst_ptr,
1246                              int dst_width);
1247 void ScaleUVRowDown2Linear_Any_MSA(const uint8_t* src_ptr,
1248                                    ptrdiff_t src_stride,
1249                                    uint8_t* dst_ptr,
1250                                    int dst_width);
1251 void ScaleUVRowDown2Box_Any_MSA(const uint8_t* src_ptr,
1252                                 ptrdiff_t src_stride,
1253                                 uint8_t* dst_ptr,
1254                                 int dst_width);
1255 void ScaleUVRowDownEven_SSSE3(const uint8_t* src_ptr,
1256                               ptrdiff_t src_stride,
1257                               int src_stepx,
1258                               uint8_t* dst_uv,
1259                               int dst_width);
1260 void ScaleUVRowDownEvenBox_SSSE3(const uint8_t* src_ptr,
1261                                  ptrdiff_t src_stride,
1262                                  int src_stepx,
1263                                  uint8_t* dst_uv,
1264                                  int dst_width);
1265 void ScaleUVRowDownEven_NEON(const uint8_t* src_ptr,
1266                              ptrdiff_t src_stride,
1267                              int src_stepx,
1268                              uint8_t* dst_uv,
1269                              int dst_width);
1270 void ScaleUVRowDownEvenBox_NEON(const uint8_t* src_ptr,
1271                                 ptrdiff_t src_stride,
1272                                 int src_stepx,
1273                                 uint8_t* dst_uv,
1274                                 int dst_width);
1275 void ScaleUVRowDown4_RVV(const uint8_t* src_ptr,
1276                          ptrdiff_t src_stride,
1277                          int32_t src_stepx,
1278                          uint8_t* dst_uv,
1279                          int dst_width);
1280 void ScaleUVRowDownEven_RVV(const uint8_t* src_ptr,
1281                             ptrdiff_t src_stride,
1282                             int32_t src_stepx,
1283                             uint8_t* dst_uv,
1284                             int dst_width);
1285 void ScaleUVRowDownEven_MSA(const uint8_t* src_ptr,
1286                             ptrdiff_t src_stride,
1287                             int32_t src_stepx,
1288                             uint8_t* dst_uv,
1289                             int dst_width);
1290 void ScaleUVRowDownEvenBox_MSA(const uint8_t* src_ptr,
1291                                ptrdiff_t src_stride,
1292                                int src_stepx,
1293                                uint8_t* dst_uv,
1294                                int dst_width);
1295 void ScaleUVRowDownEven_Any_SSSE3(const uint8_t* src_ptr,
1296                                   ptrdiff_t src_stride,
1297                                   int src_stepx,
1298                                   uint8_t* dst_ptr,
1299                                   int dst_width);
1300 void ScaleUVRowDownEvenBox_Any_SSSE3(const uint8_t* src_ptr,
1301                                      ptrdiff_t src_stride,
1302                                      int src_stepx,
1303                                      uint8_t* dst_ptr,
1304                                      int dst_width);
1305 void ScaleUVRowDownEven_Any_NEON(const uint8_t* src_ptr,
1306                                  ptrdiff_t src_stride,
1307                                  int src_stepx,
1308                                  uint8_t* dst_ptr,
1309                                  int dst_width);
1310 void ScaleUVRowDownEvenBox_Any_NEON(const uint8_t* src_ptr,
1311                                     ptrdiff_t src_stride,
1312                                     int src_stepx,
1313                                     uint8_t* dst_ptr,
1314                                     int dst_width);
1315 void ScaleUVRowDownEven_Any_MSA(const uint8_t* src_ptr,
1316                                 ptrdiff_t src_stride,
1317                                 int32_t src_stepx,
1318                                 uint8_t* dst_ptr,
1319                                 int dst_width);
1320 void ScaleUVRowDownEvenBox_Any_MSA(const uint8_t* src_ptr,
1321                                    ptrdiff_t src_stride,
1322                                    int src_stepx,
1323                                    uint8_t* dst_ptr,
1324                                    int dst_width);
1325 
1326 void ScaleUVRowUp2_Linear_SSSE3(const uint8_t* src_ptr,
1327                                 uint8_t* dst_ptr,
1328                                 int dst_width);
1329 void ScaleUVRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr,
1330                                   ptrdiff_t src_stride,
1331                                   uint8_t* dst_ptr,
1332                                   ptrdiff_t dst_stride,
1333                                   int dst_width);
1334 void ScaleUVRowUp2_Linear_Any_SSSE3(const uint8_t* src_ptr,
1335                                     uint8_t* dst_ptr,
1336                                     int dst_width);
1337 void ScaleUVRowUp2_Bilinear_Any_SSSE3(const uint8_t* src_ptr,
1338                                       ptrdiff_t src_stride,
1339                                       uint8_t* dst_ptr,
1340                                       ptrdiff_t dst_stride,
1341                                       int dst_width);
1342 void ScaleUVRowUp2_Linear_AVX2(const uint8_t* src_ptr,
1343                                uint8_t* dst_ptr,
1344                                int dst_width);
1345 void ScaleUVRowUp2_Bilinear_AVX2(const uint8_t* src_ptr,
1346                                  ptrdiff_t src_stride,
1347                                  uint8_t* dst_ptr,
1348                                  ptrdiff_t dst_stride,
1349                                  int dst_width);
1350 void ScaleUVRowUp2_Linear_Any_AVX2(const uint8_t* src_ptr,
1351                                    uint8_t* dst_ptr,
1352                                    int dst_width);
1353 void ScaleUVRowUp2_Bilinear_Any_AVX2(const uint8_t* src_ptr,
1354                                      ptrdiff_t src_stride,
1355                                      uint8_t* dst_ptr,
1356                                      ptrdiff_t dst_stride,
1357                                      int dst_width);
1358 void ScaleUVRowUp2_Linear_NEON(const uint8_t* src_ptr,
1359                                uint8_t* dst_ptr,
1360                                int dst_width);
1361 void ScaleUVRowUp2_Bilinear_NEON(const uint8_t* src_ptr,
1362                                  ptrdiff_t src_stride,
1363                                  uint8_t* dst_ptr,
1364                                  ptrdiff_t dst_stride,
1365                                  int dst_width);
1366 void ScaleUVRowUp2_Linear_Any_NEON(const uint8_t* src_ptr,
1367                                    uint8_t* dst_ptr,
1368                                    int dst_width);
1369 void ScaleUVRowUp2_Bilinear_Any_NEON(const uint8_t* src_ptr,
1370                                      ptrdiff_t src_stride,
1371                                      uint8_t* dst_ptr,
1372                                      ptrdiff_t dst_stride,
1373                                      int dst_width);
1374 void ScaleUVRowUp2_Linear_RVV(const uint8_t* src_ptr,
1375                               uint8_t* dst_ptr,
1376                               int dst_width);
1377 void ScaleUVRowUp2_Bilinear_RVV(const uint8_t* src_ptr,
1378                                 ptrdiff_t src_stride,
1379                                 uint8_t* dst_ptr,
1380                                 ptrdiff_t dst_stride,
1381                                 int dst_width);
1382 void ScaleUVRowUp2_Linear_16_SSE41(const uint16_t* src_ptr,
1383                                    uint16_t* dst_ptr,
1384                                    int dst_width);
1385 void ScaleUVRowUp2_Bilinear_16_SSE41(const uint16_t* src_ptr,
1386                                      ptrdiff_t src_stride,
1387                                      uint16_t* dst_ptr,
1388                                      ptrdiff_t dst_stride,
1389                                      int dst_width);
1390 void ScaleUVRowUp2_Linear_16_Any_SSE41(const uint16_t* src_ptr,
1391                                        uint16_t* dst_ptr,
1392                                        int dst_width);
1393 void ScaleUVRowUp2_Bilinear_16_Any_SSE41(const uint16_t* src_ptr,
1394                                          ptrdiff_t src_stride,
1395                                          uint16_t* dst_ptr,
1396                                          ptrdiff_t dst_stride,
1397                                          int dst_width);
1398 void ScaleUVRowUp2_Linear_16_AVX2(const uint16_t* src_ptr,
1399                                   uint16_t* dst_ptr,
1400                                   int dst_width);
1401 void ScaleUVRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr,
1402                                     ptrdiff_t src_stride,
1403                                     uint16_t* dst_ptr,
1404                                     ptrdiff_t dst_stride,
1405                                     int dst_width);
1406 void ScaleUVRowUp2_Linear_16_Any_AVX2(const uint16_t* src_ptr,
1407                                       uint16_t* dst_ptr,
1408                                       int dst_width);
1409 void ScaleUVRowUp2_Bilinear_16_Any_AVX2(const uint16_t* src_ptr,
1410                                         ptrdiff_t src_stride,
1411                                         uint16_t* dst_ptr,
1412                                         ptrdiff_t dst_stride,
1413                                         int dst_width);
1414 void ScaleUVRowUp2_Linear_16_NEON(const uint16_t* src_ptr,
1415                                   uint16_t* dst_ptr,
1416                                   int dst_width);
1417 void ScaleUVRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr,
1418                                     ptrdiff_t src_stride,
1419                                     uint16_t* dst_ptr,
1420                                     ptrdiff_t dst_stride,
1421                                     int dst_width);
1422 void ScaleUVRowUp2_Linear_16_Any_NEON(const uint16_t* src_ptr,
1423                                       uint16_t* dst_ptr,
1424                                       int dst_width);
1425 void ScaleUVRowUp2_Bilinear_16_Any_NEON(const uint16_t* src_ptr,
1426                                         ptrdiff_t src_stride,
1427                                         uint16_t* dst_ptr,
1428                                         ptrdiff_t dst_stride,
1429                                         int dst_width);
1430 
1431 // ScaleRowDown2Box also used by planar functions
1432 // NEON downscalers with interpolation.
1433 
1434 // Note - not static due to reuse in convert for 444 to 420.
1435 void ScaleRowDown2_NEON(const uint8_t* src_ptr,
1436                         ptrdiff_t src_stride,
1437                         uint8_t* dst,
1438                         int dst_width);
1439 void ScaleRowDown2Linear_NEON(const uint8_t* src_ptr,
1440                               ptrdiff_t src_stride,
1441                               uint8_t* dst,
1442                               int dst_width);
1443 void ScaleRowDown2Box_NEON(const uint8_t* src_ptr,
1444                            ptrdiff_t src_stride,
1445                            uint8_t* dst,
1446                            int dst_width);
1447 
1448 void ScaleRowDown4_NEON(const uint8_t* src_ptr,
1449                         ptrdiff_t src_stride,
1450                         uint8_t* dst_ptr,
1451                         int dst_width);
1452 void ScaleRowDown4Box_NEON(const uint8_t* src_ptr,
1453                            ptrdiff_t src_stride,
1454                            uint8_t* dst_ptr,
1455                            int dst_width);
1456 
1457 // Down scale from 4 to 3 pixels. Use the neon multilane read/write
1458 //  to load up the every 4th pixel into a 4 different registers.
1459 // Point samples 32 pixels to 24 pixels.
1460 void ScaleRowDown34_NEON(const uint8_t* src_ptr,
1461                          ptrdiff_t src_stride,
1462                          uint8_t* dst_ptr,
1463                          int dst_width);
1464 void ScaleRowDown34_0_Box_NEON(const uint8_t* src_ptr,
1465                                ptrdiff_t src_stride,
1466                                uint8_t* dst_ptr,
1467                                int dst_width);
1468 void ScaleRowDown34_1_Box_NEON(const uint8_t* src_ptr,
1469                                ptrdiff_t src_stride,
1470                                uint8_t* dst_ptr,
1471                                int dst_width);
1472 
1473 // 32 -> 12
1474 void ScaleRowDown38_NEON(const uint8_t* src_ptr,
1475                          ptrdiff_t src_stride,
1476                          uint8_t* dst_ptr,
1477                          int dst_width);
1478 // 32x3 -> 12x1
1479 void ScaleRowDown38_3_Box_NEON(const uint8_t* src_ptr,
1480                                ptrdiff_t src_stride,
1481                                uint8_t* dst_ptr,
1482                                int dst_width);
1483 // 32x2 -> 12x1
1484 void ScaleRowDown38_2_Box_NEON(const uint8_t* src_ptr,
1485                                ptrdiff_t src_stride,
1486                                uint8_t* dst_ptr,
1487                                int dst_width);
1488 
1489 void ScaleRowDown2_Any_NEON(const uint8_t* src_ptr,
1490                             ptrdiff_t src_stride,
1491                             uint8_t* dst_ptr,
1492                             int dst_width);
1493 void ScaleRowDown2Linear_Any_NEON(const uint8_t* src_ptr,
1494                                   ptrdiff_t src_stride,
1495                                   uint8_t* dst_ptr,
1496                                   int dst_width);
1497 void ScaleRowDown2Box_Any_NEON(const uint8_t* src_ptr,
1498                                ptrdiff_t src_stride,
1499                                uint8_t* dst_ptr,
1500                                int dst_width);
1501 void ScaleRowDown2Box_Odd_NEON(const uint8_t* src_ptr,
1502                                ptrdiff_t src_stride,
1503                                uint8_t* dst_ptr,
1504                                int dst_width);
1505 void ScaleRowDown4_Any_NEON(const uint8_t* src_ptr,
1506                             ptrdiff_t src_stride,
1507                             uint8_t* dst_ptr,
1508                             int dst_width);
1509 void ScaleRowDown4Box_Any_NEON(const uint8_t* src_ptr,
1510                                ptrdiff_t src_stride,
1511                                uint8_t* dst_ptr,
1512                                int dst_width);
1513 void ScaleRowDown34_Any_NEON(const uint8_t* src_ptr,
1514                              ptrdiff_t src_stride,
1515                              uint8_t* dst_ptr,
1516                              int dst_width);
1517 void ScaleRowDown34_0_Box_Any_NEON(const uint8_t* src_ptr,
1518                                    ptrdiff_t src_stride,
1519                                    uint8_t* dst_ptr,
1520                                    int dst_width);
1521 void ScaleRowDown34_1_Box_Any_NEON(const uint8_t* src_ptr,
1522                                    ptrdiff_t src_stride,
1523                                    uint8_t* dst_ptr,
1524                                    int dst_width);
1525 // 32 -> 12
1526 void ScaleRowDown38_Any_NEON(const uint8_t* src_ptr,
1527                              ptrdiff_t src_stride,
1528                              uint8_t* dst_ptr,
1529                              int dst_width);
1530 // 32x3 -> 12x1
1531 void ScaleRowDown38_3_Box_Any_NEON(const uint8_t* src_ptr,
1532                                    ptrdiff_t src_stride,
1533                                    uint8_t* dst_ptr,
1534                                    int dst_width);
1535 // 32x2 -> 12x1
1536 void ScaleRowDown38_2_Box_Any_NEON(const uint8_t* src_ptr,
1537                                    ptrdiff_t src_stride,
1538                                    uint8_t* dst_ptr,
1539                                    int dst_width);
1540 
1541 void ScaleRowUp2_Linear_NEON(const uint8_t* src_ptr,
1542                              uint8_t* dst_ptr,
1543                              int dst_width);
1544 void ScaleRowUp2_Bilinear_NEON(const uint8_t* src_ptr,
1545                                ptrdiff_t src_stride,
1546                                uint8_t* dst_ptr,
1547                                ptrdiff_t dst_stride,
1548                                int dst_width);
1549 void ScaleRowUp2_Linear_12_NEON(const uint16_t* src_ptr,
1550                                 uint16_t* dst_ptr,
1551                                 int dst_width);
1552 void ScaleRowUp2_Bilinear_12_NEON(const uint16_t* src_ptr,
1553                                   ptrdiff_t src_stride,
1554                                   uint16_t* dst_ptr,
1555                                   ptrdiff_t dst_stride,
1556                                   int dst_width);
1557 void ScaleRowUp2_Linear_16_NEON(const uint16_t* src_ptr,
1558                                 uint16_t* dst_ptr,
1559                                 int dst_width);
1560 void ScaleRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr,
1561                                   ptrdiff_t src_stride,
1562                                   uint16_t* dst_ptr,
1563                                   ptrdiff_t dst_stride,
1564                                   int dst_width);
1565 void ScaleRowUp2_Linear_Any_NEON(const uint8_t* src_ptr,
1566                                  uint8_t* dst_ptr,
1567                                  int dst_width);
1568 void ScaleRowUp2_Bilinear_Any_NEON(const uint8_t* src_ptr,
1569                                    ptrdiff_t src_stride,
1570                                    uint8_t* dst_ptr,
1571                                    ptrdiff_t dst_stride,
1572                                    int dst_width);
1573 void ScaleRowUp2_Linear_12_Any_NEON(const uint16_t* src_ptr,
1574                                     uint16_t* dst_ptr,
1575                                     int dst_width);
1576 void ScaleRowUp2_Bilinear_12_Any_NEON(const uint16_t* src_ptr,
1577                                       ptrdiff_t src_stride,
1578                                       uint16_t* dst_ptr,
1579                                       ptrdiff_t dst_stride,
1580                                       int dst_width);
1581 void ScaleRowUp2_Linear_16_Any_NEON(const uint16_t* src_ptr,
1582                                     uint16_t* dst_ptr,
1583                                     int dst_width);
1584 void ScaleRowUp2_Bilinear_16_Any_NEON(const uint16_t* src_ptr,
1585                                       ptrdiff_t src_stride,
1586                                       uint16_t* dst_ptr,
1587                                       ptrdiff_t dst_stride,
1588                                       int dst_width);
1589 
1590 void ScaleAddRow_NEON(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
1591 void ScaleAddRow_Any_NEON(const uint8_t* src_ptr,
1592                           uint16_t* dst_ptr,
1593                           int src_width);
1594 
1595 void ScaleFilterCols_NEON(uint8_t* dst_ptr,
1596                           const uint8_t* src_ptr,
1597                           int dst_width,
1598                           int x,
1599                           int dx);
1600 
1601 void ScaleFilterCols_Any_NEON(uint8_t* dst_ptr,
1602                               const uint8_t* src_ptr,
1603                               int dst_width,
1604                               int x,
1605                               int dx);
1606 
1607 void ScaleRowDown2_MSA(const uint8_t* src_ptr,
1608                        ptrdiff_t src_stride,
1609                        uint8_t* dst,
1610                        int dst_width);
1611 void ScaleRowDown2Linear_MSA(const uint8_t* src_ptr,
1612                              ptrdiff_t src_stride,
1613                              uint8_t* dst,
1614                              int dst_width);
1615 void ScaleRowDown2Box_MSA(const uint8_t* src_ptr,
1616                           ptrdiff_t src_stride,
1617                           uint8_t* dst,
1618                           int dst_width);
1619 void ScaleRowDown4_MSA(const uint8_t* src_ptr,
1620                        ptrdiff_t src_stride,
1621                        uint8_t* dst,
1622                        int dst_width);
1623 void ScaleRowDown4Box_MSA(const uint8_t* src_ptr,
1624                           ptrdiff_t src_stride,
1625                           uint8_t* dst,
1626                           int dst_width);
1627 void ScaleRowDown38_MSA(const uint8_t* src_ptr,
1628                         ptrdiff_t src_stride,
1629                         uint8_t* dst,
1630                         int dst_width);
1631 void ScaleRowDown38_2_Box_MSA(const uint8_t* src_ptr,
1632                               ptrdiff_t src_stride,
1633                               uint8_t* dst_ptr,
1634                               int dst_width);
1635 void ScaleRowDown38_3_Box_MSA(const uint8_t* src_ptr,
1636                               ptrdiff_t src_stride,
1637                               uint8_t* dst_ptr,
1638                               int dst_width);
1639 void ScaleAddRow_MSA(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
1640 void ScaleFilterCols_MSA(uint8_t* dst_ptr,
1641                          const uint8_t* src_ptr,
1642                          int dst_width,
1643                          int x,
1644                          int dx);
1645 void ScaleRowDown34_MSA(const uint8_t* src_ptr,
1646                         ptrdiff_t src_stride,
1647                         uint8_t* dst,
1648                         int dst_width);
1649 void ScaleRowDown34_0_Box_MSA(const uint8_t* src_ptr,
1650                               ptrdiff_t src_stride,
1651                               uint8_t* d,
1652                               int dst_width);
1653 void ScaleRowDown34_1_Box_MSA(const uint8_t* src_ptr,
1654                               ptrdiff_t src_stride,
1655                               uint8_t* d,
1656                               int dst_width);
1657 
1658 void ScaleRowDown2_Any_MSA(const uint8_t* src_ptr,
1659                            ptrdiff_t src_stride,
1660                            uint8_t* dst_ptr,
1661                            int dst_width);
1662 void ScaleRowDown2Linear_Any_MSA(const uint8_t* src_ptr,
1663                                  ptrdiff_t src_stride,
1664                                  uint8_t* dst_ptr,
1665                                  int dst_width);
1666 void ScaleRowDown2Box_Any_MSA(const uint8_t* src_ptr,
1667                               ptrdiff_t src_stride,
1668                               uint8_t* dst_ptr,
1669                               int dst_width);
1670 void ScaleRowDown4_Any_MSA(const uint8_t* src_ptr,
1671                            ptrdiff_t src_stride,
1672                            uint8_t* dst_ptr,
1673                            int dst_width);
1674 void ScaleRowDown4Box_Any_MSA(const uint8_t* src_ptr,
1675                               ptrdiff_t src_stride,
1676                               uint8_t* dst_ptr,
1677                               int dst_width);
1678 void ScaleRowDown38_Any_MSA(const uint8_t* src_ptr,
1679                             ptrdiff_t src_stride,
1680                             uint8_t* dst_ptr,
1681                             int dst_width);
1682 void ScaleRowDown38_2_Box_Any_MSA(const uint8_t* src_ptr,
1683                                   ptrdiff_t src_stride,
1684                                   uint8_t* dst_ptr,
1685                                   int dst_width);
1686 void ScaleRowDown38_3_Box_Any_MSA(const uint8_t* src_ptr,
1687                                   ptrdiff_t src_stride,
1688                                   uint8_t* dst_ptr,
1689                                   int dst_width);
1690 void ScaleAddRow_Any_MSA(const uint8_t* src_ptr,
1691                          uint16_t* dst_ptr,
1692                          int src_width);
1693 void ScaleFilterCols_Any_MSA(uint8_t* dst_ptr,
1694                              const uint8_t* src_ptr,
1695                              int dst_width,
1696                              int x,
1697                              int dx);
1698 void ScaleRowDown34_Any_MSA(const uint8_t* src_ptr,
1699                             ptrdiff_t src_stride,
1700                             uint8_t* dst_ptr,
1701                             int dst_width);
1702 void ScaleRowDown34_0_Box_Any_MSA(const uint8_t* src_ptr,
1703                                   ptrdiff_t src_stride,
1704                                   uint8_t* dst_ptr,
1705                                   int dst_width);
1706 void ScaleRowDown34_1_Box_Any_MSA(const uint8_t* src_ptr,
1707                                   ptrdiff_t src_stride,
1708                                   uint8_t* dst_ptr,
1709                                   int dst_width);
1710 
1711 void ScaleRowDown2_LSX(const uint8_t* src_ptr,
1712                        ptrdiff_t src_stride,
1713                        uint8_t* dst,
1714                        int dst_width);
1715 void ScaleRowDown2Linear_LSX(const uint8_t* src_ptr,
1716                              ptrdiff_t src_stride,
1717                              uint8_t* dst,
1718                              int dst_width);
1719 void ScaleRowDown2Box_LSX(const uint8_t* src_ptr,
1720                           ptrdiff_t src_stride,
1721                           uint8_t* dst,
1722                           int dst_width);
1723 void ScaleRowDown4_LSX(const uint8_t* src_ptr,
1724                        ptrdiff_t src_stride,
1725                        uint8_t* dst,
1726                        int dst_width);
1727 void ScaleRowDown4Box_LSX(const uint8_t* src_ptr,
1728                           ptrdiff_t src_stride,
1729                           uint8_t* dst,
1730                           int dst_width);
1731 void ScaleRowDown38_LSX(const uint8_t* src_ptr,
1732                         ptrdiff_t src_stride,
1733                         uint8_t* dst,
1734                         int dst_width);
1735 void ScaleRowDown38_2_Box_LSX(const uint8_t* src_ptr,
1736                               ptrdiff_t src_stride,
1737                               uint8_t* dst_ptr,
1738                               int dst_width);
1739 void ScaleRowDown38_3_Box_LSX(const uint8_t* src_ptr,
1740                               ptrdiff_t src_stride,
1741                               uint8_t* dst_ptr,
1742                               int dst_width);
1743 void ScaleAddRow_LSX(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
1744 void ScaleFilterCols_LSX(uint8_t* dst_ptr,
1745                          const uint8_t* src_ptr,
1746                          int dst_width,
1747                          int x,
1748                          int dx);
1749 void ScaleARGBFilterCols_LSX(uint8_t* dst_argb,
1750                              const uint8_t* src_argb,
1751                              int dst_width,
1752                              int x,
1753                              int dx);
1754 void ScaleARGBCols_LSX(uint8_t* dst_argb,
1755                        const uint8_t* src_argb,
1756                        int dst_width,
1757                        int x,
1758                        int dx);
1759 void ScaleRowDown34_LSX(const uint8_t* src_ptr,
1760                         ptrdiff_t src_stride,
1761                         uint8_t* dst,
1762                         int dst_width);
1763 void ScaleRowDown34_0_Box_LSX(const uint8_t* src_ptr,
1764                               ptrdiff_t src_stride,
1765                               uint8_t* d,
1766                               int dst_width);
1767 void ScaleRowDown34_1_Box_LSX(const uint8_t* src_ptr,
1768                               ptrdiff_t src_stride,
1769                               uint8_t* d,
1770                               int dst_width);
1771 void ScaleRowDown2_Any_LSX(const uint8_t* src_ptr,
1772                            ptrdiff_t src_stride,
1773                            uint8_t* dst_ptr,
1774                            int dst_width);
1775 void ScaleRowDown2Linear_Any_LSX(const uint8_t* src_ptr,
1776                                  ptrdiff_t src_stride,
1777                                  uint8_t* dst_ptr,
1778                                  int dst_width);
1779 void ScaleRowDown2Box_Any_LSX(const uint8_t* src_ptr,
1780                               ptrdiff_t src_stride,
1781                               uint8_t* dst_ptr,
1782                               int dst_width);
1783 void ScaleRowDown4_Any_LSX(const uint8_t* src_ptr,
1784                            ptrdiff_t src_stride,
1785                            uint8_t* dst_ptr,
1786                            int dst_width);
1787 void ScaleRowDown4Box_Any_LSX(const uint8_t* src_ptr,
1788                               ptrdiff_t src_stride,
1789                               uint8_t* dst_ptr,
1790                               int dst_width);
1791 void ScaleRowDown38_Any_LSX(const uint8_t* src_ptr,
1792                             ptrdiff_t src_stride,
1793                             uint8_t* dst_ptr,
1794                             int dst_width);
1795 void ScaleRowDown38_2_Box_Any_LSX(const uint8_t* src_ptr,
1796                                   ptrdiff_t src_stride,
1797                                   uint8_t* dst_ptr,
1798                                   int dst_width);
1799 void ScaleRowDown38_3_Box_Any_LSX(const uint8_t* src_ptr,
1800                                   ptrdiff_t src_stride,
1801                                   uint8_t* dst_ptr,
1802                                   int dst_width);
1803 void ScaleAddRow_Any_LSX(const uint8_t* src_ptr,
1804                          uint16_t* dst_ptr,
1805                          int src_width);
1806 void ScaleFilterCols_Any_LSX(uint8_t* dst_ptr,
1807                              const uint8_t* src_ptr,
1808                              int dst_width,
1809                              int x,
1810                              int dx);
1811 void ScaleARGBCols_Any_LSX(uint8_t* dst_ptr,
1812                            const uint8_t* src_ptr,
1813                            int dst_width,
1814                            int x,
1815                            int dx);
1816 void ScaleARGBFilterCols_Any_LSX(uint8_t* dst_ptr,
1817                                  const uint8_t* src_ptr,
1818                                  int dst_width,
1819                                  int x,
1820                                  int dx);
1821 void ScaleRowDown34_Any_LSX(const uint8_t* src_ptr,
1822                             ptrdiff_t src_stride,
1823                             uint8_t* dst_ptr,
1824                             int dst_width);
1825 void ScaleRowDown34_0_Box_Any_LSX(const uint8_t* src_ptr,
1826                                   ptrdiff_t src_stride,
1827                                   uint8_t* dst_ptr,
1828                                   int dst_width);
1829 void ScaleRowDown34_1_Box_Any_LSX(const uint8_t* src_ptr,
1830                                   ptrdiff_t src_stride,
1831                                   uint8_t* dst_ptr,
1832                                   int dst_width);
1833 
1834 void ScaleAddRow_RVV(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
1835 void ScaleRowDown2_RVV(const uint8_t* src_ptr,
1836                        ptrdiff_t src_stride,
1837                        uint8_t* dst,
1838                        int dst_width);
1839 void ScaleRowDown2Linear_RVV(const uint8_t* src_ptr,
1840                              ptrdiff_t src_stride,
1841                              uint8_t* dst,
1842                              int dst_width);
1843 void ScaleRowDown2Box_RVV(const uint8_t* src_ptr,
1844                           ptrdiff_t src_stride,
1845                           uint8_t* dst,
1846                           int dst_width);
1847 
1848 void ScaleRowDown4_RVV(const uint8_t* src_ptr,
1849                        ptrdiff_t src_stride,
1850                        uint8_t* dst_ptr,
1851                        int dst_width);
1852 void ScaleRowDown4Box_RVV(const uint8_t* src_ptr,
1853                           ptrdiff_t src_stride,
1854                           uint8_t* dst_ptr,
1855                           int dst_width);
1856 void ScaleRowDown34_RVV(const uint8_t* src_ptr,
1857                         ptrdiff_t src_stride,
1858                         uint8_t* dst_ptr,
1859                         int dst_width);
1860 void ScaleRowDown34_0_Box_RVV(const uint8_t* src_ptr,
1861                               ptrdiff_t src_stride,
1862                               uint8_t* dst_ptr,
1863                               int dst_width);
1864 void ScaleRowDown34_1_Box_RVV(const uint8_t* src_ptr,
1865                               ptrdiff_t src_stride,
1866                               uint8_t* dst_ptr,
1867                               int dst_width);
1868 void ScaleRowDown38_RVV(const uint8_t* src_ptr,
1869                         ptrdiff_t src_stride,
1870                         uint8_t* dst,
1871                         int dst_width);
1872 void ScaleRowDown38_3_Box_RVV(const uint8_t* src_ptr,
1873                               ptrdiff_t src_stride,
1874                               uint8_t* dst_ptr,
1875                               int dst_width);
1876 void ScaleRowDown38_2_Box_RVV(const uint8_t* src_ptr,
1877                               ptrdiff_t src_stride,
1878                               uint8_t* dst_ptr,
1879                               int dst_width);
1880 
1881 void ScaleRowUp2_Linear_RVV(const uint8_t* src_ptr,
1882                             uint8_t* dst_ptr,
1883                             int dst_width);
1884 void ScaleRowUp2_Bilinear_RVV(const uint8_t* src_ptr,
1885                               ptrdiff_t src_stride,
1886                               uint8_t* dst_ptr,
1887                               ptrdiff_t dst_stride,
1888                               int dst_width);
1889 #ifdef __cplusplus
1890 }  // extern "C"
1891 }  // namespace libyuv
1892 #endif
1893 
1894 #endif  // INCLUDE_LIBYUV_SCALE_ROW_H_
1895