• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2011 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_ROW_H_  // NOLINT
12 #define INCLUDE_LIBYUV_ROW_H_
13 
14 #include <stdlib.h>  // For malloc.
15 
16 #include "libyuv/basic_types.h"
17 
18 #ifdef __cplusplus
19 namespace libyuv {
20 extern "C" {
21 #endif
22 
23 #define IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1)))
24 
25 #ifdef __cplusplus
26 #define align_buffer_64(var, size)                                             \
27   uint8* var##_mem = reinterpret_cast<uint8*>(malloc((size) + 63));            \
28   uint8* var = reinterpret_cast<uint8*>                                        \
29       ((reinterpret_cast<intptr_t>(var##_mem) + 63) & ~63)
30 #else
31 #define align_buffer_64(var, size)                                             \
32   uint8* var##_mem = (uint8*)(malloc((size) + 63));               /* NOLINT */ \
33   uint8* var = (uint8*)(((intptr_t)(var##_mem) + 63) & ~63)       /* NOLINT */
34 #endif
35 
36 #define free_aligned_buffer_64(var) \
37   free(var##_mem);  \
38   var = 0
39 
40 #if defined(__pnacl__) || defined(__CLR_VER) || \
41     (defined(__i386__) && !defined(__SSE2__))
42 #define LIBYUV_DISABLE_X86
43 #endif
44 // MemorySanitizer does not support assembly code yet. http://crbug.com/344505
45 #if defined(__has_feature)
46 #if __has_feature(memory_sanitizer)
47 #define LIBYUV_DISABLE_X86
48 #endif
49 #endif
50 // True if compiling for SSSE3 as a requirement.
51 #if defined(__SSSE3__) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 3))
52 #define LIBYUV_SSSE3_ONLY
53 #endif
54 
55 #if defined(__native_client__)
56 #define LIBYUV_DISABLE_NEON
57 #endif
58 // clang >= 3.5.0 required for Arm64.
59 #if defined(__clang__) && defined(__aarch64__) && !defined(LIBYUV_DISABLE_NEON)
60 #if (__clang_major__ < 3) || (__clang_major__ == 3 && (__clang_minor__ < 5))
61 #define LIBYUV_DISABLE_NEON
62 #endif  // clang >= 3.5
63 #endif  // __clang__
64 
65 // GCC >= 4.7.0 required for AVX2.
66 #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
67 #if (__GNUC__ > 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7))
68 #define GCC_HAS_AVX2 1
69 #endif  // GNUC >= 4.7
70 #endif  // __GNUC__
71 
72 // clang >= 3.4.0 required for AVX2.
73 #if defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
74 #if (__clang_major__ > 3) || (__clang_major__ == 3 && (__clang_minor__ >= 4))
75 #define CLANG_HAS_AVX2 1
76 #endif  // clang >= 3.4
77 #endif  // __clang__
78 
79 // Visual C 2012 required for AVX2.
80 #if defined(_M_IX86) && !defined(__clang__) && \
81     defined(_MSC_VER) && _MSC_VER >= 1700
82 #define VISUALC_HAS_AVX2 1
83 #endif  // VisualStudio >= 2012
84 
85 // The following are available on all x86 platforms:
86 #if !defined(LIBYUV_DISABLE_X86) && \
87     (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__))
88 // Conversions:
89 #define HAS_ABGRTOUVROW_SSSE3
90 #define HAS_ABGRTOYROW_SSSE3
91 #define HAS_ARGB1555TOARGBROW_SSE2
92 #define HAS_ARGB4444TOARGBROW_SSE2
93 #define HAS_ARGBSETROW_X86
94 #define HAS_ARGBSHUFFLEROW_SSE2
95 #define HAS_ARGBSHUFFLEROW_SSSE3
96 #define HAS_ARGBTOARGB1555ROW_SSE2
97 #define HAS_ARGBTOARGB4444ROW_SSE2
98 #define HAS_ARGBTORAWROW_SSSE3
99 #define HAS_ARGBTORGB24ROW_SSSE3
100 #define HAS_ARGBTORGB565DITHERROW_SSE2
101 #define HAS_ARGBTORGB565ROW_SSE2
102 #define HAS_ARGBTOUV444ROW_SSSE3
103 #define HAS_ARGBTOUVJROW_SSSE3
104 #define HAS_ARGBTOUVROW_SSSE3
105 #define HAS_ARGBTOYJROW_SSSE3
106 #define HAS_ARGBTOYROW_SSSE3
107 #define HAS_ARGBEXTRACTALPHAROW_SSE2
108 #define HAS_BGRATOUVROW_SSSE3
109 #define HAS_BGRATOYROW_SSSE3
110 #define HAS_COPYROW_ERMS
111 #define HAS_COPYROW_SSE2
112 #define HAS_H422TOARGBROW_SSSE3
113 #define HAS_I400TOARGBROW_SSE2
114 #define HAS_I422TOARGB1555ROW_SSSE3
115 #define HAS_I422TOARGB4444ROW_SSSE3
116 #define HAS_I422TOARGBROW_SSSE3
117 #define HAS_I422TORGB24ROW_SSSE3
118 #define HAS_I422TORGB565ROW_SSSE3
119 #define HAS_I422TORGBAROW_SSSE3
120 #define HAS_I422TOUYVYROW_SSE2
121 #define HAS_I422TOYUY2ROW_SSE2
122 #define HAS_I444TOARGBROW_SSSE3
123 #define HAS_J400TOARGBROW_SSE2
124 #define HAS_J422TOARGBROW_SSSE3
125 #define HAS_MERGEUVROW_SSE2
126 #define HAS_MIRRORROW_SSSE3
127 #define HAS_MIRRORUVROW_SSSE3
128 #define HAS_NV12TOARGBROW_SSSE3
129 #define HAS_NV12TORGB565ROW_SSSE3
130 #define HAS_NV21TOARGBROW_SSSE3
131 #define HAS_RAWTOARGBROW_SSSE3
132 #define HAS_RAWTORGB24ROW_SSSE3
133 #define HAS_RAWTOYROW_SSSE3
134 #define HAS_RGB24TOARGBROW_SSSE3
135 #define HAS_RGB24TOYROW_SSSE3
136 #define HAS_RGB565TOARGBROW_SSE2
137 #define HAS_RGBATOUVROW_SSSE3
138 #define HAS_RGBATOYROW_SSSE3
139 #define HAS_SETROW_ERMS
140 #define HAS_SETROW_X86
141 #define HAS_SPLITUVROW_SSE2
142 #define HAS_UYVYTOARGBROW_SSSE3
143 #define HAS_UYVYTOUV422ROW_SSE2
144 #define HAS_UYVYTOUVROW_SSE2
145 #define HAS_UYVYTOYROW_SSE2
146 #define HAS_YUY2TOARGBROW_SSSE3
147 #define HAS_YUY2TOUV422ROW_SSE2
148 #define HAS_YUY2TOUVROW_SSE2
149 #define HAS_YUY2TOYROW_SSE2
150 
151 // Effects:
152 #define HAS_ARGBADDROW_SSE2
153 #define HAS_ARGBAFFINEROW_SSE2
154 #define HAS_ARGBATTENUATEROW_SSSE3
155 #define HAS_ARGBBLENDROW_SSSE3
156 #define HAS_ARGBCOLORMATRIXROW_SSSE3
157 #define HAS_ARGBCOLORTABLEROW_X86
158 #define HAS_ARGBCOPYALPHAROW_SSE2
159 #define HAS_ARGBCOPYYTOALPHAROW_SSE2
160 #define HAS_ARGBGRAYROW_SSSE3
161 #define HAS_ARGBLUMACOLORTABLEROW_SSSE3
162 #define HAS_ARGBMIRRORROW_SSE2
163 #define HAS_ARGBMULTIPLYROW_SSE2
164 #define HAS_ARGBPOLYNOMIALROW_SSE2
165 #define HAS_ARGBQUANTIZEROW_SSE2
166 #define HAS_ARGBSEPIAROW_SSSE3
167 #define HAS_ARGBSHADEROW_SSE2
168 #define HAS_ARGBSUBTRACTROW_SSE2
169 #define HAS_ARGBUNATTENUATEROW_SSE2
170 #define HAS_BLENDPLANEROW_SSSE3
171 #define HAS_COMPUTECUMULATIVESUMROW_SSE2
172 #define HAS_CUMULATIVESUMTOAVERAGEROW_SSE2
173 #define HAS_INTERPOLATEROW_SSSE3
174 #define HAS_RGBCOLORTABLEROW_X86
175 #define HAS_SOBELROW_SSE2
176 #define HAS_SOBELTOPLANEROW_SSE2
177 #define HAS_SOBELXROW_SSE2
178 #define HAS_SOBELXYROW_SSE2
179 #define HAS_SOBELYROW_SSE2
180 
181 // The following functions fail on gcc/clang 32 bit with fpic and framepointer.
182 // caveat: clangcl uses row_win.cc which works.
183 #if defined(NDEBUG) || !(defined(_DEBUG) && defined(__i386__)) || \
184     !defined(__i386__) || defined(_MSC_VER)
185 // TODO(fbarchard): fix build error on x86 debug
186 // https://code.google.com/p/libyuv/issues/detail?id=524
187 #define HAS_I411TOARGBROW_SSSE3
188 // TODO(fbarchard): fix build error on android_full_debug=1
189 // https://code.google.com/p/libyuv/issues/detail?id=517
190 #define HAS_I422ALPHATOARGBROW_SSSE3
191 #endif
192 #endif
193 
194 // The following are available on all x86 platforms, but
195 // require VS2012, clang 3.4 or gcc 4.7.
196 // The code supports NaCL but requires a new compiler and validator.
197 #if !defined(LIBYUV_DISABLE_X86) && (defined(VISUALC_HAS_AVX2) || \
198     defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2))
199 #define HAS_ARGBCOPYALPHAROW_AVX2
200 #define HAS_ARGBCOPYYTOALPHAROW_AVX2
201 #define HAS_ARGBMIRRORROW_AVX2
202 #define HAS_ARGBPOLYNOMIALROW_AVX2
203 #define HAS_ARGBSHUFFLEROW_AVX2
204 #define HAS_ARGBTORGB565DITHERROW_AVX2
205 #define HAS_ARGBTOUVJROW_AVX2
206 #define HAS_ARGBTOUVROW_AVX2
207 #define HAS_ARGBTOYJROW_AVX2
208 #define HAS_ARGBTOYROW_AVX2
209 #define HAS_COPYROW_AVX
210 #define HAS_H422TOARGBROW_AVX2
211 #define HAS_I400TOARGBROW_AVX2
212 #if !(defined(_DEBUG) && defined(__i386__))
213 // TODO(fbarchard): fix build error on android_full_debug=1
214 // https://code.google.com/p/libyuv/issues/detail?id=517
215 #define HAS_I422ALPHATOARGBROW_AVX2
216 #endif
217 #define HAS_I411TOARGBROW_AVX2
218 #define HAS_I422TOARGB1555ROW_AVX2
219 #define HAS_I422TOARGB4444ROW_AVX2
220 #define HAS_I422TOARGBROW_AVX2
221 #define HAS_I422TORGB24ROW_AVX2
222 #define HAS_I422TORGB565ROW_AVX2
223 #define HAS_I422TORGBAROW_AVX2
224 #define HAS_I444TOARGBROW_AVX2
225 #define HAS_INTERPOLATEROW_AVX2
226 #define HAS_J422TOARGBROW_AVX2
227 #define HAS_MERGEUVROW_AVX2
228 #define HAS_MIRRORROW_AVX2
229 #define HAS_NV12TOARGBROW_AVX2
230 #define HAS_NV12TORGB565ROW_AVX2
231 #define HAS_NV21TOARGBROW_AVX2
232 #define HAS_SPLITUVROW_AVX2
233 #define HAS_UYVYTOARGBROW_AVX2
234 #define HAS_UYVYTOUV422ROW_AVX2
235 #define HAS_UYVYTOUVROW_AVX2
236 #define HAS_UYVYTOYROW_AVX2
237 #define HAS_YUY2TOARGBROW_AVX2
238 #define HAS_YUY2TOUV422ROW_AVX2
239 #define HAS_YUY2TOUVROW_AVX2
240 #define HAS_YUY2TOYROW_AVX2
241 
242 // Effects:
243 #define HAS_ARGBADDROW_AVX2
244 #define HAS_ARGBATTENUATEROW_AVX2
245 #define HAS_ARGBMULTIPLYROW_AVX2
246 #define HAS_ARGBSUBTRACTROW_AVX2
247 #define HAS_ARGBUNATTENUATEROW_AVX2
248 #define HAS_BLENDPLANEROW_AVX2
249 #endif
250 
251 // The following are available for AVX2 Visual C and clangcl 32 bit:
252 // TODO(fbarchard): Port to gcc.
253 #if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && \
254     (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2))
255 #define HAS_ARGB1555TOARGBROW_AVX2
256 #define HAS_ARGB4444TOARGBROW_AVX2
257 #define HAS_ARGBTOARGB1555ROW_AVX2
258 #define HAS_ARGBTOARGB4444ROW_AVX2
259 #define HAS_ARGBTORGB565ROW_AVX2
260 #define HAS_J400TOARGBROW_AVX2
261 #define HAS_RGB565TOARGBROW_AVX2
262 #endif
263 
264 // The following are also available on x64 Visual C.
265 #if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && defined(_M_X64) && \
266     (!defined(__clang__) || defined(__SSSE3__))
267 #define HAS_I422ALPHATOARGBROW_SSSE3
268 #define HAS_I422TOARGBROW_SSSE3
269 #endif
270 
271 // The following are available on Neon platforms:
272 #if !defined(LIBYUV_DISABLE_NEON) && \
273     (defined(__aarch64__) || defined(__ARM_NEON__) || defined(LIBYUV_NEON))
274 #define HAS_ABGRTOUVROW_NEON
275 #define HAS_ABGRTOYROW_NEON
276 #define HAS_ARGB1555TOARGBROW_NEON
277 #define HAS_ARGB1555TOUVROW_NEON
278 #define HAS_ARGB1555TOYROW_NEON
279 #define HAS_ARGB4444TOARGBROW_NEON
280 #define HAS_ARGB4444TOUVROW_NEON
281 #define HAS_ARGB4444TOYROW_NEON
282 #define HAS_ARGBSETROW_NEON
283 #define HAS_ARGBTOARGB1555ROW_NEON
284 #define HAS_ARGBTOARGB4444ROW_NEON
285 #define HAS_ARGBTORAWROW_NEON
286 #define HAS_ARGBTORGB24ROW_NEON
287 #define HAS_ARGBTORGB565DITHERROW_NEON
288 #define HAS_ARGBTORGB565ROW_NEON
289 #define HAS_ARGBTOUV411ROW_NEON
290 #define HAS_ARGBTOUV444ROW_NEON
291 #define HAS_ARGBTOUVJROW_NEON
292 #define HAS_ARGBTOUVROW_NEON
293 #define HAS_ARGBTOYJROW_NEON
294 #define HAS_ARGBTOYROW_NEON
295 #define HAS_ARGBEXTRACTALPHAROW_NEON
296 #define HAS_BGRATOUVROW_NEON
297 #define HAS_BGRATOYROW_NEON
298 #define HAS_COPYROW_NEON
299 #define HAS_I400TOARGBROW_NEON
300 #define HAS_I411TOARGBROW_NEON
301 #define HAS_I422ALPHATOARGBROW_NEON
302 #define HAS_I422TOARGB1555ROW_NEON
303 #define HAS_I422TOARGB4444ROW_NEON
304 #define HAS_I422TOARGBROW_NEON
305 #define HAS_I422TORGB24ROW_NEON
306 #define HAS_I422TORGB565ROW_NEON
307 #define HAS_I422TORGBAROW_NEON
308 #define HAS_I422TOUYVYROW_NEON
309 #define HAS_I422TOYUY2ROW_NEON
310 #define HAS_I444TOARGBROW_NEON
311 #define HAS_J400TOARGBROW_NEON
312 #define HAS_MERGEUVROW_NEON
313 #define HAS_MIRRORROW_NEON
314 #define HAS_MIRRORUVROW_NEON
315 #define HAS_NV12TOARGBROW_NEON
316 #define HAS_NV12TORGB565ROW_NEON
317 #define HAS_NV21TOARGBROW_NEON
318 #define HAS_RAWTOARGBROW_NEON
319 #define HAS_RAWTORGB24ROW_NEON
320 #define HAS_RAWTOUVROW_NEON
321 #define HAS_RAWTOYROW_NEON
322 #define HAS_RGB24TOARGBROW_NEON
323 #define HAS_RGB24TOUVROW_NEON
324 #define HAS_RGB24TOYROW_NEON
325 #define HAS_RGB565TOARGBROW_NEON
326 #define HAS_RGB565TOUVROW_NEON
327 #define HAS_RGB565TOYROW_NEON
328 #define HAS_RGBATOUVROW_NEON
329 #define HAS_RGBATOYROW_NEON
330 #define HAS_SETROW_NEON
331 #define HAS_SPLITUVROW_NEON
332 #define HAS_UYVYTOARGBROW_NEON
333 #define HAS_UYVYTOUV422ROW_NEON
334 #define HAS_UYVYTOUVROW_NEON
335 #define HAS_UYVYTOYROW_NEON
336 #define HAS_YUY2TOARGBROW_NEON
337 #define HAS_YUY2TOUV422ROW_NEON
338 #define HAS_YUY2TOUVROW_NEON
339 #define HAS_YUY2TOYROW_NEON
340 
341 // Effects:
342 #define HAS_ARGBADDROW_NEON
343 #define HAS_ARGBATTENUATEROW_NEON
344 #define HAS_ARGBBLENDROW_NEON
345 #define HAS_ARGBCOLORMATRIXROW_NEON
346 #define HAS_ARGBGRAYROW_NEON
347 #define HAS_ARGBMIRRORROW_NEON
348 #define HAS_ARGBMULTIPLYROW_NEON
349 #define HAS_ARGBQUANTIZEROW_NEON
350 #define HAS_ARGBSEPIAROW_NEON
351 #define HAS_ARGBSHADEROW_NEON
352 #define HAS_ARGBSHUFFLEROW_NEON
353 #define HAS_ARGBSUBTRACTROW_NEON
354 #define HAS_INTERPOLATEROW_NEON
355 #define HAS_SOBELROW_NEON
356 #define HAS_SOBELTOPLANEROW_NEON
357 #define HAS_SOBELXROW_NEON
358 #define HAS_SOBELXYROW_NEON
359 #define HAS_SOBELYROW_NEON
360 #endif
361 
362 // The following are available on Mips platforms:
363 #if !defined(LIBYUV_DISABLE_MIPS) && defined(__mips__) && \
364     (_MIPS_SIM == _MIPS_SIM_ABI32) && (__mips_isa_rev < 6)
365 #define HAS_COPYROW_MIPS
366 #if defined(__mips_dsp) && (__mips_dsp_rev >= 2)
367 #define HAS_I422TOARGBROW_DSPR2
368 #define HAS_INTERPOLATEROW_DSPR2
369 #define HAS_MIRRORROW_DSPR2
370 #define HAS_MIRRORUVROW_DSPR2
371 #define HAS_SPLITUVROW_DSPR2
372 #endif
373 #endif
374 
375 #if defined(_MSC_VER) && !defined(__CLR_VER) && !defined(__clang__)
376 #define SIMD_ALIGNED(var) __declspec(align(16)) var
377 #define SIMD_ALIGNED32(var) __declspec(align(64)) var
378 typedef __declspec(align(16)) int16 vec16[8];
379 typedef __declspec(align(16)) int32 vec32[4];
380 typedef __declspec(align(16)) int8 vec8[16];
381 typedef __declspec(align(16)) uint16 uvec16[8];
382 typedef __declspec(align(16)) uint32 uvec32[4];
383 typedef __declspec(align(16)) uint8 uvec8[16];
384 typedef __declspec(align(32)) int16 lvec16[16];
385 typedef __declspec(align(32)) int32 lvec32[8];
386 typedef __declspec(align(32)) int8 lvec8[32];
387 typedef __declspec(align(32)) uint16 ulvec16[16];
388 typedef __declspec(align(32)) uint32 ulvec32[8];
389 typedef __declspec(align(32)) uint8 ulvec8[32];
390 #elif !defined(__pnacl__) && (defined(__GNUC__) || defined(__clang__))
391 // Caveat GCC 4.2 to 4.7 have a known issue using vectors with const.
392 #define SIMD_ALIGNED(var) var __attribute__((aligned(16)))
393 #define SIMD_ALIGNED32(var) var __attribute__((aligned(64)))
394 typedef int16 __attribute__((vector_size(16))) vec16;
395 typedef int32 __attribute__((vector_size(16))) vec32;
396 typedef int8 __attribute__((vector_size(16))) vec8;
397 typedef uint16 __attribute__((vector_size(16))) uvec16;
398 typedef uint32 __attribute__((vector_size(16))) uvec32;
399 typedef uint8 __attribute__((vector_size(16))) uvec8;
400 typedef int16 __attribute__((vector_size(32))) lvec16;
401 typedef int32 __attribute__((vector_size(32))) lvec32;
402 typedef int8 __attribute__((vector_size(32))) lvec8;
403 typedef uint16 __attribute__((vector_size(32))) ulvec16;
404 typedef uint32 __attribute__((vector_size(32))) ulvec32;
405 typedef uint8 __attribute__((vector_size(32))) ulvec8;
406 #else
407 #define SIMD_ALIGNED(var) var
408 #define SIMD_ALIGNED32(var) var
409 typedef int16 vec16[8];
410 typedef int32 vec32[4];
411 typedef int8 vec8[16];
412 typedef uint16 uvec16[8];
413 typedef uint32 uvec32[4];
414 typedef uint8 uvec8[16];
415 typedef int16 lvec16[16];
416 typedef int32 lvec32[8];
417 typedef int8 lvec8[32];
418 typedef uint16 ulvec16[16];
419 typedef uint32 ulvec32[8];
420 typedef uint8 ulvec8[32];
421 #endif
422 
423 #if defined(__aarch64__)
424 // This struct is for Arm64 color conversion.
425 struct YuvConstants {
426   uvec16 kUVToRB;
427   uvec16 kUVToRB2;
428   uvec16 kUVToG;
429   uvec16 kUVToG2;
430   vec16 kUVBiasBGR;
431   vec32 kYToRgb;
432 };
433 #elif defined(__arm__)
434 // This struct is for ArmV7 color conversion.
435 struct YuvConstants {
436   uvec8 kUVToRB;
437   uvec8 kUVToG;
438   vec16 kUVBiasBGR;
439   vec32 kYToRgb;
440 };
441 #else
442 // This struct is for Intel color conversion.
443 struct YuvConstants {
444   lvec8 kUVToB;
445   lvec8 kUVToG;
446   lvec8 kUVToR;
447   lvec16 kUVBiasB;
448   lvec16 kUVBiasG;
449   lvec16 kUVBiasR;
450   lvec16 kYToRgb;
451 };
452 
453 // Offsets into YuvConstants structure
454 #define KUVTOB   0
455 #define KUVTOG   32
456 #define KUVTOR   64
457 #define KUVBIASB 96
458 #define KUVBIASG 128
459 #define KUVBIASR 160
460 #define KYTORGB  192
461 #endif
462 
463 // Conversion matrix for YUV to RGB
464 extern const struct YuvConstants kYuvI601Constants;  // BT.601
465 extern const struct YuvConstants kYuvJPEGConstants;  // JPeg color space
466 extern const struct YuvConstants kYuvH709Constants;  // BT.709
467 
468 // Conversion matrix for YVU to BGR
469 extern const struct YuvConstants kYvuI601Constants;  // BT.601
470 extern const struct YuvConstants kYvuJPEGConstants;  // JPeg color space
471 extern const struct YuvConstants kYvuH709Constants;  // BT.709
472 
473 #if defined(__APPLE__) || defined(__x86_64__) || defined(__llvm__)
474 #define OMITFP
475 #else
476 #define OMITFP __attribute__((optimize("omit-frame-pointer")))
477 #endif
478 
479 // NaCL macros for GCC x86 and x64.
480 #if defined(__native_client__)
481 #define LABELALIGN ".p2align 5\n"
482 #else
483 #define LABELALIGN
484 #endif
485 #if defined(__native_client__) && defined(__x86_64__)
486 // r14 is used for MEMOP macros.
487 #define NACL_R14 "r14",
488 #define BUNDLELOCK ".bundle_lock\n"
489 #define BUNDLEUNLOCK ".bundle_unlock\n"
490 #define MEMACCESS(base) "%%nacl:(%%r15,%q" #base ")"
491 #define MEMACCESS2(offset, base) "%%nacl:" #offset "(%%r15,%q" #base ")"
492 #define MEMLEA(offset, base) #offset "(%q" #base ")"
493 #define MEMLEA3(offset, index, scale) \
494     #offset "(,%q" #index "," #scale ")"
495 #define MEMLEA4(offset, base, index, scale) \
496     #offset "(%q" #base ",%q" #index "," #scale ")"
497 #define MEMMOVESTRING(s, d) "%%nacl:(%q" #s "),%%nacl:(%q" #d "), %%r15"
498 #define MEMSTORESTRING(reg, d) "%%" #reg ",%%nacl:(%q" #d "), %%r15"
499 #define MEMOPREG(opcode, offset, base, index, scale, reg) \
500     BUNDLELOCK \
501     "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \
502     #opcode " (%%r15,%%r14),%%" #reg "\n" \
503     BUNDLEUNLOCK
504 #define MEMOPMEM(opcode, reg, offset, base, index, scale) \
505     BUNDLELOCK \
506     "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \
507     #opcode " %%" #reg ",(%%r15,%%r14)\n" \
508     BUNDLEUNLOCK
509 #define MEMOPARG(opcode, offset, base, index, scale, arg) \
510     BUNDLELOCK \
511     "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \
512     #opcode " (%%r15,%%r14),%" #arg "\n" \
513     BUNDLEUNLOCK
514 #define VMEMOPREG(opcode, offset, base, index, scale, reg1, reg2) \
515     BUNDLELOCK \
516     "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \
517     #opcode " (%%r15,%%r14),%%" #reg1 ",%%" #reg2 "\n" \
518     BUNDLEUNLOCK
519 #define VEXTOPMEM(op, sel, reg, offset, base, index, scale) \
520     BUNDLELOCK \
521     "lea " #offset "(%q" #base ",%q" #index "," #scale "),%%r14d\n" \
522     #op " $" #sel ",%%" #reg ",(%%r15,%%r14)\n" \
523     BUNDLEUNLOCK
524 #else  // defined(__native_client__) && defined(__x86_64__)
525 #define NACL_R14
526 #define BUNDLEALIGN
527 #define MEMACCESS(base) "(%" #base ")"
528 #define MEMACCESS2(offset, base) #offset "(%" #base ")"
529 #define MEMLEA(offset, base) #offset "(%" #base ")"
530 #define MEMLEA3(offset, index, scale) \
531     #offset "(,%" #index "," #scale ")"
532 #define MEMLEA4(offset, base, index, scale) \
533     #offset "(%" #base ",%" #index "," #scale ")"
534 #define MEMMOVESTRING(s, d)
535 #define MEMSTORESTRING(reg, d)
536 #define MEMOPREG(opcode, offset, base, index, scale, reg) \
537     #opcode " " #offset "(%" #base ",%" #index "," #scale "),%%" #reg "\n"
538 #define MEMOPMEM(opcode, reg, offset, base, index, scale) \
539     #opcode " %%" #reg ","#offset "(%" #base ",%" #index "," #scale ")\n"
540 #define MEMOPARG(opcode, offset, base, index, scale, arg) \
541     #opcode " " #offset "(%" #base ",%" #index "," #scale "),%" #arg "\n"
542 #define VMEMOPREG(opcode, offset, base, index, scale, reg1, reg2) \
543     #opcode " " #offset "(%" #base ",%" #index "," #scale "),%%" #reg1 ",%%" \
544     #reg2 "\n"
545 #define VEXTOPMEM(op, sel, reg, offset, base, index, scale) \
546     #op " $" #sel ",%%" #reg ","#offset "(%" #base ",%" #index "," #scale ")\n"
547 #endif  // defined(__native_client__) && defined(__x86_64__)
548 
549 #if defined(__arm__) || defined(__aarch64__)
550 #undef MEMACCESS
551 #if defined(__native_client__)
552 #define MEMACCESS(base) ".p2align 3\nbic %" #base ", #0xc0000000\n"
553 #else
554 #define MEMACCESS(base)
555 #endif
556 #endif
557 
558 void I444ToARGBRow_NEON(const uint8* src_y,
559                         const uint8* src_u,
560                         const uint8* src_v,
561                         uint8* dst_argb,
562                         const struct YuvConstants* yuvconstants,
563                         int width);
564 void I422ToARGBRow_NEON(const uint8* src_y,
565                         const uint8* src_u,
566                         const uint8* src_v,
567                         uint8* dst_argb,
568                         const struct YuvConstants* yuvconstants,
569                         int width);
570 void I422AlphaToARGBRow_NEON(const uint8* y_buf,
571                              const uint8* u_buf,
572                              const uint8* v_buf,
573                              const uint8* a_buf,
574                              uint8* dst_argb,
575                              const struct YuvConstants* yuvconstants,
576                              int width);
577 void I422ToARGBRow_NEON(const uint8* src_y,
578                         const uint8* src_u,
579                         const uint8* src_v,
580                         uint8* dst_argb,
581                         const struct YuvConstants* yuvconstants,
582                         int width);
583 void I411ToARGBRow_NEON(const uint8* src_y,
584                         const uint8* src_u,
585                         const uint8* src_v,
586                         uint8* dst_argb,
587                         const struct YuvConstants* yuvconstants,
588                         int width);
589 void I422ToRGBARow_NEON(const uint8* src_y,
590                         const uint8* src_u,
591                         const uint8* src_v,
592                         uint8* dst_rgba,
593                         const struct YuvConstants* yuvconstants,
594                         int width);
595 void I422ToRGB24Row_NEON(const uint8* src_y,
596                          const uint8* src_u,
597                          const uint8* src_v,
598                          uint8* dst_rgb24,
599                          const struct YuvConstants* yuvconstants,
600                          int width);
601 void I422ToRGB565Row_NEON(const uint8* src_y,
602                           const uint8* src_u,
603                           const uint8* src_v,
604                           uint8* dst_rgb565,
605                           const struct YuvConstants* yuvconstants,
606                           int width);
607 void I422ToARGB1555Row_NEON(const uint8* src_y,
608                             const uint8* src_u,
609                             const uint8* src_v,
610                             uint8* dst_argb1555,
611                             const struct YuvConstants* yuvconstants,
612                             int width);
613 void I422ToARGB4444Row_NEON(const uint8* src_y,
614                             const uint8* src_u,
615                             const uint8* src_v,
616                             uint8* dst_argb4444,
617                             const struct YuvConstants* yuvconstants,
618                             int width);
619 void NV12ToARGBRow_NEON(const uint8* src_y,
620                         const uint8* src_uv,
621                         uint8* dst_argb,
622                         const struct YuvConstants* yuvconstants,
623                         int width);
624 void NV12ToRGB565Row_NEON(const uint8* src_y,
625                           const uint8* src_uv,
626                           uint8* dst_rgb565,
627                           const struct YuvConstants* yuvconstants,
628                           int width);
629 void NV21ToARGBRow_NEON(const uint8* src_y,
630                         const uint8* src_vu,
631                         uint8* dst_argb,
632                         const struct YuvConstants* yuvconstants,
633                         int width);
634 void YUY2ToARGBRow_NEON(const uint8* src_yuy2,
635                         uint8* dst_argb,
636                         const struct YuvConstants* yuvconstants,
637                         int width);
638 void UYVYToARGBRow_NEON(const uint8* src_uyvy,
639                         uint8* dst_argb,
640                         const struct YuvConstants* yuvconstants,
641                         int width);
642 
643 void ARGBToYRow_AVX2(const uint8* src_argb, uint8* dst_y, int width);
644 void ARGBToYRow_Any_AVX2(const uint8* src_argb, uint8* dst_y, int width);
645 void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int width);
646 void ARGBToYJRow_AVX2(const uint8* src_argb, uint8* dst_y, int width);
647 void ARGBToYJRow_Any_AVX2(const uint8* src_argb, uint8* dst_y, int width);
648 void ARGBToYJRow_SSSE3(const uint8* src_argb, uint8* dst_y, int width);
649 void BGRAToYRow_SSSE3(const uint8* src_bgra, uint8* dst_y, int width);
650 void ABGRToYRow_SSSE3(const uint8* src_abgr, uint8* dst_y, int width);
651 void RGBAToYRow_SSSE3(const uint8* src_rgba, uint8* dst_y, int width);
652 void RGB24ToYRow_SSSE3(const uint8* src_rgb24, uint8* dst_y, int width);
653 void RAWToYRow_SSSE3(const uint8* src_raw, uint8* dst_y, int width);
654 void ARGBToYRow_NEON(const uint8* src_argb, uint8* dst_y, int width);
655 void ARGBToYJRow_NEON(const uint8* src_argb, uint8* dst_y, int width);
656 void ARGBToUV444Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
657                          int width);
658 void ARGBToUV411Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
659                          int width);
660 void ARGBToUVRow_NEON(const uint8* src_argb, int src_stride_argb,
661                       uint8* dst_u, uint8* dst_v, int width);
662 void ARGBToUVJRow_NEON(const uint8* src_argb, int src_stride_argb,
663                        uint8* dst_u, uint8* dst_v, int width);
664 void BGRAToUVRow_NEON(const uint8* src_bgra, int src_stride_bgra,
665                       uint8* dst_u, uint8* dst_v, int width);
666 void ABGRToUVRow_NEON(const uint8* src_abgr, int src_stride_abgr,
667                       uint8* dst_u, uint8* dst_v, int width);
668 void RGBAToUVRow_NEON(const uint8* src_rgba, int src_stride_rgba,
669                       uint8* dst_u, uint8* dst_v, int width);
670 void RGB24ToUVRow_NEON(const uint8* src_rgb24, int src_stride_rgb24,
671                        uint8* dst_u, uint8* dst_v, int width);
672 void RAWToUVRow_NEON(const uint8* src_raw, int src_stride_raw,
673                      uint8* dst_u, uint8* dst_v, int width);
674 void RGB565ToUVRow_NEON(const uint8* src_rgb565, int src_stride_rgb565,
675                         uint8* dst_u, uint8* dst_v, int width);
676 void ARGB1555ToUVRow_NEON(const uint8* src_argb1555, int src_stride_argb1555,
677                           uint8* dst_u, uint8* dst_v, int width);
678 void ARGB4444ToUVRow_NEON(const uint8* src_argb4444, int src_stride_argb4444,
679                           uint8* dst_u, uint8* dst_v, int width);
680 void BGRAToYRow_NEON(const uint8* src_bgra, uint8* dst_y, int width);
681 void ABGRToYRow_NEON(const uint8* src_abgr, uint8* dst_y, int width);
682 void RGBAToYRow_NEON(const uint8* src_rgba, uint8* dst_y, int width);
683 void RGB24ToYRow_NEON(const uint8* src_rgb24, uint8* dst_y, int width);
684 void RAWToYRow_NEON(const uint8* src_raw, uint8* dst_y, int width);
685 void RGB565ToYRow_NEON(const uint8* src_rgb565, uint8* dst_y, int width);
686 void ARGB1555ToYRow_NEON(const uint8* src_argb1555, uint8* dst_y, int width);
687 void ARGB4444ToYRow_NEON(const uint8* src_argb4444, uint8* dst_y, int width);
688 void ARGBToYRow_C(const uint8* src_argb, uint8* dst_y, int width);
689 void ARGBToYJRow_C(const uint8* src_argb, uint8* dst_y, int width);
690 void BGRAToYRow_C(const uint8* src_bgra, uint8* dst_y, int width);
691 void ABGRToYRow_C(const uint8* src_abgr, uint8* dst_y, int width);
692 void RGBAToYRow_C(const uint8* src_rgba, uint8* dst_y, int width);
693 void RGB24ToYRow_C(const uint8* src_rgb24, uint8* dst_y, int width);
694 void RAWToYRow_C(const uint8* src_raw, uint8* dst_y, int width);
695 void RGB565ToYRow_C(const uint8* src_rgb565, uint8* dst_y, int width);
696 void ARGB1555ToYRow_C(const uint8* src_argb1555, uint8* dst_y, int width);
697 void ARGB4444ToYRow_C(const uint8* src_argb4444, uint8* dst_y, int width);
698 void ARGBToYRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int width);
699 void ARGBToYJRow_Any_SSSE3(const uint8* src_argb, uint8* dst_y, int width);
700 void BGRAToYRow_Any_SSSE3(const uint8* src_bgra, uint8* dst_y, int width);
701 void ABGRToYRow_Any_SSSE3(const uint8* src_abgr, uint8* dst_y, int width);
702 void RGBAToYRow_Any_SSSE3(const uint8* src_rgba, uint8* dst_y, int width);
703 void RGB24ToYRow_Any_SSSE3(const uint8* src_rgb24, uint8* dst_y, int width);
704 void RAWToYRow_Any_SSSE3(const uint8* src_raw, uint8* dst_y, int width);
705 void ARGBToYRow_Any_NEON(const uint8* src_argb, uint8* dst_y, int width);
706 void ARGBToYJRow_Any_NEON(const uint8* src_argb, uint8* dst_y, int width);
707 void BGRAToYRow_Any_NEON(const uint8* src_bgra, uint8* dst_y, int width);
708 void ABGRToYRow_Any_NEON(const uint8* src_abgr, uint8* dst_y, int width);
709 void RGBAToYRow_Any_NEON(const uint8* src_rgba, uint8* dst_y, int width);
710 void RGB24ToYRow_Any_NEON(const uint8* src_rgb24, uint8* dst_y, int width);
711 void RAWToYRow_Any_NEON(const uint8* src_raw, uint8* dst_y, int width);
712 void RGB565ToYRow_Any_NEON(const uint8* src_rgb565, uint8* dst_y, int width);
713 void ARGB1555ToYRow_Any_NEON(const uint8* src_argb1555, uint8* dst_y,
714                              int width);
715 void ARGB4444ToYRow_Any_NEON(const uint8* src_argb4444, uint8* dst_y,
716                              int width);
717 
718 void ARGBToUVRow_AVX2(const uint8* src_argb, int src_stride_argb,
719                       uint8* dst_u, uint8* dst_v, int width);
720 void ARGBToUVJRow_AVX2(const uint8* src_argb, int src_stride_argb,
721                        uint8* dst_u, uint8* dst_v, int width);
722 void ARGBToUVRow_SSSE3(const uint8* src_argb, int src_stride_argb,
723                        uint8* dst_u, uint8* dst_v, int width);
724 void ARGBToUVJRow_SSSE3(const uint8* src_argb, int src_stride_argb,
725                         uint8* dst_u, uint8* dst_v, int width);
726 void BGRAToUVRow_SSSE3(const uint8* src_bgra, int src_stride_bgra,
727                        uint8* dst_u, uint8* dst_v, int width);
728 void ABGRToUVRow_SSSE3(const uint8* src_abgr, int src_stride_abgr,
729                        uint8* dst_u, uint8* dst_v, int width);
730 void RGBAToUVRow_SSSE3(const uint8* src_rgba, int src_stride_rgba,
731                        uint8* dst_u, uint8* dst_v, int width);
732 void ARGBToUVRow_Any_AVX2(const uint8* src_argb, int src_stride_argb,
733                           uint8* dst_u, uint8* dst_v, int width);
734 void ARGBToUVJRow_Any_AVX2(const uint8* src_argb, int src_stride_argb,
735                            uint8* dst_u, uint8* dst_v, int width);
736 void ARGBToUVRow_Any_SSSE3(const uint8* src_argb, int src_stride_argb,
737                            uint8* dst_u, uint8* dst_v, int width);
738 void ARGBToUVJRow_Any_SSSE3(const uint8* src_argb, int src_stride_argb,
739                             uint8* dst_u, uint8* dst_v, int width);
740 void BGRAToUVRow_Any_SSSE3(const uint8* src_bgra, int src_stride_bgra,
741                            uint8* dst_u, uint8* dst_v, int width);
742 void ABGRToUVRow_Any_SSSE3(const uint8* src_abgr, int src_stride_abgr,
743                            uint8* dst_u, uint8* dst_v, int width);
744 void RGBAToUVRow_Any_SSSE3(const uint8* src_rgba, int src_stride_rgba,
745                            uint8* dst_u, uint8* dst_v, int width);
746 void ARGBToUV444Row_Any_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
747                              int width);
748 void ARGBToUV411Row_Any_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
749                              int width);
750 void ARGBToUVRow_Any_NEON(const uint8* src_argb, int src_stride_argb,
751                           uint8* dst_u, uint8* dst_v, int width);
752 void ARGBToUVJRow_Any_NEON(const uint8* src_argb, int src_stride_argb,
753                            uint8* dst_u, uint8* dst_v, int width);
754 void BGRAToUVRow_Any_NEON(const uint8* src_bgra, int src_stride_bgra,
755                           uint8* dst_u, uint8* dst_v, int width);
756 void ABGRToUVRow_Any_NEON(const uint8* src_abgr, int src_stride_abgr,
757                           uint8* dst_u, uint8* dst_v, int width);
758 void RGBAToUVRow_Any_NEON(const uint8* src_rgba, int src_stride_rgba,
759                           uint8* dst_u, uint8* dst_v, int width);
760 void RGB24ToUVRow_Any_NEON(const uint8* src_rgb24, int src_stride_rgb24,
761                            uint8* dst_u, uint8* dst_v, int width);
762 void RAWToUVRow_Any_NEON(const uint8* src_raw, int src_stride_raw,
763                          uint8* dst_u, uint8* dst_v, int width);
764 void RGB565ToUVRow_Any_NEON(const uint8* src_rgb565, int src_stride_rgb565,
765                             uint8* dst_u, uint8* dst_v, int width);
766 void ARGB1555ToUVRow_Any_NEON(const uint8* src_argb1555,
767                               int src_stride_argb1555,
768                               uint8* dst_u, uint8* dst_v, int width);
769 void ARGB4444ToUVRow_Any_NEON(const uint8* src_argb4444,
770                               int src_stride_argb4444,
771                               uint8* dst_u, uint8* dst_v, int width);
772 void ARGBToUVRow_C(const uint8* src_argb, int src_stride_argb,
773                    uint8* dst_u, uint8* dst_v, int width);
774 void ARGBToUVJRow_C(const uint8* src_argb, int src_stride_argb,
775                     uint8* dst_u, uint8* dst_v, int width);
776 void BGRAToUVRow_C(const uint8* src_bgra, int src_stride_bgra,
777                    uint8* dst_u, uint8* dst_v, int width);
778 void ABGRToUVRow_C(const uint8* src_abgr, int src_stride_abgr,
779                    uint8* dst_u, uint8* dst_v, int width);
780 void RGBAToUVRow_C(const uint8* src_rgba, int src_stride_rgba,
781                    uint8* dst_u, uint8* dst_v, int width);
782 void RGB24ToUVRow_C(const uint8* src_rgb24, int src_stride_rgb24,
783                     uint8* dst_u, uint8* dst_v, int width);
784 void RAWToUVRow_C(const uint8* src_raw, int src_stride_raw,
785                   uint8* dst_u, uint8* dst_v, int width);
786 void RGB565ToUVRow_C(const uint8* src_rgb565, int src_stride_rgb565,
787                      uint8* dst_u, uint8* dst_v, int width);
788 void ARGB1555ToUVRow_C(const uint8* src_argb1555, int src_stride_argb1555,
789                        uint8* dst_u, uint8* dst_v, int width);
790 void ARGB4444ToUVRow_C(const uint8* src_argb4444, int src_stride_argb4444,
791                        uint8* dst_u, uint8* dst_v, int width);
792 
793 void ARGBToUV444Row_SSSE3(const uint8* src_argb,
794                           uint8* dst_u, uint8* dst_v, int width);
795 void ARGBToUV444Row_Any_SSSE3(const uint8* src_argb,
796                               uint8* dst_u, uint8* dst_v, int width);
797 
798 void ARGBToUV444Row_C(const uint8* src_argb,
799                       uint8* dst_u, uint8* dst_v, int width);
800 void ARGBToUV411Row_C(const uint8* src_argb,
801                       uint8* dst_u, uint8* dst_v, int width);
802 
803 void MirrorRow_AVX2(const uint8* src, uint8* dst, int width);
804 void MirrorRow_SSSE3(const uint8* src, uint8* dst, int width);
805 void MirrorRow_NEON(const uint8* src, uint8* dst, int width);
806 void MirrorRow_DSPR2(const uint8* src, uint8* dst, int width);
807 void MirrorRow_C(const uint8* src, uint8* dst, int width);
808 void MirrorRow_Any_AVX2(const uint8* src, uint8* dst, int width);
809 void MirrorRow_Any_SSSE3(const uint8* src, uint8* dst, int width);
810 void MirrorRow_Any_SSE2(const uint8* src, uint8* dst, int width);
811 void MirrorRow_Any_NEON(const uint8* src, uint8* dst, int width);
812 
813 void MirrorUVRow_SSSE3(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
814                        int width);
815 void MirrorUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
816                       int width);
817 void MirrorUVRow_DSPR2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
818                        int width);
819 void MirrorUVRow_C(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int width);
820 
821 void ARGBMirrorRow_AVX2(const uint8* src, uint8* dst, int width);
822 void ARGBMirrorRow_SSE2(const uint8* src, uint8* dst, int width);
823 void ARGBMirrorRow_NEON(const uint8* src, uint8* dst, int width);
824 void ARGBMirrorRow_C(const uint8* src, uint8* dst, int width);
825 void ARGBMirrorRow_Any_AVX2(const uint8* src, uint8* dst, int width);
826 void ARGBMirrorRow_Any_SSE2(const uint8* src, uint8* dst, int width);
827 void ARGBMirrorRow_Any_NEON(const uint8* src, uint8* dst, int width);
828 
829 void SplitUVRow_C(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int width);
830 void SplitUVRow_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
831                      int width);
832 void SplitUVRow_AVX2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
833                      int width);
834 void SplitUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
835                      int width);
836 void SplitUVRow_DSPR2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
837                       int width);
838 void SplitUVRow_Any_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
839                          int width);
840 void SplitUVRow_Any_AVX2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
841                          int width);
842 void SplitUVRow_Any_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
843                          int width);
844 void SplitUVRow_Any_DSPR2(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
845                           int width);
846 
847 void MergeUVRow_C(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
848                   int width);
849 void MergeUVRow_SSE2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
850                      int width);
851 void MergeUVRow_AVX2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
852                      int width);
853 void MergeUVRow_NEON(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
854                      int width);
855 void MergeUVRow_Any_SSE2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
856                          int width);
857 void MergeUVRow_Any_AVX2(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
858                          int width);
859 void MergeUVRow_Any_NEON(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
860                          int width);
861 
862 void CopyRow_SSE2(const uint8* src, uint8* dst, int count);
863 void CopyRow_AVX(const uint8* src, uint8* dst, int count);
864 void CopyRow_ERMS(const uint8* src, uint8* dst, int count);
865 void CopyRow_NEON(const uint8* src, uint8* dst, int count);
866 void CopyRow_MIPS(const uint8* src, uint8* dst, int count);
867 void CopyRow_C(const uint8* src, uint8* dst, int count);
868 void CopyRow_Any_SSE2(const uint8* src, uint8* dst, int count);
869 void CopyRow_Any_AVX(const uint8* src, uint8* dst, int count);
870 void CopyRow_Any_NEON(const uint8* src, uint8* dst, int count);
871 
872 void CopyRow_16_C(const uint16* src, uint16* dst, int count);
873 
874 void ARGBCopyAlphaRow_C(const uint8* src_argb, uint8* dst_argb, int width);
875 void ARGBCopyAlphaRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width);
876 void ARGBCopyAlphaRow_AVX2(const uint8* src_argb, uint8* dst_argb, int width);
877 void ARGBCopyAlphaRow_Any_SSE2(const uint8* src_argb, uint8* dst_argb,
878                                int width);
879 void ARGBCopyAlphaRow_Any_AVX2(const uint8* src_argb, uint8* dst_argb,
880                                int width);
881 
882 void ARGBExtractAlphaRow_C(const uint8* src_argb, uint8* dst_a, int width);
883 void ARGBExtractAlphaRow_SSE2(const uint8* src_argb, uint8* dst_a, int width);
884 void ARGBExtractAlphaRow_NEON(const uint8* src_argb, uint8* dst_a, int width);
885 void ARGBExtractAlphaRow_Any_SSE2(const uint8* src_argb, uint8* dst_a,
886                                   int width);
887 void ARGBExtractAlphaRow_Any_NEON(const uint8* src_argb, uint8* dst_a,
888                                   int width);
889 
890 void ARGBCopyYToAlphaRow_C(const uint8* src_y, uint8* dst_argb, int width);
891 void ARGBCopyYToAlphaRow_SSE2(const uint8* src_y, uint8* dst_argb, int width);
892 void ARGBCopyYToAlphaRow_AVX2(const uint8* src_y, uint8* dst_argb, int width);
893 void ARGBCopyYToAlphaRow_Any_SSE2(const uint8* src_y, uint8* dst_argb,
894                                   int width);
895 void ARGBCopyYToAlphaRow_Any_AVX2(const uint8* src_y, uint8* dst_argb,
896                                   int width);
897 
898 void SetRow_C(uint8* dst, uint8 v8, int count);
899 void SetRow_X86(uint8* dst, uint8 v8, int count);
900 void SetRow_ERMS(uint8* dst, uint8 v8, int count);
901 void SetRow_NEON(uint8* dst, uint8 v8, int count);
902 void SetRow_Any_X86(uint8* dst, uint8 v8, int count);
903 void SetRow_Any_NEON(uint8* dst, uint8 v8, int count);
904 
905 void ARGBSetRow_C(uint8* dst_argb, uint32 v32, int count);
906 void ARGBSetRow_X86(uint8* dst_argb, uint32 v32, int count);
907 void ARGBSetRow_NEON(uint8* dst_argb, uint32 v32, int count);
908 void ARGBSetRow_Any_NEON(uint8* dst_argb, uint32 v32, int count);
909 
910 // ARGBShufflers for BGRAToARGB etc.
911 void ARGBShuffleRow_C(const uint8* src_argb, uint8* dst_argb,
912                       const uint8* shuffler, int width);
913 void ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb,
914                          const uint8* shuffler, int width);
915 void ARGBShuffleRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
916                           const uint8* shuffler, int width);
917 void ARGBShuffleRow_AVX2(const uint8* src_argb, uint8* dst_argb,
918                          const uint8* shuffler, int width);
919 void ARGBShuffleRow_NEON(const uint8* src_argb, uint8* dst_argb,
920                          const uint8* shuffler, int width);
921 void ARGBShuffleRow_Any_SSE2(const uint8* src_argb, uint8* dst_argb,
922                              const uint8* shuffler, int width);
923 void ARGBShuffleRow_Any_SSSE3(const uint8* src_argb, uint8* dst_argb,
924                               const uint8* shuffler, int width);
925 void ARGBShuffleRow_Any_AVX2(const uint8* src_argb, uint8* dst_argb,
926                              const uint8* shuffler, int width);
927 void ARGBShuffleRow_Any_NEON(const uint8* src_argb, uint8* dst_argb,
928                              const uint8* shuffler, int width);
929 
930 void RGB24ToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int width);
931 void RAWToARGBRow_SSSE3(const uint8* src_raw, uint8* dst_argb, int width);
932 void RAWToRGB24Row_SSSE3(const uint8* src_raw, uint8* dst_rgb24, int width);
933 void RGB565ToARGBRow_SSE2(const uint8* src_rgb565, uint8* dst_argb, int width);
934 void ARGB1555ToARGBRow_SSE2(const uint8* src_argb1555, uint8* dst_argb,
935                             int width);
936 void ARGB4444ToARGBRow_SSE2(const uint8* src_argb4444, uint8* dst_argb,
937                             int width);
938 void RGB565ToARGBRow_AVX2(const uint8* src_rgb565, uint8* dst_argb, int width);
939 void ARGB1555ToARGBRow_AVX2(const uint8* src_argb1555, uint8* dst_argb,
940                             int width);
941 void ARGB4444ToARGBRow_AVX2(const uint8* src_argb4444, uint8* dst_argb,
942                             int width);
943 
944 void RGB24ToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int width);
945 void RAWToARGBRow_NEON(const uint8* src_raw, uint8* dst_argb, int width);
946 void RAWToRGB24Row_NEON(const uint8* src_raw, uint8* dst_rgb24, int width);
947 void RGB565ToARGBRow_NEON(const uint8* src_rgb565, uint8* dst_argb, int width);
948 void ARGB1555ToARGBRow_NEON(const uint8* src_argb1555, uint8* dst_argb,
949                             int width);
950 void ARGB4444ToARGBRow_NEON(const uint8* src_argb4444, uint8* dst_argb,
951                             int width);
952 void RGB24ToARGBRow_C(const uint8* src_rgb24, uint8* dst_argb, int width);
953 void RAWToARGBRow_C(const uint8* src_raw, uint8* dst_argb, int width);
954 void RAWToRGB24Row_C(const uint8* src_raw, uint8* dst_rgb24, int width);
955 void RGB565ToARGBRow_C(const uint8* src_rgb, uint8* dst_argb, int width);
956 void ARGB1555ToARGBRow_C(const uint8* src_argb, uint8* dst_argb, int width);
957 void ARGB4444ToARGBRow_C(const uint8* src_argb, uint8* dst_argb, int width);
958 void RGB24ToARGBRow_Any_SSSE3(const uint8* src_rgb24, uint8* dst_argb,
959                               int width);
960 void RAWToARGBRow_Any_SSSE3(const uint8* src_raw, uint8* dst_argb, int width);
961 void RAWToRGB24Row_Any_SSSE3(const uint8* src_raw, uint8* dst_rgb24, int width);
962 
963 void RGB565ToARGBRow_Any_SSE2(const uint8* src_rgb565, uint8* dst_argb,
964                               int width);
965 void ARGB1555ToARGBRow_Any_SSE2(const uint8* src_argb1555, uint8* dst_argb,
966                                 int width);
967 void ARGB4444ToARGBRow_Any_SSE2(const uint8* src_argb4444, uint8* dst_argb,
968                                 int width);
969 void RGB565ToARGBRow_Any_AVX2(const uint8* src_rgb565, uint8* dst_argb,
970                               int width);
971 void ARGB1555ToARGBRow_Any_AVX2(const uint8* src_argb1555, uint8* dst_argb,
972                                 int width);
973 void ARGB4444ToARGBRow_Any_AVX2(const uint8* src_argb4444, uint8* dst_argb,
974                                 int width);
975 
976 void RGB24ToARGBRow_Any_NEON(const uint8* src_rgb24, uint8* dst_argb,
977                              int width);
978 void RAWToARGBRow_Any_NEON(const uint8* src_raw, uint8* dst_argb, int width);
979 void RAWToRGB24Row_Any_NEON(const uint8* src_raw, uint8* dst_rgb24, int width);
980 void RGB565ToARGBRow_Any_NEON(const uint8* src_rgb565, uint8* dst_argb,
981                               int width);
982 void ARGB1555ToARGBRow_Any_NEON(const uint8* src_argb1555, uint8* dst_argb,
983                                 int width);
984 void ARGB4444ToARGBRow_Any_NEON(const uint8* src_argb4444, uint8* dst_argb,
985                                 int width);
986 
987 void ARGBToRGB24Row_SSSE3(const uint8* src_argb, uint8* dst_rgb, int width);
988 void ARGBToRAWRow_SSSE3(const uint8* src_argb, uint8* dst_rgb, int width);
989 void ARGBToRGB565Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int width);
990 void ARGBToARGB1555Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int width);
991 void ARGBToARGB4444Row_SSE2(const uint8* src_argb, uint8* dst_rgb, int width);
992 
993 void ARGBToRGB565DitherRow_C(const uint8* src_argb, uint8* dst_rgb,
994                              const uint32 dither4, int width);
995 void ARGBToRGB565DitherRow_SSE2(const uint8* src_argb, uint8* dst_rgb,
996                                 const uint32 dither4, int width);
997 void ARGBToRGB565DitherRow_AVX2(const uint8* src_argb, uint8* dst_rgb,
998                                 const uint32 dither4, int width);
999 
1000 void ARGBToRGB565Row_AVX2(const uint8* src_argb, uint8* dst_rgb, int width);
1001 void ARGBToARGB1555Row_AVX2(const uint8* src_argb, uint8* dst_rgb, int width);
1002 void ARGBToARGB4444Row_AVX2(const uint8* src_argb, uint8* dst_rgb, int width);
1003 
1004 void ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb, int width);
1005 void ARGBToRAWRow_NEON(const uint8* src_argb, uint8* dst_rgb, int width);
1006 void ARGBToRGB565Row_NEON(const uint8* src_argb, uint8* dst_rgb, int width);
1007 void ARGBToARGB1555Row_NEON(const uint8* src_argb, uint8* dst_rgb, int width);
1008 void ARGBToARGB4444Row_NEON(const uint8* src_argb, uint8* dst_rgb, int width);
1009 void ARGBToRGB565DitherRow_NEON(const uint8* src_argb, uint8* dst_rgb,
1010                                 const uint32 dither4, int width);
1011 
1012 void ARGBToRGBARow_C(const uint8* src_argb, uint8* dst_rgb, int width);
1013 void ARGBToRGB24Row_C(const uint8* src_argb, uint8* dst_rgb, int width);
1014 void ARGBToRAWRow_C(const uint8* src_argb, uint8* dst_rgb, int width);
1015 void ARGBToRGB565Row_C(const uint8* src_argb, uint8* dst_rgb, int width);
1016 void ARGBToARGB1555Row_C(const uint8* src_argb, uint8* dst_rgb, int width);
1017 void ARGBToARGB4444Row_C(const uint8* src_argb, uint8* dst_rgb, int width);
1018 
1019 void J400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int width);
1020 void J400ToARGBRow_AVX2(const uint8* src_y, uint8* dst_argb, int width);
1021 void J400ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width);
1022 void J400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int width);
1023 void J400ToARGBRow_Any_SSE2(const uint8* src_y, uint8* dst_argb, int width);
1024 void J400ToARGBRow_Any_AVX2(const uint8* src_y, uint8* dst_argb, int width);
1025 void J400ToARGBRow_Any_NEON(const uint8* src_y, uint8* dst_argb, int width);
1026 
1027 void I444ToARGBRow_C(const uint8* src_y,
1028                      const uint8* src_u,
1029                      const uint8* src_v,
1030                      uint8* dst_argb,
1031                      const struct YuvConstants* yuvconstants,
1032                      int width);
1033 void I422ToARGBRow_C(const uint8* src_y,
1034                      const uint8* src_u,
1035                      const uint8* src_v,
1036                      uint8* dst_argb,
1037                      const struct YuvConstants* yuvconstants,
1038                      int width);
1039 void I422ToARGBRow_C(const uint8* src_y,
1040                      const uint8* src_u,
1041                      const uint8* src_v,
1042                      uint8* dst_argb,
1043                      const struct YuvConstants* yuvconstants,
1044                      int width);
1045 void I422AlphaToARGBRow_C(const uint8* y_buf,
1046                           const uint8* u_buf,
1047                           const uint8* v_buf,
1048                           const uint8* a_buf,
1049                           uint8* dst_argb,
1050                           const struct YuvConstants* yuvconstants,
1051                           int width);
1052 void I411ToARGBRow_C(const uint8* src_y,
1053                      const uint8* src_u,
1054                      const uint8* src_v,
1055                      uint8* dst_argb,
1056                      const struct YuvConstants* yuvconstants,
1057                      int width);
1058 void NV12ToARGBRow_C(const uint8* src_y,
1059                      const uint8* src_uv,
1060                      uint8* dst_argb,
1061                      const struct YuvConstants* yuvconstants,
1062                      int width);
1063 void NV12ToRGB565Row_C(const uint8* src_y,
1064                        const uint8* src_uv,
1065                        uint8* dst_argb,
1066                        const struct YuvConstants* yuvconstants,
1067                        int width);
1068 void NV21ToARGBRow_C(const uint8* src_y,
1069                      const uint8* src_uv,
1070                      uint8* dst_argb,
1071                      const struct YuvConstants* yuvconstants,
1072                      int width);
1073 void YUY2ToARGBRow_C(const uint8* src_yuy2,
1074                      uint8* dst_argb,
1075                      const struct YuvConstants* yuvconstants,
1076                      int width);
1077 void UYVYToARGBRow_C(const uint8* src_uyvy,
1078                      uint8* dst_argb,
1079                      const struct YuvConstants* yuvconstants,
1080                      int width);
1081 void I422ToRGBARow_C(const uint8* src_y,
1082                      const uint8* src_u,
1083                      const uint8* src_v,
1084                      uint8* dst_rgba,
1085                      const struct YuvConstants* yuvconstants,
1086                      int width);
1087 void I422ToRGB24Row_C(const uint8* src_y,
1088                       const uint8* src_u,
1089                       const uint8* src_v,
1090                       uint8* dst_rgb24,
1091                       const struct YuvConstants* yuvconstants,
1092                       int width);
1093 void I422ToARGB4444Row_C(const uint8* src_y,
1094                          const uint8* src_u,
1095                          const uint8* src_v,
1096                          uint8* dst_argb4444,
1097                          const struct YuvConstants* yuvconstants,
1098                          int width);
1099 void I422ToARGB1555Row_C(const uint8* src_y,
1100                          const uint8* src_u,
1101                          const uint8* src_v,
1102                          uint8* dst_argb4444,
1103                          const struct YuvConstants* yuvconstants,
1104                          int width);
1105 void I422ToRGB565Row_C(const uint8* src_y,
1106                        const uint8* src_u,
1107                        const uint8* src_v,
1108                        uint8* dst_rgb565,
1109                        const struct YuvConstants* yuvconstants,
1110                        int width);
1111 void I422ToARGBRow_AVX2(const uint8* src_y,
1112                         const uint8* src_u,
1113                         const uint8* src_v,
1114                         uint8* dst_argb,
1115                         const struct YuvConstants* yuvconstants,
1116                         int width);
1117 void I422ToARGBRow_AVX2(const uint8* src_y,
1118                         const uint8* src_u,
1119                         const uint8* src_v,
1120                         uint8* dst_argb,
1121                         const struct YuvConstants* yuvconstants,
1122                         int width);
1123 void I422ToRGBARow_AVX2(const uint8* src_y,
1124                         const uint8* src_u,
1125                         const uint8* src_v,
1126                         uint8* dst_argb,
1127                         const struct YuvConstants* yuvconstants,
1128                         int width);
1129 void I444ToARGBRow_SSSE3(const uint8* src_y,
1130                          const uint8* src_u,
1131                          const uint8* src_v,
1132                          uint8* dst_argb,
1133                          const struct YuvConstants* yuvconstants,
1134                          int width);
1135 void I444ToARGBRow_AVX2(const uint8* src_y,
1136                         const uint8* src_u,
1137                         const uint8* src_v,
1138                         uint8* dst_argb,
1139                         const struct YuvConstants* yuvconstants,
1140                         int width);
1141 void I444ToARGBRow_SSSE3(const uint8* src_y,
1142                          const uint8* src_u,
1143                          const uint8* src_v,
1144                          uint8* dst_argb,
1145                          const struct YuvConstants* yuvconstants,
1146                          int width);
1147 void I444ToARGBRow_AVX2(const uint8* src_y,
1148                         const uint8* src_u,
1149                         const uint8* src_v,
1150                         uint8* dst_argb,
1151                         const struct YuvConstants* yuvconstants,
1152                         int width);
1153 void I422ToARGBRow_SSSE3(const uint8* src_y,
1154                          const uint8* src_u,
1155                          const uint8* src_v,
1156                          uint8* dst_argb,
1157                          const struct YuvConstants* yuvconstants,
1158                          int width);
1159 void I422AlphaToARGBRow_SSSE3(const uint8* y_buf,
1160                               const uint8* u_buf,
1161                               const uint8* v_buf,
1162                               const uint8* a_buf,
1163                               uint8* dst_argb,
1164                               const struct YuvConstants* yuvconstants,
1165                               int width);
1166 void I422AlphaToARGBRow_AVX2(const uint8* y_buf,
1167                              const uint8* u_buf,
1168                              const uint8* v_buf,
1169                              const uint8* a_buf,
1170                              uint8* dst_argb,
1171                              const struct YuvConstants* yuvconstants,
1172                              int width);
1173 void I422ToARGBRow_SSSE3(const uint8* src_y,
1174                          const uint8* src_u,
1175                          const uint8* src_v,
1176                          uint8* dst_argb,
1177                          const struct YuvConstants* yuvconstants,
1178                          int width);
1179 void I411ToARGBRow_SSSE3(const uint8* src_y,
1180                          const uint8* src_u,
1181                          const uint8* src_v,
1182                          uint8* dst_argb,
1183                          const struct YuvConstants* yuvconstants,
1184                          int width);
1185 void I411ToARGBRow_AVX2(const uint8* src_y,
1186                         const uint8* src_u,
1187                         const uint8* src_v,
1188                         uint8* dst_argb,
1189                         const struct YuvConstants* yuvconstants,
1190                         int width);
1191 void NV12ToARGBRow_SSSE3(const uint8* src_y,
1192                          const uint8* src_uv,
1193                          uint8* dst_argb,
1194                          const struct YuvConstants* yuvconstants,
1195                          int width);
1196 void NV12ToARGBRow_AVX2(const uint8* src_y,
1197                         const uint8* src_uv,
1198                         uint8* dst_argb,
1199                         const struct YuvConstants* yuvconstants,
1200                         int width);
1201 void NV12ToRGB565Row_SSSE3(const uint8* src_y,
1202                            const uint8* src_uv,
1203                            uint8* dst_argb,
1204                            const struct YuvConstants* yuvconstants,
1205                            int width);
1206 void NV12ToRGB565Row_AVX2(const uint8* src_y,
1207                           const uint8* src_uv,
1208                           uint8* dst_argb,
1209                           const struct YuvConstants* yuvconstants,
1210                           int width);
1211 void NV21ToARGBRow_SSSE3(const uint8* src_y,
1212                          const uint8* src_uv,
1213                          uint8* dst_argb,
1214                          const struct YuvConstants* yuvconstants,
1215                          int width);
1216 void NV21ToARGBRow_AVX2(const uint8* src_y,
1217                         const uint8* src_uv,
1218                         uint8* dst_argb,
1219                         const struct YuvConstants* yuvconstants,
1220                         int width);
1221 void YUY2ToARGBRow_SSSE3(const uint8* src_yuy2,
1222                          uint8* dst_argb,
1223                          const struct YuvConstants* yuvconstants,
1224                          int width);
1225 void UYVYToARGBRow_SSSE3(const uint8* src_uyvy,
1226                          uint8* dst_argb,
1227                          const struct YuvConstants* yuvconstants,
1228                          int width);
1229 void YUY2ToARGBRow_AVX2(const uint8* src_yuy2,
1230                         uint8* dst_argb,
1231                         const struct YuvConstants* yuvconstants,
1232                         int width);
1233 void UYVYToARGBRow_AVX2(const uint8* src_uyvy,
1234                         uint8* dst_argb,
1235                         const struct YuvConstants* yuvconstants,
1236                         int width);
1237 void I422ToRGBARow_SSSE3(const uint8* src_y,
1238                          const uint8* src_u,
1239                          const uint8* src_v,
1240                          uint8* dst_rgba,
1241                          const struct YuvConstants* yuvconstants,
1242                          int width);
1243 void I422ToARGB4444Row_SSSE3(const uint8* src_y,
1244                              const uint8* src_u,
1245                              const uint8* src_v,
1246                              uint8* dst_argb,
1247                              const struct YuvConstants* yuvconstants,
1248                              int width);
1249 void I422ToARGB4444Row_AVX2(const uint8* src_y,
1250                             const uint8* src_u,
1251                             const uint8* src_v,
1252                             uint8* dst_argb,
1253                             const struct YuvConstants* yuvconstants,
1254                             int width);
1255 void I422ToARGB1555Row_SSSE3(const uint8* src_y,
1256                              const uint8* src_u,
1257                              const uint8* src_v,
1258                              uint8* dst_argb,
1259                              const struct YuvConstants* yuvconstants,
1260                              int width);
1261 void I422ToARGB1555Row_AVX2(const uint8* src_y,
1262                             const uint8* src_u,
1263                             const uint8* src_v,
1264                             uint8* dst_argb,
1265                             const struct YuvConstants* yuvconstants,
1266                             int width);
1267 void I422ToRGB565Row_SSSE3(const uint8* src_y,
1268                            const uint8* src_u,
1269                            const uint8* src_v,
1270                            uint8* dst_argb,
1271                            const struct YuvConstants* yuvconstants,
1272                            int width);
1273 void I422ToRGB565Row_AVX2(const uint8* src_y,
1274                           const uint8* src_u,
1275                           const uint8* src_v,
1276                           uint8* dst_argb,
1277                           const struct YuvConstants* yuvconstants,
1278                           int width);
1279 void I422ToRGB24Row_SSSE3(const uint8* src_y,
1280                           const uint8* src_u,
1281                           const uint8* src_v,
1282                           uint8* dst_rgb24,
1283                           const struct YuvConstants* yuvconstants,
1284                           int width);
1285 void I422ToRGB24Row_AVX2(const uint8* src_y,
1286                          const uint8* src_u,
1287                          const uint8* src_v,
1288                          uint8* dst_rgb24,
1289                          const struct YuvConstants* yuvconstants,
1290                          int width);
1291 void I422ToARGBRow_Any_AVX2(const uint8* src_y,
1292                             const uint8* src_u,
1293                             const uint8* src_v,
1294                             uint8* dst_argb,
1295                             const struct YuvConstants* yuvconstants,
1296                             int width);
1297 void I422ToRGBARow_Any_AVX2(const uint8* src_y,
1298                             const uint8* src_u,
1299                             const uint8* src_v,
1300                             uint8* dst_argb,
1301                             const struct YuvConstants* yuvconstants,
1302                             int width);
1303 void I444ToARGBRow_Any_SSSE3(const uint8* src_y,
1304                              const uint8* src_u,
1305                              const uint8* src_v,
1306                              uint8* dst_argb,
1307                              const struct YuvConstants* yuvconstants,
1308                              int width);
1309 void I444ToARGBRow_Any_AVX2(const uint8* src_y,
1310                             const uint8* src_u,
1311                             const uint8* src_v,
1312                             uint8* dst_argb,
1313                             const struct YuvConstants* yuvconstants,
1314                             int width);
1315 void I422ToARGBRow_Any_SSSE3(const uint8* src_y,
1316                              const uint8* src_u,
1317                              const uint8* src_v,
1318                              uint8* dst_argb,
1319                              const struct YuvConstants* yuvconstants,
1320                              int width);
1321 void I422AlphaToARGBRow_Any_SSSE3(const uint8* y_buf,
1322                                   const uint8* u_buf,
1323                                   const uint8* v_buf,
1324                                   const uint8* a_buf,
1325                                   uint8* dst_argb,
1326                                   const struct YuvConstants* yuvconstants,
1327                                   int width);
1328 void I422AlphaToARGBRow_Any_AVX2(const uint8* y_buf,
1329                                  const uint8* u_buf,
1330                                  const uint8* v_buf,
1331                                  const uint8* a_buf,
1332                                  uint8* dst_argb,
1333                                  const struct YuvConstants* yuvconstants,
1334                                  int width);
1335 void I411ToARGBRow_Any_SSSE3(const uint8* src_y,
1336                              const uint8* src_u,
1337                              const uint8* src_v,
1338                              uint8* dst_argb,
1339                              const struct YuvConstants* yuvconstants,
1340                              int width);
1341 void I411ToARGBRow_Any_AVX2(const uint8* src_y,
1342                             const uint8* src_u,
1343                             const uint8* src_v,
1344                             uint8* dst_argb,
1345                             const struct YuvConstants* yuvconstants,
1346                             int width);
1347 void NV12ToARGBRow_Any_SSSE3(const uint8* src_y,
1348                              const uint8* src_uv,
1349                              uint8* dst_argb,
1350                              const struct YuvConstants* yuvconstants,
1351                              int width);
1352 void NV12ToARGBRow_Any_AVX2(const uint8* src_y,
1353                             const uint8* src_uv,
1354                             uint8* dst_argb,
1355                             const struct YuvConstants* yuvconstants,
1356                             int width);
1357 void NV21ToARGBRow_Any_SSSE3(const uint8* src_y,
1358                              const uint8* src_vu,
1359                              uint8* dst_argb,
1360                              const struct YuvConstants* yuvconstants,
1361                              int width);
1362 void NV21ToARGBRow_Any_AVX2(const uint8* src_y,
1363                             const uint8* src_vu,
1364                             uint8* dst_argb,
1365                             const struct YuvConstants* yuvconstants,
1366                             int width);
1367 void NV12ToRGB565Row_Any_SSSE3(const uint8* src_y,
1368                                const uint8* src_uv,
1369                                uint8* dst_argb,
1370                                const struct YuvConstants* yuvconstants,
1371                                int width);
1372 void NV12ToRGB565Row_Any_AVX2(const uint8* src_y,
1373                               const uint8* src_uv,
1374                               uint8* dst_argb,
1375                               const struct YuvConstants* yuvconstants,
1376                               int width);
1377 void YUY2ToARGBRow_Any_SSSE3(const uint8* src_yuy2,
1378                              uint8* dst_argb,
1379                              const struct YuvConstants* yuvconstants,
1380                              int width);
1381 void UYVYToARGBRow_Any_SSSE3(const uint8* src_uyvy,
1382                              uint8* dst_argb,
1383                              const struct YuvConstants* yuvconstants,
1384                              int width);
1385 void YUY2ToARGBRow_Any_AVX2(const uint8* src_yuy2,
1386                             uint8* dst_argb,
1387                             const struct YuvConstants* yuvconstants,
1388                             int width);
1389 void UYVYToARGBRow_Any_AVX2(const uint8* src_uyvy,
1390                             uint8* dst_argb,
1391                             const struct YuvConstants* yuvconstants,
1392                             int width);
1393 void I422ToRGBARow_Any_SSSE3(const uint8* src_y,
1394                              const uint8* src_u,
1395                              const uint8* src_v,
1396                              uint8* dst_rgba,
1397                              const struct YuvConstants* yuvconstants,
1398                              int width);
1399 void I422ToARGB4444Row_Any_SSSE3(const uint8* src_y,
1400                                  const uint8* src_u,
1401                                  const uint8* src_v,
1402                                  uint8* dst_rgba,
1403                                  const struct YuvConstants* yuvconstants,
1404                                  int width);
1405 void I422ToARGB4444Row_Any_AVX2(const uint8* src_y,
1406                                 const uint8* src_u,
1407                                 const uint8* src_v,
1408                                 uint8* dst_rgba,
1409                                 const struct YuvConstants* yuvconstants,
1410                                 int width);
1411 void I422ToARGB1555Row_Any_SSSE3(const uint8* src_y,
1412                                  const uint8* src_u,
1413                                  const uint8* src_v,
1414                                  uint8* dst_rgba,
1415                                  const struct YuvConstants* yuvconstants,
1416                                  int width);
1417 void I422ToARGB1555Row_Any_AVX2(const uint8* src_y,
1418                                 const uint8* src_u,
1419                                 const uint8* src_v,
1420                                 uint8* dst_rgba,
1421                                 const struct YuvConstants* yuvconstants,
1422                                 int width);
1423 void I422ToRGB565Row_Any_SSSE3(const uint8* src_y,
1424                                const uint8* src_u,
1425                                const uint8* src_v,
1426                                uint8* dst_rgba,
1427                                const struct YuvConstants* yuvconstants,
1428                                int width);
1429 void I422ToRGB565Row_Any_AVX2(const uint8* src_y,
1430                               const uint8* src_u,
1431                               const uint8* src_v,
1432                               uint8* dst_rgba,
1433                               const struct YuvConstants* yuvconstants,
1434                               int width);
1435 void I422ToRGB24Row_Any_SSSE3(const uint8* src_y,
1436                               const uint8* src_u,
1437                               const uint8* src_v,
1438                               uint8* dst_argb,
1439                               const struct YuvConstants* yuvconstants,
1440                               int width);
1441 void I422ToRGB24Row_Any_AVX2(const uint8* src_y,
1442                              const uint8* src_u,
1443                              const uint8* src_v,
1444                              uint8* dst_argb,
1445                              const struct YuvConstants* yuvconstants,
1446                              int width);
1447 
1448 void I400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int width);
1449 void I400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int width);
1450 void I400ToARGBRow_AVX2(const uint8* src_y, uint8* dst_argb, int width);
1451 void I400ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width);
1452 void I400ToARGBRow_Any_SSE2(const uint8* src_y, uint8* dst_argb, int width);
1453 void I400ToARGBRow_Any_AVX2(const uint8* src_y, uint8* dst_argb, int width);
1454 void I400ToARGBRow_Any_NEON(const uint8* src_y, uint8* dst_argb, int width);
1455 
1456 // ARGB preattenuated alpha blend.
1457 void ARGBBlendRow_SSSE3(const uint8* src_argb, const uint8* src_argb1,
1458                         uint8* dst_argb, int width);
1459 void ARGBBlendRow_NEON(const uint8* src_argb, const uint8* src_argb1,
1460                        uint8* dst_argb, int width);
1461 void ARGBBlendRow_C(const uint8* src_argb, const uint8* src_argb1,
1462                     uint8* dst_argb, int width);
1463 
1464 // Unattenuated planar alpha blend.
1465 void BlendPlaneRow_SSSE3(const uint8* src0, const uint8* src1,
1466                          const uint8* alpha, uint8* dst, int width);
1467 void BlendPlaneRow_Any_SSSE3(const uint8* src0, const uint8* src1,
1468                              const uint8* alpha, uint8* dst, int width);
1469 void BlendPlaneRow_AVX2(const uint8* src0, const uint8* src1,
1470                         const uint8* alpha, uint8* dst, int width);
1471 void BlendPlaneRow_Any_AVX2(const uint8* src0, const uint8* src1,
1472                             const uint8* alpha, uint8* dst, int width);
1473 void BlendPlaneRow_C(const uint8* src0, const uint8* src1,
1474                      const uint8* alpha, uint8* dst, int width);
1475 
1476 // ARGB multiply images. Same API as Blend, but these require
1477 // pointer and width alignment for SSE2.
1478 void ARGBMultiplyRow_C(const uint8* src_argb, const uint8* src_argb1,
1479                        uint8* dst_argb, int width);
1480 void ARGBMultiplyRow_SSE2(const uint8* src_argb, const uint8* src_argb1,
1481                           uint8* dst_argb, int width);
1482 void ARGBMultiplyRow_Any_SSE2(const uint8* src_argb, const uint8* src_argb1,
1483                               uint8* dst_argb, int width);
1484 void ARGBMultiplyRow_AVX2(const uint8* src_argb, const uint8* src_argb1,
1485                           uint8* dst_argb, int width);
1486 void ARGBMultiplyRow_Any_AVX2(const uint8* src_argb, const uint8* src_argb1,
1487                               uint8* dst_argb, int width);
1488 void ARGBMultiplyRow_NEON(const uint8* src_argb, const uint8* src_argb1,
1489                           uint8* dst_argb, int width);
1490 void ARGBMultiplyRow_Any_NEON(const uint8* src_argb, const uint8* src_argb1,
1491                               uint8* dst_argb, int width);
1492 
1493 // ARGB add images.
1494 void ARGBAddRow_C(const uint8* src_argb, const uint8* src_argb1,
1495                   uint8* dst_argb, int width);
1496 void ARGBAddRow_SSE2(const uint8* src_argb, const uint8* src_argb1,
1497                      uint8* dst_argb, int width);
1498 void ARGBAddRow_Any_SSE2(const uint8* src_argb, const uint8* src_argb1,
1499                          uint8* dst_argb, int width);
1500 void ARGBAddRow_AVX2(const uint8* src_argb, const uint8* src_argb1,
1501                      uint8* dst_argb, int width);
1502 void ARGBAddRow_Any_AVX2(const uint8* src_argb, const uint8* src_argb1,
1503                          uint8* dst_argb, int width);
1504 void ARGBAddRow_NEON(const uint8* src_argb, const uint8* src_argb1,
1505                      uint8* dst_argb, int width);
1506 void ARGBAddRow_Any_NEON(const uint8* src_argb, const uint8* src_argb1,
1507                          uint8* dst_argb, int width);
1508 
1509 // ARGB subtract images. Same API as Blend, but these require
1510 // pointer and width alignment for SSE2.
1511 void ARGBSubtractRow_C(const uint8* src_argb, const uint8* src_argb1,
1512                        uint8* dst_argb, int width);
1513 void ARGBSubtractRow_SSE2(const uint8* src_argb, const uint8* src_argb1,
1514                           uint8* dst_argb, int width);
1515 void ARGBSubtractRow_Any_SSE2(const uint8* src_argb, const uint8* src_argb1,
1516                               uint8* dst_argb, int width);
1517 void ARGBSubtractRow_AVX2(const uint8* src_argb, const uint8* src_argb1,
1518                           uint8* dst_argb, int width);
1519 void ARGBSubtractRow_Any_AVX2(const uint8* src_argb, const uint8* src_argb1,
1520                               uint8* dst_argb, int width);
1521 void ARGBSubtractRow_NEON(const uint8* src_argb, const uint8* src_argb1,
1522                           uint8* dst_argb, int width);
1523 void ARGBSubtractRow_Any_NEON(const uint8* src_argb, const uint8* src_argb1,
1524                               uint8* dst_argb, int width);
1525 
1526 void ARGBToRGB24Row_Any_SSSE3(const uint8* src_argb, uint8* dst_rgb, int width);
1527 void ARGBToRAWRow_Any_SSSE3(const uint8* src_argb, uint8* dst_rgb, int width);
1528 void ARGBToRGB565Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb, int width);
1529 void ARGBToARGB1555Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb,
1530                                 int width);
1531 void ARGBToARGB4444Row_Any_SSE2(const uint8* src_argb, uint8* dst_rgb,
1532                                 int width);
1533 
1534 void ARGBToRGB565DitherRow_Any_SSE2(const uint8* src_argb, uint8* dst_rgb,
1535                                     const uint32 dither4, int width);
1536 void ARGBToRGB565DitherRow_Any_AVX2(const uint8* src_argb, uint8* dst_rgb,
1537                                     const uint32 dither4, int width);
1538 
1539 void ARGBToRGB565Row_Any_AVX2(const uint8* src_argb, uint8* dst_rgb, int width);
1540 void ARGBToARGB1555Row_Any_AVX2(const uint8* src_argb, uint8* dst_rgb,
1541                                 int width);
1542 void ARGBToARGB4444Row_Any_AVX2(const uint8* src_argb, uint8* dst_rgb,
1543                                 int width);
1544 
1545 void ARGBToRGB24Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb, int width);
1546 void ARGBToRAWRow_Any_NEON(const uint8* src_argb, uint8* dst_rgb, int width);
1547 void ARGBToRGB565Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb, int width);
1548 void ARGBToARGB1555Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb,
1549                                 int width);
1550 void ARGBToARGB4444Row_Any_NEON(const uint8* src_argb, uint8* dst_rgb,
1551                                 int width);
1552 void ARGBToRGB565DitherRow_Any_NEON(const uint8* src_argb, uint8* dst_rgb,
1553                                     const uint32 dither4, int width);
1554 
1555 void I444ToARGBRow_Any_NEON(const uint8* src_y,
1556                             const uint8* src_u,
1557                             const uint8* src_v,
1558                             uint8* dst_argb,
1559                             const struct YuvConstants* yuvconstants,
1560                             int width);
1561 void I422ToARGBRow_Any_NEON(const uint8* src_y,
1562                             const uint8* src_u,
1563                             const uint8* src_v,
1564                             uint8* dst_argb,
1565                             const struct YuvConstants* yuvconstants,
1566                             int width);
1567 void I422AlphaToARGBRow_Any_NEON(const uint8* src_y,
1568                                  const uint8* src_u,
1569                                  const uint8* src_v,
1570                                  const uint8* src_a,
1571                                  uint8* dst_argb,
1572                                  const struct YuvConstants* yuvconstants,
1573                                  int width);
1574 void I411ToARGBRow_Any_NEON(const uint8* src_y,
1575                             const uint8* src_u,
1576                             const uint8* src_v,
1577                             uint8* dst_argb,
1578                             const struct YuvConstants* yuvconstants,
1579                             int width);
1580 void I422ToRGBARow_Any_NEON(const uint8* src_y,
1581                             const uint8* src_u,
1582                             const uint8* src_v,
1583                             uint8* dst_argb,
1584                             const struct YuvConstants* yuvconstants,
1585                             int width);
1586 void I422ToRGB24Row_Any_NEON(const uint8* src_y,
1587                              const uint8* src_u,
1588                              const uint8* src_v,
1589                              uint8* dst_argb,
1590                              const struct YuvConstants* yuvconstants,
1591                              int width);
1592 void I422ToARGB4444Row_Any_NEON(const uint8* src_y,
1593                                 const uint8* src_u,
1594                                 const uint8* src_v,
1595                                 uint8* dst_argb,
1596                                 const struct YuvConstants* yuvconstants,
1597                                 int width);
1598 void I422ToARGB1555Row_Any_NEON(const uint8* src_y,
1599                                 const uint8* src_u,
1600                                 const uint8* src_v,
1601                                 uint8* dst_argb,
1602                                 const struct YuvConstants* yuvconstants,
1603                                 int width);
1604 void I422ToRGB565Row_Any_NEON(const uint8* src_y,
1605                               const uint8* src_u,
1606                               const uint8* src_v,
1607                               uint8* dst_argb,
1608                               const struct YuvConstants* yuvconstants,
1609                               int width);
1610 void NV12ToARGBRow_Any_NEON(const uint8* src_y,
1611                             const uint8* src_uv,
1612                             uint8* dst_argb,
1613                             const struct YuvConstants* yuvconstants,
1614                             int width);
1615 void NV21ToARGBRow_Any_NEON(const uint8* src_y,
1616                             const uint8* src_vu,
1617                             uint8* dst_argb,
1618                             const struct YuvConstants* yuvconstants,
1619                             int width);
1620 void NV12ToRGB565Row_Any_NEON(const uint8* src_y,
1621                               const uint8* src_uv,
1622                               uint8* dst_argb,
1623                               const struct YuvConstants* yuvconstants,
1624                               int width);
1625 void YUY2ToARGBRow_Any_NEON(const uint8* src_yuy2,
1626                             uint8* dst_argb,
1627                             const struct YuvConstants* yuvconstants,
1628                             int width);
1629 void UYVYToARGBRow_Any_NEON(const uint8* src_uyvy,
1630                             uint8* dst_argb,
1631                             const struct YuvConstants* yuvconstants,
1632                             int width);
1633 void I422ToARGBRow_DSPR2(const uint8* src_y,
1634                          const uint8* src_u,
1635                          const uint8* src_v,
1636                          uint8* dst_argb,
1637                          const struct YuvConstants* yuvconstants,
1638                          int width);
1639 void I422ToARGBRow_DSPR2(const uint8* src_y,
1640                          const uint8* src_u,
1641                          const uint8* src_v,
1642                          uint8* dst_argb,
1643                          const struct YuvConstants* yuvconstants,
1644                          int width);
1645 
1646 void YUY2ToYRow_AVX2(const uint8* src_yuy2, uint8* dst_y, int width);
1647 void YUY2ToUVRow_AVX2(const uint8* src_yuy2, int stride_yuy2,
1648                       uint8* dst_u, uint8* dst_v, int width);
1649 void YUY2ToUV422Row_AVX2(const uint8* src_yuy2,
1650                          uint8* dst_u, uint8* dst_v, int width);
1651 void YUY2ToYRow_SSE2(const uint8* src_yuy2, uint8* dst_y, int width);
1652 void YUY2ToUVRow_SSE2(const uint8* src_yuy2, int stride_yuy2,
1653                       uint8* dst_u, uint8* dst_v, int width);
1654 void YUY2ToUV422Row_SSE2(const uint8* src_yuy2,
1655                          uint8* dst_u, uint8* dst_v, int width);
1656 void YUY2ToYRow_NEON(const uint8* src_yuy2, uint8* dst_y, int width);
1657 void YUY2ToUVRow_NEON(const uint8* src_yuy2, int stride_yuy2,
1658                       uint8* dst_u, uint8* dst_v, int width);
1659 void YUY2ToUV422Row_NEON(const uint8* src_yuy2,
1660                          uint8* dst_u, uint8* dst_v, int width);
1661 void YUY2ToYRow_C(const uint8* src_yuy2, uint8* dst_y, int width);
1662 void YUY2ToUVRow_C(const uint8* src_yuy2, int stride_yuy2,
1663                    uint8* dst_u, uint8* dst_v, int width);
1664 void YUY2ToUV422Row_C(const uint8* src_yuy2,
1665                       uint8* dst_u, uint8* dst_v, int width);
1666 void YUY2ToYRow_Any_AVX2(const uint8* src_yuy2, uint8* dst_y, int width);
1667 void YUY2ToUVRow_Any_AVX2(const uint8* src_yuy2, int stride_yuy2,
1668                           uint8* dst_u, uint8* dst_v, int width);
1669 void YUY2ToUV422Row_Any_AVX2(const uint8* src_yuy2,
1670                              uint8* dst_u, uint8* dst_v, int width);
1671 void YUY2ToYRow_Any_SSE2(const uint8* src_yuy2, uint8* dst_y, int width);
1672 void YUY2ToUVRow_Any_SSE2(const uint8* src_yuy2, int stride_yuy2,
1673                           uint8* dst_u, uint8* dst_v, int width);
1674 void YUY2ToUV422Row_Any_SSE2(const uint8* src_yuy2,
1675                              uint8* dst_u, uint8* dst_v, int width);
1676 void YUY2ToYRow_Any_NEON(const uint8* src_yuy2, uint8* dst_y, int width);
1677 void YUY2ToUVRow_Any_NEON(const uint8* src_yuy2, int stride_yuy2,
1678                           uint8* dst_u, uint8* dst_v, int width);
1679 void YUY2ToUV422Row_Any_NEON(const uint8* src_yuy2,
1680                              uint8* dst_u, uint8* dst_v, int width);
1681 void UYVYToYRow_AVX2(const uint8* src_uyvy, uint8* dst_y, int width);
1682 void UYVYToUVRow_AVX2(const uint8* src_uyvy, int stride_uyvy,
1683                       uint8* dst_u, uint8* dst_v, int width);
1684 void UYVYToUV422Row_AVX2(const uint8* src_uyvy,
1685                          uint8* dst_u, uint8* dst_v, int width);
1686 void UYVYToYRow_SSE2(const uint8* src_uyvy, uint8* dst_y, int width);
1687 void UYVYToUVRow_SSE2(const uint8* src_uyvy, int stride_uyvy,
1688                       uint8* dst_u, uint8* dst_v, int width);
1689 void UYVYToUV422Row_SSE2(const uint8* src_uyvy,
1690                          uint8* dst_u, uint8* dst_v, int width);
1691 void UYVYToYRow_AVX2(const uint8* src_uyvy, uint8* dst_y, int width);
1692 void UYVYToUVRow_AVX2(const uint8* src_uyvy, int stride_uyvy,
1693                       uint8* dst_u, uint8* dst_v, int width);
1694 void UYVYToUV422Row_AVX2(const uint8* src_uyvy,
1695                          uint8* dst_u, uint8* dst_v, int width);
1696 void UYVYToYRow_NEON(const uint8* src_uyvy, uint8* dst_y, int width);
1697 void UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy,
1698                       uint8* dst_u, uint8* dst_v, int width);
1699 void UYVYToUV422Row_NEON(const uint8* src_uyvy,
1700                          uint8* dst_u, uint8* dst_v, int width);
1701 
1702 void UYVYToYRow_C(const uint8* src_uyvy, uint8* dst_y, int width);
1703 void UYVYToUVRow_C(const uint8* src_uyvy, int stride_uyvy,
1704                    uint8* dst_u, uint8* dst_v, int width);
1705 void UYVYToUV422Row_C(const uint8* src_uyvy,
1706                       uint8* dst_u, uint8* dst_v, int width);
1707 void UYVYToYRow_Any_AVX2(const uint8* src_uyvy, uint8* dst_y, int width);
1708 void UYVYToUVRow_Any_AVX2(const uint8* src_uyvy, int stride_uyvy,
1709                           uint8* dst_u, uint8* dst_v, int width);
1710 void UYVYToUV422Row_Any_AVX2(const uint8* src_uyvy,
1711                              uint8* dst_u, uint8* dst_v, int width);
1712 void UYVYToYRow_Any_SSE2(const uint8* src_uyvy, uint8* dst_y, int width);
1713 void UYVYToUVRow_Any_SSE2(const uint8* src_uyvy, int stride_uyvy,
1714                           uint8* dst_u, uint8* dst_v, int width);
1715 void UYVYToUV422Row_Any_SSE2(const uint8* src_uyvy,
1716                              uint8* dst_u, uint8* dst_v, int width);
1717 void UYVYToYRow_Any_NEON(const uint8* src_uyvy, uint8* dst_y, int width);
1718 void UYVYToUVRow_Any_NEON(const uint8* src_uyvy, int stride_uyvy,
1719                           uint8* dst_u, uint8* dst_v, int width);
1720 void UYVYToUV422Row_Any_NEON(const uint8* src_uyvy,
1721                              uint8* dst_u, uint8* dst_v, int width);
1722 
1723 void I422ToYUY2Row_C(const uint8* src_y,
1724                      const uint8* src_u,
1725                      const uint8* src_v,
1726                      uint8* dst_yuy2, int width);
1727 void I422ToUYVYRow_C(const uint8* src_y,
1728                      const uint8* src_u,
1729                      const uint8* src_v,
1730                      uint8* dst_uyvy, int width);
1731 void I422ToYUY2Row_SSE2(const uint8* src_y,
1732                         const uint8* src_u,
1733                         const uint8* src_v,
1734                         uint8* dst_yuy2, int width);
1735 void I422ToUYVYRow_SSE2(const uint8* src_y,
1736                         const uint8* src_u,
1737                         const uint8* src_v,
1738                         uint8* dst_uyvy, int width);
1739 void I422ToYUY2Row_Any_SSE2(const uint8* src_y,
1740                             const uint8* src_u,
1741                             const uint8* src_v,
1742                             uint8* dst_yuy2, int width);
1743 void I422ToUYVYRow_Any_SSE2(const uint8* src_y,
1744                             const uint8* src_u,
1745                             const uint8* src_v,
1746                             uint8* dst_uyvy, int width);
1747 void I422ToYUY2Row_NEON(const uint8* src_y,
1748                         const uint8* src_u,
1749                         const uint8* src_v,
1750                         uint8* dst_yuy2, int width);
1751 void I422ToUYVYRow_NEON(const uint8* src_y,
1752                         const uint8* src_u,
1753                         const uint8* src_v,
1754                         uint8* dst_uyvy, int width);
1755 void I422ToYUY2Row_Any_NEON(const uint8* src_y,
1756                             const uint8* src_u,
1757                             const uint8* src_v,
1758                             uint8* dst_yuy2, int width);
1759 void I422ToUYVYRow_Any_NEON(const uint8* src_y,
1760                             const uint8* src_u,
1761                             const uint8* src_v,
1762                             uint8* dst_uyvy, int width);
1763 
1764 // Effects related row functions.
1765 void ARGBAttenuateRow_C(const uint8* src_argb, uint8* dst_argb, int width);
1766 void ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width);
1767 void ARGBAttenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb, int width);
1768 void ARGBAttenuateRow_NEON(const uint8* src_argb, uint8* dst_argb, int width);
1769 void ARGBAttenuateRow_Any_SSE2(const uint8* src_argb, uint8* dst_argb,
1770                                int width);
1771 void ARGBAttenuateRow_Any_SSSE3(const uint8* src_argb, uint8* dst_argb,
1772                                 int width);
1773 void ARGBAttenuateRow_Any_AVX2(const uint8* src_argb, uint8* dst_argb,
1774                                int width);
1775 void ARGBAttenuateRow_Any_NEON(const uint8* src_argb, uint8* dst_argb,
1776                                int width);
1777 
1778 // Inverse table for unattenuate, shared by C and SSE2.
1779 extern const uint32 fixed_invtbl8[256];
1780 void ARGBUnattenuateRow_C(const uint8* src_argb, uint8* dst_argb, int width);
1781 void ARGBUnattenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width);
1782 void ARGBUnattenuateRow_AVX2(const uint8* src_argb, uint8* dst_argb, int width);
1783 void ARGBUnattenuateRow_Any_SSE2(const uint8* src_argb, uint8* dst_argb,
1784                                  int width);
1785 void ARGBUnattenuateRow_Any_AVX2(const uint8* src_argb, uint8* dst_argb,
1786                                  int width);
1787 
1788 void ARGBGrayRow_C(const uint8* src_argb, uint8* dst_argb, int width);
1789 void ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width);
1790 void ARGBGrayRow_NEON(const uint8* src_argb, uint8* dst_argb, int width);
1791 
1792 void ARGBSepiaRow_C(uint8* dst_argb, int width);
1793 void ARGBSepiaRow_SSSE3(uint8* dst_argb, int width);
1794 void ARGBSepiaRow_NEON(uint8* dst_argb, int width);
1795 
1796 void ARGBColorMatrixRow_C(const uint8* src_argb, uint8* dst_argb,
1797                           const int8* matrix_argb, int width);
1798 void ARGBColorMatrixRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
1799                               const int8* matrix_argb, int width);
1800 void ARGBColorMatrixRow_NEON(const uint8* src_argb, uint8* dst_argb,
1801                              const int8* matrix_argb, int width);
1802 
1803 void ARGBColorTableRow_C(uint8* dst_argb, const uint8* table_argb, int width);
1804 void ARGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb, int width);
1805 
1806 void RGBColorTableRow_C(uint8* dst_argb, const uint8* table_argb, int width);
1807 void RGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb, int width);
1808 
1809 void ARGBQuantizeRow_C(uint8* dst_argb, int scale, int interval_size,
1810                        int interval_offset, int width);
1811 void ARGBQuantizeRow_SSE2(uint8* dst_argb, int scale, int interval_size,
1812                           int interval_offset, int width);
1813 void ARGBQuantizeRow_NEON(uint8* dst_argb, int scale, int interval_size,
1814                           int interval_offset, int width);
1815 
1816 void ARGBShadeRow_C(const uint8* src_argb, uint8* dst_argb, int width,
1817                     uint32 value);
1818 void ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width,
1819                        uint32 value);
1820 void ARGBShadeRow_NEON(const uint8* src_argb, uint8* dst_argb, int width,
1821                        uint32 value);
1822 
1823 // Used for blur.
1824 void CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft,
1825                                     int width, int area, uint8* dst, int count);
1826 void ComputeCumulativeSumRow_SSE2(const uint8* row, int32* cumsum,
1827                                   const int32* previous_cumsum, int width);
1828 
1829 void CumulativeSumToAverageRow_C(const int32* topleft, const int32* botleft,
1830                                  int width, int area, uint8* dst, int count);
1831 void ComputeCumulativeSumRow_C(const uint8* row, int32* cumsum,
1832                                const int32* previous_cumsum, int width);
1833 
1834 LIBYUV_API
1835 void ARGBAffineRow_C(const uint8* src_argb, int src_argb_stride,
1836                      uint8* dst_argb, const float* uv_dudv, int width);
1837 LIBYUV_API
1838 void ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride,
1839                         uint8* dst_argb, const float* uv_dudv, int width);
1840 
1841 // Used for I420Scale, ARGBScale, and ARGBInterpolate.
1842 void InterpolateRow_C(uint8* dst_ptr, const uint8* src_ptr,
1843                       ptrdiff_t src_stride_ptr,
1844                       int width, int source_y_fraction);
1845 void InterpolateRow_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
1846                           ptrdiff_t src_stride_ptr, int width,
1847                           int source_y_fraction);
1848 void InterpolateRow_AVX2(uint8* dst_ptr, const uint8* src_ptr,
1849                          ptrdiff_t src_stride_ptr, int width,
1850                          int source_y_fraction);
1851 void InterpolateRow_NEON(uint8* dst_ptr, const uint8* src_ptr,
1852                          ptrdiff_t src_stride_ptr, int width,
1853                          int source_y_fraction);
1854 void InterpolateRow_DSPR2(uint8* dst_ptr, const uint8* src_ptr,
1855                           ptrdiff_t src_stride_ptr, int width,
1856                           int source_y_fraction);
1857 void InterpolateRow_Any_NEON(uint8* dst_ptr, const uint8* src_ptr,
1858                              ptrdiff_t src_stride_ptr, int width,
1859                              int source_y_fraction);
1860 void InterpolateRow_Any_SSSE3(uint8* dst_ptr, const uint8* src_ptr,
1861                               ptrdiff_t src_stride_ptr, int width,
1862                               int source_y_fraction);
1863 void InterpolateRow_Any_AVX2(uint8* dst_ptr, const uint8* src_ptr,
1864                              ptrdiff_t src_stride_ptr, int width,
1865                              int source_y_fraction);
1866 void InterpolateRow_Any_DSPR2(uint8* dst_ptr, const uint8* src_ptr,
1867                               ptrdiff_t src_stride_ptr, int width,
1868                               int source_y_fraction);
1869 
1870 void InterpolateRow_16_C(uint16* dst_ptr, const uint16* src_ptr,
1871                          ptrdiff_t src_stride_ptr,
1872                          int width, int source_y_fraction);
1873 
1874 // Sobel images.
1875 void SobelXRow_C(const uint8* src_y0, const uint8* src_y1, const uint8* src_y2,
1876                  uint8* dst_sobelx, int width);
1877 void SobelXRow_SSE2(const uint8* src_y0, const uint8* src_y1,
1878                     const uint8* src_y2, uint8* dst_sobelx, int width);
1879 void SobelXRow_NEON(const uint8* src_y0, const uint8* src_y1,
1880                     const uint8* src_y2, uint8* dst_sobelx, int width);
1881 void SobelYRow_C(const uint8* src_y0, const uint8* src_y1,
1882                  uint8* dst_sobely, int width);
1883 void SobelYRow_SSE2(const uint8* src_y0, const uint8* src_y1,
1884                     uint8* dst_sobely, int width);
1885 void SobelYRow_NEON(const uint8* src_y0, const uint8* src_y1,
1886                     uint8* dst_sobely, int width);
1887 void SobelRow_C(const uint8* src_sobelx, const uint8* src_sobely,
1888                 uint8* dst_argb, int width);
1889 void SobelRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
1890                    uint8* dst_argb, int width);
1891 void SobelRow_NEON(const uint8* src_sobelx, const uint8* src_sobely,
1892                    uint8* dst_argb, int width);
1893 void SobelToPlaneRow_C(const uint8* src_sobelx, const uint8* src_sobely,
1894                        uint8* dst_y, int width);
1895 void SobelToPlaneRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
1896                           uint8* dst_y, int width);
1897 void SobelToPlaneRow_NEON(const uint8* src_sobelx, const uint8* src_sobely,
1898                           uint8* dst_y, int width);
1899 void SobelXYRow_C(const uint8* src_sobelx, const uint8* src_sobely,
1900                   uint8* dst_argb, int width);
1901 void SobelXYRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
1902                      uint8* dst_argb, int width);
1903 void SobelXYRow_NEON(const uint8* src_sobelx, const uint8* src_sobely,
1904                      uint8* dst_argb, int width);
1905 void SobelRow_Any_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
1906                        uint8* dst_argb, int width);
1907 void SobelRow_Any_NEON(const uint8* src_sobelx, const uint8* src_sobely,
1908                        uint8* dst_argb, int width);
1909 void SobelToPlaneRow_Any_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
1910                               uint8* dst_y, int width);
1911 void SobelToPlaneRow_Any_NEON(const uint8* src_sobelx, const uint8* src_sobely,
1912                               uint8* dst_y, int width);
1913 void SobelXYRow_Any_SSE2(const uint8* src_sobelx, const uint8* src_sobely,
1914                          uint8* dst_argb, int width);
1915 void SobelXYRow_Any_NEON(const uint8* src_sobelx, const uint8* src_sobely,
1916                          uint8* dst_argb, int width);
1917 
1918 void ARGBPolynomialRow_C(const uint8* src_argb,
1919                          uint8* dst_argb, const float* poly,
1920                          int width);
1921 void ARGBPolynomialRow_SSE2(const uint8* src_argb,
1922                             uint8* dst_argb, const float* poly,
1923                             int width);
1924 void ARGBPolynomialRow_AVX2(const uint8* src_argb,
1925                             uint8* dst_argb, const float* poly,
1926                             int width);
1927 
1928 void ARGBLumaColorTableRow_C(const uint8* src_argb, uint8* dst_argb, int width,
1929                              const uint8* luma, uint32 lumacoeff);
1930 void ARGBLumaColorTableRow_SSSE3(const uint8* src_argb, uint8* dst_argb,
1931                                  int width,
1932                                  const uint8* luma, uint32 lumacoeff);
1933 
1934 #ifdef __cplusplus
1935 }  // extern "C"
1936 }  // namespace libyuv
1937 #endif
1938 
1939 #endif  // INCLUDE_LIBYUV_ROW_H_  NOLINT
1940