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(__i386__) && !defined(__SSE2__))
24 #define LIBYUV_DISABLE_X86
25 #endif
26 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
27 #if defined(__has_feature)
28 #if __has_feature(memory_sanitizer)
29 #define LIBYUV_DISABLE_X86
30 #endif
31 #endif
32 
33 // GCC >= 4.7.0 required for AVX2.
34 #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
35 #if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7))
36 #define GCC_HAS_AVX2 1
37 #endif  // GNUC >= 4.7
38 #endif  // __GNUC__
39 
40 // clang >= 3.4.0 required for AVX2.
41 #if defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
42 #if (__clang_major__ > 3) || (__clang_major__ == 3 && (__clang_minor__ >= 4))
43 #define CLANG_HAS_AVX2 1
44 #endif  // clang >= 3.4
45 #endif  // __clang__
46 
47 // Visual C 2012 required for AVX2.
48 #if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \
49     _MSC_VER >= 1700
50 #define VISUALC_HAS_AVX2 1
51 #endif  // VisualStudio >= 2012
52 
53 // The following are available on all x86 platforms:
54 #if !defined(LIBYUV_DISABLE_X86) && \
55     (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
56 #define HAS_FIXEDDIV1_X86
57 #define HAS_FIXEDDIV_X86
58 #define HAS_SCALEARGBCOLS_SSE2
59 #define HAS_SCALEARGBCOLSUP2_SSE2
60 #define HAS_SCALEARGBFILTERCOLS_SSSE3
61 #define HAS_SCALEARGBROWDOWN2_SSE2
62 #define HAS_SCALEARGBROWDOWNEVEN_SSE2
63 #define HAS_SCALECOLSUP2_SSE2
64 #define HAS_SCALEFILTERCOLS_SSSE3
65 #define HAS_SCALEROWDOWN2_SSSE3
66 #define HAS_SCALEROWDOWN34_SSSE3
67 #define HAS_SCALEROWDOWN38_SSSE3
68 #define HAS_SCALEROWDOWN4_SSSE3
69 #define HAS_SCALEADDROW_SSE2
70 #endif
71 
72 // The following are available on all x86 platforms, but
73 // require VS2012, clang 3.4 or gcc 4.7.
74 // The code supports NaCL but requires a new compiler and validator.
75 #if !defined(LIBYUV_DISABLE_X86) &&                          \
76     (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \
77      defined(GCC_HAS_AVX2))
78 #define HAS_SCALEADDROW_AVX2
79 #define HAS_SCALEROWDOWN2_AVX2
80 #define HAS_SCALEROWDOWN4_AVX2
81 #endif
82 
83 // The following are available on Neon platforms:
84 #if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \
85     (defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__))
86 #define HAS_SCALEARGBCOLS_NEON
87 #define HAS_SCALEARGBROWDOWN2_NEON
88 #define HAS_SCALEARGBROWDOWNEVEN_NEON
89 #define HAS_SCALEFILTERCOLS_NEON
90 #define HAS_SCALEROWDOWN2_NEON
91 #define HAS_SCALEROWDOWN34_NEON
92 #define HAS_SCALEROWDOWN38_NEON
93 #define HAS_SCALEROWDOWN4_NEON
94 #define HAS_SCALEARGBFILTERCOLS_NEON
95 #endif
96 
97 // The following are available on Mips platforms:
98 #if !defined(LIBYUV_DISABLE_DSPR2) && !defined(__native_client__) && \
99     defined(__mips__) && defined(__mips_dsp) && (__mips_dsp_rev >= 2)
100 #define HAS_SCALEROWDOWN2_DSPR2
101 #define HAS_SCALEROWDOWN4_DSPR2
102 #define HAS_SCALEROWDOWN34_DSPR2
103 #define HAS_SCALEROWDOWN38_DSPR2
104 #define HAS_SCALEADDROW_DSPR2
105 #endif
106 
107 #if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa)
108 #define HAS_SCALEARGBROWDOWN2_MSA
109 #define HAS_SCALEARGBROWDOWNEVEN_MSA
110 #define HAS_SCALEROWDOWN2_MSA
111 #define HAS_SCALEROWDOWN4_MSA
112 #define HAS_SCALEROWDOWN38_MSA
113 #define HAS_SCALEADDROW_MSA
114 #endif
115 
116 // Scale ARGB vertically with bilinear interpolation.
117 void ScalePlaneVertical(int src_height,
118                         int dst_width,
119                         int dst_height,
120                         int src_stride,
121                         int dst_stride,
122                         const uint8* src_argb,
123                         uint8* dst_argb,
124                         int x,
125                         int y,
126                         int dy,
127                         int bpp,
128                         enum FilterMode filtering);
129 
130 void ScalePlaneVertical_16(int src_height,
131                            int dst_width,
132                            int dst_height,
133                            int src_stride,
134                            int dst_stride,
135                            const uint16* src_argb,
136                            uint16* dst_argb,
137                            int x,
138                            int y,
139                            int dy,
140                            int wpp,
141                            enum FilterMode filtering);
142 
143 // Simplify the filtering based on scale factors.
144 enum FilterMode ScaleFilterReduce(int src_width,
145                                   int src_height,
146                                   int dst_width,
147                                   int dst_height,
148                                   enum FilterMode filtering);
149 
150 // Divide num by div and return as 16.16 fixed point result.
151 int FixedDiv_C(int num, int div);
152 int FixedDiv_X86(int num, int div);
153 // Divide num - 1 by div - 1 and return as 16.16 fixed point result.
154 int FixedDiv1_C(int num, int div);
155 int FixedDiv1_X86(int num, int div);
156 #ifdef HAS_FIXEDDIV_X86
157 #define FixedDiv FixedDiv_X86
158 #define FixedDiv1 FixedDiv1_X86
159 #else
160 #define FixedDiv FixedDiv_C
161 #define FixedDiv1 FixedDiv1_C
162 #endif
163 
164 // Compute slope values for stepping.
165 void ScaleSlope(int src_width,
166                 int src_height,
167                 int dst_width,
168                 int dst_height,
169                 enum FilterMode filtering,
170                 int* x,
171                 int* y,
172                 int* dx,
173                 int* dy);
174 
175 void ScaleRowDown2_C(const uint8* src_ptr,
176                      ptrdiff_t src_stride,
177                      uint8* dst,
178                      int dst_width);
179 void ScaleRowDown2_16_C(const uint16* src_ptr,
180                         ptrdiff_t src_stride,
181                         uint16* dst,
182                         int dst_width);
183 void ScaleRowDown2Linear_C(const uint8* src_ptr,
184                            ptrdiff_t src_stride,
185                            uint8* dst,
186                            int dst_width);
187 void ScaleRowDown2Linear_16_C(const uint16* src_ptr,
188                               ptrdiff_t src_stride,
189                               uint16* dst,
190                               int dst_width);
191 void ScaleRowDown2Box_C(const uint8* src_ptr,
192                         ptrdiff_t src_stride,
193                         uint8* dst,
194                         int dst_width);
195 void ScaleRowDown2Box_Odd_C(const uint8* src_ptr,
196                             ptrdiff_t src_stride,
197                             uint8* dst,
198                             int dst_width);
199 void ScaleRowDown2Box_16_C(const uint16* src_ptr,
200                            ptrdiff_t src_stride,
201                            uint16* dst,
202                            int dst_width);
203 void ScaleRowDown4_C(const uint8* src_ptr,
204                      ptrdiff_t src_stride,
205                      uint8* dst,
206                      int dst_width);
207 void ScaleRowDown4_16_C(const uint16* src_ptr,
208                         ptrdiff_t src_stride,
209                         uint16* dst,
210                         int dst_width);
211 void ScaleRowDown4Box_C(const uint8* src_ptr,
212                         ptrdiff_t src_stride,
213                         uint8* dst,
214                         int dst_width);
215 void ScaleRowDown4Box_16_C(const uint16* src_ptr,
216                            ptrdiff_t src_stride,
217                            uint16* dst,
218                            int dst_width);
219 void ScaleRowDown34_C(const uint8* src_ptr,
220                       ptrdiff_t src_stride,
221                       uint8* dst,
222                       int dst_width);
223 void ScaleRowDown34_16_C(const uint16* src_ptr,
224                          ptrdiff_t src_stride,
225                          uint16* dst,
226                          int dst_width);
227 void ScaleRowDown34_0_Box_C(const uint8* src_ptr,
228                             ptrdiff_t src_stride,
229                             uint8* d,
230                             int dst_width);
231 void ScaleRowDown34_0_Box_16_C(const uint16* src_ptr,
232                                ptrdiff_t src_stride,
233                                uint16* d,
234                                int dst_width);
235 void ScaleRowDown34_1_Box_C(const uint8* src_ptr,
236                             ptrdiff_t src_stride,
237                             uint8* d,
238                             int dst_width);
239 void ScaleRowDown34_1_Box_16_C(const uint16* src_ptr,
240                                ptrdiff_t src_stride,
241                                uint16* d,
242                                int dst_width);
243 void ScaleCols_C(uint8* dst_ptr,
244                  const uint8* src_ptr,
245                  int dst_width,
246                  int x,
247                  int dx);
248 void ScaleCols_16_C(uint16* dst_ptr,
249                     const uint16* src_ptr,
250                     int dst_width,
251                     int x,
252                     int dx);
253 void ScaleColsUp2_C(uint8* dst_ptr,
254                     const uint8* src_ptr,
255                     int dst_width,
256                     int,
257                     int);
258 void ScaleColsUp2_16_C(uint16* dst_ptr,
259                        const uint16* src_ptr,
260                        int dst_width,
261                        int,
262                        int);
263 void ScaleFilterCols_C(uint8* dst_ptr,
264                        const uint8* src_ptr,
265                        int dst_width,
266                        int x,
267                        int dx);
268 void ScaleFilterCols_16_C(uint16* dst_ptr,
269                           const uint16* src_ptr,
270                           int dst_width,
271                           int x,
272                           int dx);
273 void ScaleFilterCols64_C(uint8* dst_ptr,
274                          const uint8* src_ptr,
275                          int dst_width,
276                          int x,
277                          int dx);
278 void ScaleFilterCols64_16_C(uint16* dst_ptr,
279                             const uint16* src_ptr,
280                             int dst_width,
281                             int x,
282                             int dx);
283 void ScaleRowDown38_C(const uint8* src_ptr,
284                       ptrdiff_t src_stride,
285                       uint8* dst,
286                       int dst_width);
287 void ScaleRowDown38_16_C(const uint16* src_ptr,
288                          ptrdiff_t src_stride,
289                          uint16* dst,
290                          int dst_width);
291 void ScaleRowDown38_3_Box_C(const uint8* src_ptr,
292                             ptrdiff_t src_stride,
293                             uint8* dst_ptr,
294                             int dst_width);
295 void ScaleRowDown38_3_Box_16_C(const uint16* src_ptr,
296                                ptrdiff_t src_stride,
297                                uint16* dst_ptr,
298                                int dst_width);
299 void ScaleRowDown38_2_Box_C(const uint8* src_ptr,
300                             ptrdiff_t src_stride,
301                             uint8* dst_ptr,
302                             int dst_width);
303 void ScaleRowDown38_2_Box_16_C(const uint16* src_ptr,
304                                ptrdiff_t src_stride,
305                                uint16* dst_ptr,
306                                int dst_width);
307 void ScaleAddRow_C(const uint8* src_ptr, uint16* dst_ptr, int src_width);
308 void ScaleAddRow_16_C(const uint16* src_ptr, uint32* dst_ptr, int src_width);
309 void ScaleARGBRowDown2_C(const uint8* src_argb,
310                          ptrdiff_t src_stride,
311                          uint8* dst_argb,
312                          int dst_width);
313 void ScaleARGBRowDown2Linear_C(const uint8* src_argb,
314                                ptrdiff_t src_stride,
315                                uint8* dst_argb,
316                                int dst_width);
317 void ScaleARGBRowDown2Box_C(const uint8* src_argb,
318                             ptrdiff_t src_stride,
319                             uint8* dst_argb,
320                             int dst_width);
321 void ScaleARGBRowDownEven_C(const uint8* src_argb,
322                             ptrdiff_t src_stride,
323                             int src_stepx,
324                             uint8* dst_argb,
325                             int dst_width);
326 void ScaleARGBRowDownEvenBox_C(const uint8* src_argb,
327                                ptrdiff_t src_stride,
328                                int src_stepx,
329                                uint8* dst_argb,
330                                int dst_width);
331 void ScaleARGBCols_C(uint8* dst_argb,
332                      const uint8* src_argb,
333                      int dst_width,
334                      int x,
335                      int dx);
336 void ScaleARGBCols64_C(uint8* dst_argb,
337                        const uint8* src_argb,
338                        int dst_width,
339                        int x,
340                        int dx);
341 void ScaleARGBColsUp2_C(uint8* dst_argb,
342                         const uint8* src_argb,
343                         int dst_width,
344                         int,
345                         int);
346 void ScaleARGBFilterCols_C(uint8* dst_argb,
347                            const uint8* src_argb,
348                            int dst_width,
349                            int x,
350                            int dx);
351 void ScaleARGBFilterCols64_C(uint8* dst_argb,
352                              const uint8* src_argb,
353                              int dst_width,
354                              int x,
355                              int dx);
356 
357 // Specialized scalers for x86.
358 void ScaleRowDown2_SSSE3(const uint8* src_ptr,
359                          ptrdiff_t src_stride,
360                          uint8* dst_ptr,
361                          int dst_width);
362 void ScaleRowDown2Linear_SSSE3(const uint8* src_ptr,
363                                ptrdiff_t src_stride,
364                                uint8* dst_ptr,
365                                int dst_width);
366 void ScaleRowDown2Box_SSSE3(const uint8* src_ptr,
367                             ptrdiff_t src_stride,
368                             uint8* dst_ptr,
369                             int dst_width);
370 void ScaleRowDown2_AVX2(const uint8* src_ptr,
371                         ptrdiff_t src_stride,
372                         uint8* dst_ptr,
373                         int dst_width);
374 void ScaleRowDown2Linear_AVX2(const uint8* src_ptr,
375                               ptrdiff_t src_stride,
376                               uint8* dst_ptr,
377                               int dst_width);
378 void ScaleRowDown2Box_AVX2(const uint8* src_ptr,
379                            ptrdiff_t src_stride,
380                            uint8* dst_ptr,
381                            int dst_width);
382 void ScaleRowDown4_SSSE3(const uint8* src_ptr,
383                          ptrdiff_t src_stride,
384                          uint8* dst_ptr,
385                          int dst_width);
386 void ScaleRowDown4Box_SSSE3(const uint8* src_ptr,
387                             ptrdiff_t src_stride,
388                             uint8* dst_ptr,
389                             int dst_width);
390 void ScaleRowDown4_AVX2(const uint8* src_ptr,
391                         ptrdiff_t src_stride,
392                         uint8* dst_ptr,
393                         int dst_width);
394 void ScaleRowDown4Box_AVX2(const uint8* src_ptr,
395                            ptrdiff_t src_stride,
396                            uint8* dst_ptr,
397                            int dst_width);
398 
399 void ScaleRowDown34_SSSE3(const uint8* src_ptr,
400                           ptrdiff_t src_stride,
401                           uint8* dst_ptr,
402                           int dst_width);
403 void ScaleRowDown34_1_Box_SSSE3(const uint8* src_ptr,
404                                 ptrdiff_t src_stride,
405                                 uint8* dst_ptr,
406                                 int dst_width);
407 void ScaleRowDown34_0_Box_SSSE3(const uint8* src_ptr,
408                                 ptrdiff_t src_stride,
409                                 uint8* dst_ptr,
410                                 int dst_width);
411 void ScaleRowDown38_SSSE3(const uint8* src_ptr,
412                           ptrdiff_t src_stride,
413                           uint8* dst_ptr,
414                           int dst_width);
415 void ScaleRowDown38_3_Box_SSSE3(const uint8* src_ptr,
416                                 ptrdiff_t src_stride,
417                                 uint8* dst_ptr,
418                                 int dst_width);
419 void ScaleRowDown38_2_Box_SSSE3(const uint8* src_ptr,
420                                 ptrdiff_t src_stride,
421                                 uint8* dst_ptr,
422                                 int dst_width);
423 void ScaleRowDown2_Any_SSSE3(const uint8* src_ptr,
424                              ptrdiff_t src_stride,
425                              uint8* dst_ptr,
426                              int dst_width);
427 void ScaleRowDown2Linear_Any_SSSE3(const uint8* src_ptr,
428                                    ptrdiff_t src_stride,
429                                    uint8* dst_ptr,
430                                    int dst_width);
431 void ScaleRowDown2Box_Any_SSSE3(const uint8* src_ptr,
432                                 ptrdiff_t src_stride,
433                                 uint8* dst_ptr,
434                                 int dst_width);
435 void ScaleRowDown2Box_Odd_SSSE3(const uint8* src_ptr,
436                                 ptrdiff_t src_stride,
437                                 uint8* dst_ptr,
438                                 int dst_width);
439 void ScaleRowDown2_Any_AVX2(const uint8* src_ptr,
440                             ptrdiff_t src_stride,
441                             uint8* dst_ptr,
442                             int dst_width);
443 void ScaleRowDown2Linear_Any_AVX2(const uint8* src_ptr,
444                                   ptrdiff_t src_stride,
445                                   uint8* dst_ptr,
446                                   int dst_width);
447 void ScaleRowDown2Box_Any_AVX2(const uint8* src_ptr,
448                                ptrdiff_t src_stride,
449                                uint8* dst_ptr,
450                                int dst_width);
451 void ScaleRowDown2Box_Odd_AVX2(const uint8* src_ptr,
452                                ptrdiff_t src_stride,
453                                uint8* dst_ptr,
454                                int dst_width);
455 void ScaleRowDown4_Any_SSSE3(const uint8* src_ptr,
456                              ptrdiff_t src_stride,
457                              uint8* dst_ptr,
458                              int dst_width);
459 void ScaleRowDown4Box_Any_SSSE3(const uint8* src_ptr,
460                                 ptrdiff_t src_stride,
461                                 uint8* dst_ptr,
462                                 int dst_width);
463 void ScaleRowDown4_Any_AVX2(const uint8* src_ptr,
464                             ptrdiff_t src_stride,
465                             uint8* dst_ptr,
466                             int dst_width);
467 void ScaleRowDown4Box_Any_AVX2(const uint8* src_ptr,
468                                ptrdiff_t src_stride,
469                                uint8* dst_ptr,
470                                int dst_width);
471 
472 void ScaleRowDown34_Any_SSSE3(const uint8* src_ptr,
473                               ptrdiff_t src_stride,
474                               uint8* dst_ptr,
475                               int dst_width);
476 void ScaleRowDown34_1_Box_Any_SSSE3(const uint8* src_ptr,
477                                     ptrdiff_t src_stride,
478                                     uint8* dst_ptr,
479                                     int dst_width);
480 void ScaleRowDown34_0_Box_Any_SSSE3(const uint8* src_ptr,
481                                     ptrdiff_t src_stride,
482                                     uint8* dst_ptr,
483                                     int dst_width);
484 void ScaleRowDown38_Any_SSSE3(const uint8* src_ptr,
485                               ptrdiff_t src_stride,
486                               uint8* dst_ptr,
487                               int dst_width);
488 void ScaleRowDown38_3_Box_Any_SSSE3(const uint8* src_ptr,
489                                     ptrdiff_t src_stride,
490                                     uint8* dst_ptr,
491                                     int dst_width);
492 void ScaleRowDown38_2_Box_Any_SSSE3(const uint8* src_ptr,
493                                     ptrdiff_t src_stride,
494                                     uint8* dst_ptr,
495                                     int dst_width);
496 
497 void ScaleAddRow_SSE2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
498 void ScaleAddRow_AVX2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
499 void ScaleAddRow_Any_SSE2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
500 void ScaleAddRow_Any_AVX2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
501 
502 void ScaleFilterCols_SSSE3(uint8* dst_ptr,
503                            const uint8* src_ptr,
504                            int dst_width,
505                            int x,
506                            int dx);
507 void ScaleColsUp2_SSE2(uint8* dst_ptr,
508                        const uint8* src_ptr,
509                        int dst_width,
510                        int x,
511                        int dx);
512 
513 // ARGB Column functions
514 void ScaleARGBCols_SSE2(uint8* dst_argb,
515                         const uint8* src_argb,
516                         int dst_width,
517                         int x,
518                         int dx);
519 void ScaleARGBFilterCols_SSSE3(uint8* dst_argb,
520                                const uint8* src_argb,
521                                int dst_width,
522                                int x,
523                                int dx);
524 void ScaleARGBColsUp2_SSE2(uint8* dst_argb,
525                            const uint8* src_argb,
526                            int dst_width,
527                            int x,
528                            int dx);
529 void ScaleARGBFilterCols_NEON(uint8* dst_argb,
530                               const uint8* src_argb,
531                               int dst_width,
532                               int x,
533                               int dx);
534 void ScaleARGBCols_NEON(uint8* dst_argb,
535                         const uint8* src_argb,
536                         int dst_width,
537                         int x,
538                         int dx);
539 void ScaleARGBFilterCols_Any_NEON(uint8* dst_argb,
540                                   const uint8* src_argb,
541                                   int dst_width,
542                                   int x,
543                                   int dx);
544 void ScaleARGBCols_Any_NEON(uint8* dst_argb,
545                             const uint8* src_argb,
546                             int dst_width,
547                             int x,
548                             int dx);
549 
550 // ARGB Row functions
551 void ScaleARGBRowDown2_SSE2(const uint8* src_argb,
552                             ptrdiff_t src_stride,
553                             uint8* dst_argb,
554                             int dst_width);
555 void ScaleARGBRowDown2Linear_SSE2(const uint8* src_argb,
556                                   ptrdiff_t src_stride,
557                                   uint8* dst_argb,
558                                   int dst_width);
559 void ScaleARGBRowDown2Box_SSE2(const uint8* src_argb,
560                                ptrdiff_t src_stride,
561                                uint8* dst_argb,
562                                int dst_width);
563 void ScaleARGBRowDown2_NEON(const uint8* src_ptr,
564                             ptrdiff_t src_stride,
565                             uint8* dst,
566                             int dst_width);
567 void ScaleARGBRowDown2Linear_NEON(const uint8* src_argb,
568                                   ptrdiff_t src_stride,
569                                   uint8* dst_argb,
570                                   int dst_width);
571 void ScaleARGBRowDown2Box_NEON(const uint8* src_ptr,
572                                ptrdiff_t src_stride,
573                                uint8* dst,
574                                int dst_width);
575 void ScaleARGBRowDown2_MSA(const uint8_t* src_argb,
576                            ptrdiff_t src_stride,
577                            uint8_t* dst_argb,
578                            int dst_width);
579 void ScaleARGBRowDown2Linear_MSA(const uint8_t* src_argb,
580                                  ptrdiff_t src_stride,
581                                  uint8_t* dst_argb,
582                                  int dst_width);
583 void ScaleARGBRowDown2Box_MSA(const uint8_t* src_argb,
584                               ptrdiff_t src_stride,
585                               uint8_t* dst_argb,
586                               int dst_width);
587 void ScaleARGBRowDown2_Any_SSE2(const uint8* src_argb,
588                                 ptrdiff_t src_stride,
589                                 uint8* dst_argb,
590                                 int dst_width);
591 void ScaleARGBRowDown2Linear_Any_SSE2(const uint8* src_argb,
592                                       ptrdiff_t src_stride,
593                                       uint8* dst_argb,
594                                       int dst_width);
595 void ScaleARGBRowDown2Box_Any_SSE2(const uint8* src_argb,
596                                    ptrdiff_t src_stride,
597                                    uint8* dst_argb,
598                                    int dst_width);
599 void ScaleARGBRowDown2_Any_NEON(const uint8* src_ptr,
600                                 ptrdiff_t src_stride,
601                                 uint8* dst,
602                                 int dst_width);
603 void ScaleARGBRowDown2Linear_Any_NEON(const uint8* src_argb,
604                                       ptrdiff_t src_stride,
605                                       uint8* dst_argb,
606                                       int dst_width);
607 void ScaleARGBRowDown2Box_Any_NEON(const uint8* src_ptr,
608                                    ptrdiff_t src_stride,
609                                    uint8* dst,
610                                    int dst_width);
611 void ScaleARGBRowDown2_Any_MSA(const uint8_t* src_argb,
612                                ptrdiff_t src_stride,
613                                uint8_t* dst_argb,
614                                int dst_width);
615 void ScaleARGBRowDown2Linear_Any_MSA(const uint8_t* src_argb,
616                                      ptrdiff_t src_stride,
617                                      uint8_t* dst_argb,
618                                      int dst_width);
619 void ScaleARGBRowDown2Box_Any_MSA(const uint8_t* src_argb,
620                                   ptrdiff_t src_stride,
621                                   uint8_t* dst_argb,
622                                   int dst_width);
623 
624 void ScaleARGBRowDownEven_SSE2(const uint8* src_argb,
625                                ptrdiff_t src_stride,
626                                int src_stepx,
627                                uint8* dst_argb,
628                                int dst_width);
629 void ScaleARGBRowDownEvenBox_SSE2(const uint8* src_argb,
630                                   ptrdiff_t src_stride,
631                                   int src_stepx,
632                                   uint8* dst_argb,
633                                   int dst_width);
634 void ScaleARGBRowDownEven_NEON(const uint8* src_argb,
635                                ptrdiff_t src_stride,
636                                int src_stepx,
637                                uint8* dst_argb,
638                                int dst_width);
639 void ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb,
640                                   ptrdiff_t src_stride,
641                                   int src_stepx,
642                                   uint8* dst_argb,
643                                   int dst_width);
644 void ScaleARGBRowDownEven_MSA(const uint8_t* src_argb,
645                               ptrdiff_t src_stride,
646                               int32_t src_stepx,
647                               uint8_t* dst_argb,
648                               int dst_width);
649 void ScaleARGBRowDownEvenBox_MSA(const uint8* src_argb,
650                                  ptrdiff_t src_stride,
651                                  int src_stepx,
652                                  uint8* dst_argb,
653                                  int dst_width);
654 void ScaleARGBRowDownEven_Any_SSE2(const uint8* src_argb,
655                                    ptrdiff_t src_stride,
656                                    int src_stepx,
657                                    uint8* dst_argb,
658                                    int dst_width);
659 void ScaleARGBRowDownEvenBox_Any_SSE2(const uint8* src_argb,
660                                       ptrdiff_t src_stride,
661                                       int src_stepx,
662                                       uint8* dst_argb,
663                                       int dst_width);
664 void ScaleARGBRowDownEven_Any_NEON(const uint8* src_argb,
665                                    ptrdiff_t src_stride,
666                                    int src_stepx,
667                                    uint8* dst_argb,
668                                    int dst_width);
669 void ScaleARGBRowDownEvenBox_Any_NEON(const uint8* src_argb,
670                                       ptrdiff_t src_stride,
671                                       int src_stepx,
672                                       uint8* dst_argb,
673                                       int dst_width);
674 void ScaleARGBRowDownEven_Any_MSA(const uint8_t* src_argb,
675                                   ptrdiff_t src_stride,
676                                   int32_t src_stepx,
677                                   uint8_t* dst_argb,
678                                   int dst_width);
679 void ScaleARGBRowDownEvenBox_Any_MSA(const uint8* src_argb,
680                                      ptrdiff_t src_stride,
681                                      int src_stepx,
682                                      uint8* dst_argb,
683                                      int dst_width);
684 
685 // ScaleRowDown2Box also used by planar functions
686 // NEON downscalers with interpolation.
687 
688 // Note - not static due to reuse in convert for 444 to 420.
689 void ScaleRowDown2_NEON(const uint8* src_ptr,
690                         ptrdiff_t src_stride,
691                         uint8* dst,
692                         int dst_width);
693 void ScaleRowDown2Linear_NEON(const uint8* src_ptr,
694                               ptrdiff_t src_stride,
695                               uint8* dst,
696                               int dst_width);
697 void ScaleRowDown2Box_NEON(const uint8* src_ptr,
698                            ptrdiff_t src_stride,
699                            uint8* dst,
700                            int dst_width);
701 
702 void ScaleRowDown4_NEON(const uint8* src_ptr,
703                         ptrdiff_t src_stride,
704                         uint8* dst_ptr,
705                         int dst_width);
706 void ScaleRowDown4Box_NEON(const uint8* src_ptr,
707                            ptrdiff_t src_stride,
708                            uint8* dst_ptr,
709                            int dst_width);
710 
711 // Down scale from 4 to 3 pixels. Use the neon multilane read/write
712 //  to load up the every 4th pixel into a 4 different registers.
713 // Point samples 32 pixels to 24 pixels.
714 void ScaleRowDown34_NEON(const uint8* src_ptr,
715                          ptrdiff_t src_stride,
716                          uint8* dst_ptr,
717                          int dst_width);
718 void ScaleRowDown34_0_Box_NEON(const uint8* src_ptr,
719                                ptrdiff_t src_stride,
720                                uint8* dst_ptr,
721                                int dst_width);
722 void ScaleRowDown34_1_Box_NEON(const uint8* src_ptr,
723                                ptrdiff_t src_stride,
724                                uint8* dst_ptr,
725                                int dst_width);
726 
727 // 32 -> 12
728 void ScaleRowDown38_NEON(const uint8* src_ptr,
729                          ptrdiff_t src_stride,
730                          uint8* dst_ptr,
731                          int dst_width);
732 // 32x3 -> 12x1
733 void ScaleRowDown38_3_Box_NEON(const uint8* src_ptr,
734                                ptrdiff_t src_stride,
735                                uint8* dst_ptr,
736                                int dst_width);
737 // 32x2 -> 12x1
738 void ScaleRowDown38_2_Box_NEON(const uint8* src_ptr,
739                                ptrdiff_t src_stride,
740                                uint8* dst_ptr,
741                                int dst_width);
742 
743 void ScaleRowDown2_Any_NEON(const uint8* src_ptr,
744                             ptrdiff_t src_stride,
745                             uint8* dst,
746                             int dst_width);
747 void ScaleRowDown2Linear_Any_NEON(const uint8* src_ptr,
748                                   ptrdiff_t src_stride,
749                                   uint8* dst,
750                                   int dst_width);
751 void ScaleRowDown2Box_Any_NEON(const uint8* src_ptr,
752                                ptrdiff_t src_stride,
753                                uint8* dst,
754                                int dst_width);
755 void ScaleRowDown2Box_Odd_NEON(const uint8* src_ptr,
756                                ptrdiff_t src_stride,
757                                uint8* dst,
758                                int dst_width);
759 void ScaleRowDown4_Any_NEON(const uint8* src_ptr,
760                             ptrdiff_t src_stride,
761                             uint8* dst_ptr,
762                             int dst_width);
763 void ScaleRowDown4Box_Any_NEON(const uint8* src_ptr,
764                                ptrdiff_t src_stride,
765                                uint8* dst_ptr,
766                                int dst_width);
767 void ScaleRowDown34_Any_NEON(const uint8* src_ptr,
768                              ptrdiff_t src_stride,
769                              uint8* dst_ptr,
770                              int dst_width);
771 void ScaleRowDown34_0_Box_Any_NEON(const uint8* src_ptr,
772                                    ptrdiff_t src_stride,
773                                    uint8* dst_ptr,
774                                    int dst_width);
775 void ScaleRowDown34_1_Box_Any_NEON(const uint8* src_ptr,
776                                    ptrdiff_t src_stride,
777                                    uint8* dst_ptr,
778                                    int dst_width);
779 // 32 -> 12
780 void ScaleRowDown38_Any_NEON(const uint8* src_ptr,
781                              ptrdiff_t src_stride,
782                              uint8* dst_ptr,
783                              int dst_width);
784 // 32x3 -> 12x1
785 void ScaleRowDown38_3_Box_Any_NEON(const uint8* src_ptr,
786                                    ptrdiff_t src_stride,
787                                    uint8* dst_ptr,
788                                    int dst_width);
789 // 32x2 -> 12x1
790 void ScaleRowDown38_2_Box_Any_NEON(const uint8* src_ptr,
791                                    ptrdiff_t src_stride,
792                                    uint8* dst_ptr,
793                                    int dst_width);
794 
795 void ScaleAddRow_NEON(const uint8* src_ptr, uint16* dst_ptr, int src_width);
796 void ScaleAddRow_Any_NEON(const uint8* src_ptr, uint16* dst_ptr, int src_width);
797 
798 void ScaleFilterCols_NEON(uint8* dst_ptr,
799                           const uint8* src_ptr,
800                           int dst_width,
801                           int x,
802                           int dx);
803 
804 void ScaleFilterCols_Any_NEON(uint8* dst_ptr,
805                               const uint8* src_ptr,
806                               int dst_width,
807                               int x,
808                               int dx);
809 
810 void ScaleRowDown2_DSPR2(const uint8* src_ptr,
811                          ptrdiff_t src_stride,
812                          uint8* dst,
813                          int dst_width);
814 void ScaleRowDown2Box_DSPR2(const uint8* src_ptr,
815                             ptrdiff_t src_stride,
816                             uint8* dst,
817                             int dst_width);
818 void ScaleRowDown4_DSPR2(const uint8* src_ptr,
819                          ptrdiff_t src_stride,
820                          uint8* dst,
821                          int dst_width);
822 void ScaleRowDown4Box_DSPR2(const uint8* src_ptr,
823                             ptrdiff_t src_stride,
824                             uint8* dst,
825                             int dst_width);
826 void ScaleRowDown34_DSPR2(const uint8* src_ptr,
827                           ptrdiff_t src_stride,
828                           uint8* dst,
829                           int dst_width);
830 void ScaleRowDown34_0_Box_DSPR2(const uint8* src_ptr,
831                                 ptrdiff_t src_stride,
832                                 uint8* d,
833                                 int dst_width);
834 void ScaleRowDown34_1_Box_DSPR2(const uint8* src_ptr,
835                                 ptrdiff_t src_stride,
836                                 uint8* d,
837                                 int dst_width);
838 void ScaleRowDown38_DSPR2(const uint8* src_ptr,
839                           ptrdiff_t src_stride,
840                           uint8* dst,
841                           int dst_width);
842 void ScaleRowDown38_2_Box_DSPR2(const uint8* src_ptr,
843                                 ptrdiff_t src_stride,
844                                 uint8* dst_ptr,
845                                 int dst_width);
846 void ScaleRowDown38_3_Box_DSPR2(const uint8* src_ptr,
847                                 ptrdiff_t src_stride,
848                                 uint8* dst_ptr,
849                                 int dst_width);
850 void ScaleAddRow_DSPR2(const uint8* src_ptr, uint16* dst_ptr, int src_width);
851 void ScaleAddRow_Any_DSPR2(const uint8* src_ptr,
852                            uint16* dst_ptr,
853                            int src_width);
854 
855 void ScaleRowDown2_MSA(const uint8_t* src_ptr,
856                        ptrdiff_t src_stride,
857                        uint8_t* dst,
858                        int dst_width);
859 void ScaleRowDown2Linear_MSA(const uint8_t* src_ptr,
860                              ptrdiff_t src_stride,
861                              uint8_t* dst,
862                              int dst_width);
863 void ScaleRowDown2Box_MSA(const uint8_t* src_ptr,
864                           ptrdiff_t src_stride,
865                           uint8_t* dst,
866                           int dst_width);
867 void ScaleRowDown4_MSA(const uint8_t* src_ptr,
868                        ptrdiff_t src_stride,
869                        uint8_t* dst,
870                        int dst_width);
871 void ScaleRowDown4Box_MSA(const uint8_t* src_ptr,
872                           ptrdiff_t src_stride,
873                           uint8_t* dst,
874                           int dst_width);
875 void ScaleRowDown38_MSA(const uint8_t* src_ptr,
876                         ptrdiff_t src_stride,
877                         uint8_t* dst,
878                         int dst_width);
879 void ScaleRowDown38_2_Box_MSA(const uint8_t* src_ptr,
880                               ptrdiff_t src_stride,
881                               uint8_t* dst_ptr,
882                               int dst_width);
883 void ScaleRowDown38_3_Box_MSA(const uint8_t* src_ptr,
884                               ptrdiff_t src_stride,
885                               uint8_t* dst_ptr,
886                               int dst_width);
887 void ScaleAddRow_MSA(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
888 void ScaleRowDown2_Any_MSA(const uint8_t* src_ptr,
889                            ptrdiff_t src_stride,
890                            uint8_t* dst,
891                            int dst_width);
892 void ScaleRowDown2Linear_Any_MSA(const uint8_t* src_ptr,
893                                  ptrdiff_t src_stride,
894                                  uint8_t* dst,
895                                  int dst_width);
896 void ScaleRowDown2Box_Any_MSA(const uint8_t* src_ptr,
897                               ptrdiff_t src_stride,
898                               uint8_t* dst,
899                               int dst_width);
900 void ScaleRowDown4_Any_MSA(const uint8_t* src_ptr,
901                            ptrdiff_t src_stride,
902                            uint8_t* dst,
903                            int dst_width);
904 void ScaleRowDown4Box_Any_MSA(const uint8_t* src_ptr,
905                               ptrdiff_t src_stride,
906                               uint8_t* dst,
907                               int dst_width);
908 void ScaleRowDown38_Any_MSA(const uint8_t* src_ptr,
909                             ptrdiff_t src_stride,
910                             uint8_t* dst,
911                             int dst_width);
912 void ScaleRowDown38_2_Box_Any_MSA(const uint8_t* src_ptr,
913                                   ptrdiff_t src_stride,
914                                   uint8_t* dst_ptr,
915                                   int dst_width);
916 void ScaleRowDown38_3_Box_Any_MSA(const uint8_t* src_ptr,
917                                   ptrdiff_t src_stride,
918                                   uint8_t* dst_ptr,
919                                   int dst_width);
920 void ScaleAddRow_Any_MSA(const uint8_t* src_ptr,
921                          uint16_t* dst_ptr,
922                          int src_width);
923 
924 #ifdef __cplusplus
925 }  // extern "C"
926 }  // namespace libyuv
927 #endif
928 
929 #endif  // INCLUDE_LIBYUV_SCALE_ROW_H_
930