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