1c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com/*
2c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com *  Copyright 2013 The LibYuv Project Authors. All rights reserved.
3c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com *
4c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com *  Use of this source code is governed by a BSD-style license
5c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com *  that can be found in the LICENSE file in the root of the source
6c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com *  tree. An additional intellectual property rights grant can be found
7c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com *  in the file PATENTS. All contributing project authors may
8c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com *  be found in the AUTHORS file in the root of the source tree.
9c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com */
10c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com
115fcf38cfc8b262f667933492a14b423a341d3795fbarchard@google.com#ifndef INCLUDE_LIBYUV_SCALE_ROW_H_  // NOLINT
125fcf38cfc8b262f667933492a14b423a341d3795fbarchard@google.com#define INCLUDE_LIBYUV_SCALE_ROW_H_
13c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com
14c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#include "libyuv/basic_types.h"
15c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com
16c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#ifdef __cplusplus
17c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.comnamespace libyuv {
18c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.comextern "C" {
19c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#endif
20c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com
212c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com#if defined(__pnacl__) || defined(__CLR_VER) || defined(COVERAGE_ENABLED) || \
222c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com    defined(TARGET_IPHONE_SIMULATOR)
232c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com#define LIBYUV_DISABLE_X86
242c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com#endif
252c8108e6c2c6fa0c62670a70be7ef6f59cf03848fbarchard@google.com
26dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// The following are available on all x86 platforms:
27dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#if !defined(LIBYUV_DISABLE_X86) && \
28dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com    (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
29dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN2_SSE2
30dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN4_SSE2
31dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN34_SSSE3
32dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN38_SSSE3
33dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEADDROWS_SSE2
34dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEFILTERCOLS_SSSE3
35dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALECOLSUP2_SSE2
36dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBROWDOWN2_SSE2
37dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBROWDOWNEVEN_SSE2
38dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBCOLS_SSE2
39dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBFILTERCOLS_SSSE3
40dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBCOLSUP2_SSE2
415dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define HAS_FIXEDDIV_X86
425dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define HAS_FIXEDDIV1_X86
43dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#endif
44dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
45dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// The following are available on Neon platforms:
46dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#if !defined(LIBYUV_DISABLE_NEON) && !defined(__native_client__) && \
47dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com    (defined(__ARM_NEON__) || defined(LIBYUV_NEON))
48dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN2_NEON
49dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN4_NEON
50dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN34_NEON
51dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN38_NEON
52dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBROWDOWNEVEN_NEON
53dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEARGBROWDOWN2_NEON
54dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#endif
55dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
56dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// The following are available on Mips platforms:
57dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#if !defined(LIBYUV_DISABLE_MIPS) && !defined(__native_client__) && \
58b74ed8076a98b6bc2a4064eecfe32e8f80a56c47fbarchard@google.com    defined(__mips__) && defined(__mips_dsp) && (__mips_dsp_rev >= 2)
59dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN2_MIPS_DSPR2
60dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN4_MIPS_DSPR2
61dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN34_MIPS_DSPR2
62dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#define HAS_SCALEROWDOWN38_MIPS_DSPR2
63dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com#endif
64dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
65c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com// Scale ARGB vertically with bilinear interpolation.
66c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.comvoid ScalePlaneVertical(int src_height,
67c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com                        int dst_width, int dst_height,
68c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com                        int src_stride, int dst_stride,
69c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com                        const uint8* src_argb, uint8* dst_argb,
70c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com                        int x, int y, int dy,
715dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com                        int bpp, enum FilterMode filtering);
72c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com
73b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScalePlaneVertical_16(int src_height,
74b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                           int dst_width, int dst_height,
75b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                           int src_stride, int dst_stride,
76b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                           const uint16* src_argb, uint16* dst_argb,
77b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                           int x, int y, int dy,
78b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                           int wpp, enum FilterMode filtering);
79b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com
80980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com// Simplify the filtering based on scale factors.
815dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comenum FilterMode ScaleFilterReduce(int src_width, int src_height,
825dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com                                  int dst_width, int dst_height,
835dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com                                  enum FilterMode filtering);
845dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com
855dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com// Divide num by div and return as 16.16 fixed point result.
865dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comint FixedDiv_C(int num, int div);
875dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comint FixedDiv_X86(int num, int div);
885dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com// Divide num - 1 by div - 1 and return as 16.16 fixed point result.
895dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comint FixedDiv1_C(int num, int div);
905dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.comint FixedDiv1_X86(int num, int div);
915dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#ifdef HAS_FIXEDDIV_X86
925dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define FixedDiv FixedDiv_X86
935dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define FixedDiv1 FixedDiv1_X86
945dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#else
955dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define FixedDiv FixedDiv_C
965dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#define FixedDiv1 FixedDiv1_C
975dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com#endif
98980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com
99980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com// Compute slope values for stepping.
100980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.comvoid ScaleSlope(int src_width, int src_height,
101980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com                int dst_width, int dst_height,
1025dba58cb1ed4117f491267f68351a6079eaed667fbarchard@google.com                enum FilterMode filtering,
103980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com                int* x, int* y, int* dx, int* dy);
104980150f7f1c9cf99b1729d0274b46092a47449bdfbarchard@google.com
1051f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown2_C(const uint8* src_ptr, ptrdiff_t src_stride,
106dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                     uint8* dst, int dst_width);
107b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown2_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
108b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                        uint16* dst, int dst_width);
109dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Linear_C(const uint8* src_ptr, ptrdiff_t src_stride,
110dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                           uint8* dst, int dst_width);
111b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown2Linear_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
112b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                              uint16* dst, int dst_width);
113dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
114dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                        uint8* dst, int dst_width);
115b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown2Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
116b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                           uint16* dst, int dst_width);
1171f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown4_C(const uint8* src_ptr, ptrdiff_t src_stride,
118dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                     uint8* dst, int dst_width);
119b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown4_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
120b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                        uint16* dst, int dst_width);
121dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
122dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                        uint8* dst, int dst_width);
123b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown4Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
124b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                           uint16* dst, int dst_width);
1251f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown34_C(const uint8* src_ptr, ptrdiff_t src_stride,
126dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                      uint8* dst, int dst_width);
127b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown34_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
128b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                         uint16* dst, int dst_width);
129dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_0_Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
130dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            uint8* d, int dst_width);
131b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown34_0_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
132b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                               uint16* d, int dst_width);
133dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_1_Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
134dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            uint8* d, int dst_width);
135b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown34_1_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
136b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                               uint16* d, int dst_width);
137dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleCols_C(uint8* dst_ptr, const uint8* src_ptr,
138dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                 int dst_width, int x, int dx);
139b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleCols_16_C(uint16* dst_ptr, const uint16* src_ptr,
140b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                    int dst_width, int x, int dx);
141dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleColsUp2_C(uint8* dst_ptr, const uint8* src_ptr,
142dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                    int dst_width, int, int);
143b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleColsUp2_16_C(uint16* dst_ptr, const uint16* src_ptr,
144b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                       int dst_width, int, int);
145dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleFilterCols_C(uint8* dst_ptr, const uint8* src_ptr,
146dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                       int dst_width, int x, int dx);
147b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleFilterCols_16_C(uint16* dst_ptr, const uint16* src_ptr,
148b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                          int dst_width, int x, int dx);
14990a36b29d3ffac9ecaa239191c7106c9993dc093fbarchard@google.comvoid ScaleFilterCols64_C(uint8* dst_ptr, const uint8* src_ptr,
15090a36b29d3ffac9ecaa239191c7106c9993dc093fbarchard@google.com                         int dst_width, int x, int dx);
151b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleFilterCols64_16_C(uint16* dst_ptr, const uint16* src_ptr,
152b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                            int dst_width, int x, int dx);
1531f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown38_C(const uint8* src_ptr, ptrdiff_t src_stride,
154dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                      uint8* dst, int dst_width);
155b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown38_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
156b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                         uint16* dst, int dst_width);
157dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_3_Box_C(const uint8* src_ptr,
158dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            ptrdiff_t src_stride,
159dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            uint8* dst_ptr, int dst_width);
160b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown38_3_Box_16_C(const uint16* src_ptr,
161b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                               ptrdiff_t src_stride,
162b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                               uint16* dst_ptr, int dst_width);
163dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_2_Box_C(const uint8* src_ptr, ptrdiff_t src_stride,
164dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            uint8* dst_ptr, int dst_width);
165b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleRowDown38_2_Box_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
166b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                               uint16* dst_ptr, int dst_width);
167dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleAddRows_C(const uint8* src_ptr, ptrdiff_t src_stride,
168dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                    uint16* dst_ptr, int src_width, int src_height);
169b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.comvoid ScaleAddRows_16_C(const uint16* src_ptr, ptrdiff_t src_stride,
170b18413e568ae742114eabb8450b180db98a83be0fbarchard@google.com                       uint32* dst_ptr, int src_width, int src_height);
171dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2_C(const uint8* src_argb,
1721f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                         ptrdiff_t src_stride,
173dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                         uint8* dst_argb, int dst_width);
174dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Linear_C(const uint8* src_argb,
1751f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                               ptrdiff_t src_stride,
176dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_argb, int dst_width);
177dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Box_C(const uint8* src_argb, ptrdiff_t src_stride,
178dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            uint8* dst_argb, int dst_width);
1791f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleARGBRowDownEven_C(const uint8* src_argb, ptrdiff_t src_stride,
180dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            int src_stepx,
181dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            uint8* dst_argb, int dst_width);
182dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEvenBox_C(const uint8* src_argb,
183dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               ptrdiff_t src_stride,
184dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               int src_stepx,
185dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_argb, int dst_width);
186dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBCols_C(uint8* dst_argb, const uint8* src_argb,
187dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                     int dst_width, int x, int dx);
188909c76e317028a21db491413b2c5d1a05c1fde5bfbarchard@google.comvoid ScaleARGBCols64_C(uint8* dst_argb, const uint8* src_argb,
189909c76e317028a21db491413b2c5d1a05c1fde5bfbarchard@google.com                       int dst_width, int x, int dx);
190dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBColsUp2_C(uint8* dst_argb, const uint8* src_argb,
191dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                        int dst_width, int, int);
192dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBFilterCols_C(uint8* dst_argb, const uint8* src_argb,
193dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                           int dst_width, int x, int dx);
1946dc80ab585de785ea3492ac3f8a66f2252edb9f8fbarchard@google.comvoid ScaleARGBFilterCols64_C(uint8* dst_argb, const uint8* src_argb,
1956dc80ab585de785ea3492ac3f8a66f2252edb9f8fbarchard@google.com                             int dst_width, int x, int dx);
196dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
197dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
198dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                        uint8* dst_ptr, int dst_width);
199dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Linear_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
200dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                              uint8* dst_ptr, int dst_width);
201dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
202dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                           uint8* dst_ptr, int dst_width);
203dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2_Unaligned_SSE2(const uint8* src_ptr,
204dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                  ptrdiff_t src_stride,
205dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                  uint8* dst_ptr, int dst_width);
2061f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown2Linear_Unaligned_SSE2(const uint8* src_ptr,
2071f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                                        ptrdiff_t src_stride,
208dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                        uint8* dst_ptr, int dst_width);
209dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_Unaligned_SSE2(const uint8* src_ptr,
210dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                     ptrdiff_t src_stride,
211dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                     uint8* dst_ptr, int dst_width);
212dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
213dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                        uint8* dst_ptr, int dst_width);
214dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4Box_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
215dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                           uint8* dst_ptr, int dst_width);
216dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride,
217dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                          uint8* dst_ptr, int dst_width);
218dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_1_Box_SSSE3(const uint8* src_ptr,
219dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                ptrdiff_t src_stride,
220dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                uint8* dst_ptr, int dst_width);
221dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_0_Box_SSSE3(const uint8* src_ptr,
222dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                ptrdiff_t src_stride,
223dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                uint8* dst_ptr, int dst_width);
224dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_SSSE3(const uint8* src_ptr, ptrdiff_t src_stride,
225dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                          uint8* dst_ptr, int dst_width);
226dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_3_Box_SSSE3(const uint8* src_ptr,
227dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                ptrdiff_t src_stride,
228dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                uint8* dst_ptr, int dst_width);
229dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_2_Box_SSSE3(const uint8* src_ptr,
230dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                ptrdiff_t src_stride,
231dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                uint8* dst_ptr, int dst_width);
232dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleAddRows_SSE2(const uint8* src_ptr, ptrdiff_t src_stride,
233dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                       uint16* dst_ptr, int src_width,
234dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                       int src_height);
235dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleFilterCols_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
236dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                           int dst_width, int x, int dx);
237dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleColsUp2_SSE2(uint8* dst_ptr, const uint8* src_ptr,
2381f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                       int dst_width, int x, int dx);
239dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2_SSE2(const uint8* src_argb,
2401f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                            ptrdiff_t src_stride,
241dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            uint8* dst_argb, int dst_width);
242dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Linear_SSE2(const uint8* src_argb,
2431f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                                  ptrdiff_t src_stride,
244dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                  uint8* dst_argb, int dst_width);
245dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Box_SSE2(const uint8* src_argb,
246dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               ptrdiff_t src_stride,
247dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_argb, int dst_width);
248dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEven_SSE2(const uint8* src_argb, ptrdiff_t src_stride,
249dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               int src_stepx,
250dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_argb, int dst_width);
251dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEvenBox_SSE2(const uint8* src_argb,
252dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                  ptrdiff_t src_stride,
253dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                  int src_stepx,
254dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                  uint8* dst_argb, int dst_width);
255dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBCols_SSE2(uint8* dst_argb, const uint8* src_argb,
256dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                        int dst_width, int x, int dx);
257dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBFilterCols_SSSE3(uint8* dst_argb, const uint8* src_argb,
258dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               int dst_width, int x, int dx);
259dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBColsUp2_SSE2(uint8* dst_argb, const uint8* src_argb,
2601f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                           int dst_width, int x, int dx);
261dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// Row functions.
262dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEven_NEON(const uint8* src_argb, int src_stride,
263dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               int src_stepx,
264dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_argb, int dst_width);
265dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDownEvenBox_NEON(const uint8* src_argb, int src_stride,
266dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                  int src_stepx,
267dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                  uint8* dst_argb, int dst_width);
2681f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleARGBRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
269dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                            uint8* dst, int dst_width);
270dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleARGBRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
271dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst, int dst_width);
272dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
273dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// ScaleRowDown2Box also used by planar functions
274dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// NEON downscalers with interpolation.
275dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
276dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// Note - not static due to reuse in convert for 444 to 420.
2771f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown2_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
278dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                        uint8* dst, int dst_width);
279dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
280dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
281dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                           uint8* dst, int dst_width);
282dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
2831f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown4_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
284dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                        uint8* dst_ptr, int dst_width);
285dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4Box_NEON(const uint8* src_ptr, ptrdiff_t src_stride,
286dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                           uint8* dst_ptr, int dst_width);
287dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
288dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// Down scale from 4 to 3 pixels. Use the neon multilane read/write
289dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com//  to load up the every 4th pixel into a 4 different registers.
290dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// Point samples 32 pixels to 24 pixels.
291dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_NEON(const uint8* src_ptr,
2921f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                         ptrdiff_t src_stride,
293dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                         uint8* dst_ptr, int dst_width);
294dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_0_Box_NEON(const uint8* src_ptr,
295dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               ptrdiff_t src_stride,
296dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_ptr, int dst_width);
297dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_1_Box_NEON(const uint8* src_ptr,
298dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               ptrdiff_t src_stride,
299dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_ptr, int dst_width);
300dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
301dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// 32 -> 12
302dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_NEON(const uint8* src_ptr,
3031f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.com                         ptrdiff_t src_stride,
304dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                         uint8* dst_ptr, int dst_width);
305dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// 32x3 -> 12x1
306dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_3_Box_NEON(const uint8* src_ptr,
307dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               ptrdiff_t src_stride,
308dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_ptr, int dst_width);
309dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// 32x2 -> 12x1
310dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_2_Box_NEON(const uint8* src_ptr,
311dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               ptrdiff_t src_stride,
312dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst_ptr, int dst_width);
313dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
3141f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown2_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
315dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                              uint8* dst, int dst_width);
316dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown2Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
317dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                 uint8* dst, int dst_width);
3181f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown4_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
319dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                              uint8* dst, int dst_width);
320dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown4Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
321dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                 uint8* dst, int dst_width);
3221f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown34_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
323dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst, int dst_width);
324dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_0_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
325dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                     uint8* d, int dst_width);
326dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown34_1_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
327dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                     uint8* d, int dst_width);
3281f923e3ea6de7afd9380c73f60a2f3e7b0588811fbarchard@google.comvoid ScaleRowDown38_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
329dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                               uint8* dst, int dst_width);
330dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_2_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride,
331dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                     uint8* dst_ptr, int dst_width);
332dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.comvoid ScaleRowDown38_3_Box_MIPS_DSPR2(const uint8* src_ptr,
333dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                     ptrdiff_t src_stride,
334dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com                                     uint8* dst_ptr, int dst_width);
335dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com
336c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#ifdef __cplusplus
337c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com}  // extern "C"
338c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com}  // namespace libyuv
339c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com#endif
340c105bae7925aa75cbd9acea7a8ce558f4c2d906dfbarchard@google.com
3415fcf38cfc8b262f667933492a14b423a341d3795fbarchard@google.com#endif  // INCLUDE_LIBYUV_SCALE_ROW_H_  NOLINT
342