blob: 43d76d4d2cf30fe65d1723b0d67b7bc1f82cf353 [file] [log] [blame]
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +00001/*
2 * Copyright 2012 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#include "libyuv/row.h"
12
13#include <string.h> // For memcpy
14
15#include "libyuv/basic_types.h"
16
17#ifdef __cplusplus
18namespace libyuv {
19extern "C" {
20#endif
21
fbarchard@google.com522d7572012-11-09 23:14:57 +000022// TODO(fbarchard): Consider 'any' functions handling any quantity of pixels.
23// TODO(fbarchard): Consider 'any' functions handling odd alignment.
24
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000025// YUV to RGB does multiple of 8 with SIMD and remainder with C.
26#define YANY(NAMEANY, I420TORGB_SIMD, I420TORGB_C, UV_SHIFT, BPP, MASK) \
27 void NAMEANY(const uint8* y_buf, \
28 const uint8* u_buf, \
29 const uint8* v_buf, \
30 uint8* rgb_buf, \
31 int width) { \
32 int n = width & ~MASK; \
33 I420TORGB_SIMD(y_buf, u_buf, v_buf, rgb_buf, n); \
34 I420TORGB_C(y_buf + n, \
35 u_buf + (n >> UV_SHIFT), \
36 v_buf + (n >> UV_SHIFT), \
37 rgb_buf + n * BPP, width & MASK); \
38 }
39
40#ifdef HAS_I422TOARGBROW_SSSE3
41YANY(I444ToARGBRow_Any_SSSE3, I444ToARGBRow_Unaligned_SSSE3, I444ToARGBRow_C,
42 0, 4, 7)
43YANY(I422ToARGBRow_Any_SSSE3, I422ToARGBRow_Unaligned_SSSE3, I422ToARGBRow_C,
44 1, 4, 7)
45YANY(I411ToARGBRow_Any_SSSE3, I411ToARGBRow_Unaligned_SSSE3, I411ToARGBRow_C,
46 2, 4, 7)
47YANY(I422ToBGRARow_Any_SSSE3, I422ToBGRARow_Unaligned_SSSE3, I422ToBGRARow_C,
48 1, 4, 7)
49YANY(I422ToABGRRow_Any_SSSE3, I422ToABGRRow_Unaligned_SSSE3, I422ToABGRRow_C,
50 1, 4, 7)
51YANY(I422ToRGBARow_Any_SSSE3, I422ToRGBARow_Unaligned_SSSE3, I422ToRGBARow_C,
52 1, 4, 7)
fbarchard@google.comaf1aa562012-10-30 21:11:54 +000053// I422ToRGB565Row_SSSE3 is unaligned.
54YANY(I422ToARGB4444Row_Any_SSSE3, I422ToARGB4444Row_SSSE3, I422ToARGB4444Row_C,
55 1, 2, 7)
56YANY(I422ToARGB1555Row_Any_SSSE3, I422ToARGB1555Row_SSSE3, I422ToARGB1555Row_C,
57 1, 2, 7)
58YANY(I422ToRGB565Row_Any_SSSE3, I422ToRGB565Row_SSSE3, I422ToRGB565Row_C,
59 1, 2, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000060// I422ToRGB24Row_SSSE3 is unaligned.
61YANY(I422ToRGB24Row_Any_SSSE3, I422ToRGB24Row_SSSE3, I422ToRGB24Row_C, 1, 3, 7)
62YANY(I422ToRAWRow_Any_SSSE3, I422ToRAWRow_SSSE3, I422ToRAWRow_C, 1, 3, 7)
63YANY(I422ToYUY2Row_Any_SSE2, I422ToYUY2Row_SSE2, I422ToYUY2Row_C, 1, 2, 15)
64YANY(I422ToUYVYRow_Any_SSE2, I422ToUYVYRow_SSE2, I422ToUYVYRow_C, 1, 2, 15)
65#endif // HAS_I422TOARGBROW_SSSE3
66#ifdef HAS_I422TOARGBROW_NEON
fbarchard@google.comb883ce62012-11-02 21:37:41 +000067YANY(I444ToARGBRow_Any_NEON, I444ToARGBRow_NEON, I444ToARGBRow_C, 0, 4, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000068YANY(I422ToARGBRow_Any_NEON, I422ToARGBRow_NEON, I422ToARGBRow_C, 1, 4, 7)
fbarchard@google.comb883ce62012-11-02 21:37:41 +000069YANY(I411ToARGBRow_Any_NEON, I411ToARGBRow_NEON, I411ToARGBRow_C, 2, 4, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000070YANY(I422ToBGRARow_Any_NEON, I422ToBGRARow_NEON, I422ToBGRARow_C, 1, 4, 7)
71YANY(I422ToABGRRow_Any_NEON, I422ToABGRRow_NEON, I422ToABGRRow_C, 1, 4, 7)
72YANY(I422ToRGBARow_Any_NEON, I422ToRGBARow_NEON, I422ToRGBARow_C, 1, 4, 7)
73YANY(I422ToRGB24Row_Any_NEON, I422ToRGB24Row_NEON, I422ToRGB24Row_C, 1, 3, 7)
74YANY(I422ToRAWRow_Any_NEON, I422ToRAWRow_NEON, I422ToRAWRow_C, 1, 3, 7)
fbarchard@google.comaf1aa562012-10-30 21:11:54 +000075YANY(I422ToARGB4444Row_Any_NEON, I422ToARGB4444Row_NEON, I422ToARGB4444Row_C,
76 1, 2, 7)
77YANY(I422ToARGB1555Row_Any_NEON, I422ToARGB1555Row_NEON, I422ToARGB1555Row_C,
78 1, 2, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000079YANY(I422ToRGB565Row_Any_NEON, I422ToRGB565Row_NEON, I422ToRGB565Row_C, 1, 2, 7)
80YANY(I422ToYUY2Row_Any_NEON, I422ToYUY2Row_NEON, I422ToYUY2Row_C, 1, 2, 15)
81YANY(I422ToUYVYRow_Any_NEON, I422ToUYVYRow_NEON, I422ToUYVYRow_C, 1, 2, 15)
82#endif // HAS_I422TOARGBROW_NEON
83#undef YANY
84
85// Wrappers to handle odd width
86#define NV2NY(NAMEANY, NV12TORGB_SIMD, NV12TORGB_C, UV_SHIFT, BPP) \
87 void NAMEANY(const uint8* y_buf, \
88 const uint8* uv_buf, \
89 uint8* rgb_buf, \
90 int width) { \
91 int n = width & ~7; \
92 NV12TORGB_SIMD(y_buf, uv_buf, rgb_buf, n); \
93 NV12TORGB_C(y_buf + n, \
94 uv_buf + (n >> UV_SHIFT), \
95 rgb_buf + n * BPP, width & 7); \
96 }
97
fbarchard@google.com9f2d4042012-10-31 18:36:28 +000098#ifdef HAS_NV12TOARGBROW_SSSE3
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000099NV2NY(NV12ToARGBRow_Any_SSSE3, NV12ToARGBRow_Unaligned_SSSE3, NV12ToARGBRow_C,
fbarchard@google.com9f2d4042012-10-31 18:36:28 +0000100 0, 4)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000101NV2NY(NV21ToARGBRow_Any_SSSE3, NV21ToARGBRow_Unaligned_SSSE3, NV21ToARGBRow_C,
fbarchard@google.com9f2d4042012-10-31 18:36:28 +0000102 0, 4)
103#endif // HAS_NV12TOARGBROW_SSSE3
104#ifdef HAS_NV12TOARGBROW_NEON
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000105NV2NY(NV12ToARGBRow_Any_NEON, NV12ToARGBRow_NEON, NV12ToARGBRow_C, 0, 4)
106NV2NY(NV21ToARGBRow_Any_NEON, NV21ToARGBRow_NEON, NV21ToARGBRow_C, 0, 4)
fbarchard@google.com9f2d4042012-10-31 18:36:28 +0000107#endif // HAS_NV12TOARGBROW_NEON
108#ifdef HAS_NV12TORGB565ROW_SSSE3
109NV2NY(NV12ToRGB565Row_Any_SSSE3, NV12ToRGB565Row_SSSE3, NV12ToRGB565Row_C,
110 0, 2)
111NV2NY(NV21ToRGB565Row_Any_SSSE3, NV21ToRGB565Row_SSSE3, NV21ToRGB565Row_C,
112 0, 2)
113#endif // HAS_NV12TORGB565ROW_SSSE3
114#ifdef HAS_NV12TORGB565ROW_NEON
115NV2NY(NV12ToRGB565Row_Any_NEON, NV12ToRGB565Row_NEON, NV12ToRGB565Row_C, 0, 2)
116NV2NY(NV21ToRGB565Row_Any_NEON, NV21ToRGB565Row_NEON, NV21ToRGB565Row_C, 0, 2)
117#endif // HAS_NV12TORGB565ROW_NEON
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000118#undef NVANY
119
fbarchard@google.com522d7572012-11-09 23:14:57 +0000120// TODO(fbarchard): RGBANY use last 16 method.
121// ARGB to Bayer does multiple of 4 pixels, SSSE3 aligned src, unaligned dst.
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000122#define RGBANY(NAMEANY, ARGBTORGB_SIMD, ARGBTORGB_C, MASK, SBPP, BPP) \
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000123 void NAMEANY(const uint8* src, \
124 uint8* dst, \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000125 int width) { \
126 int n = width & ~MASK; \
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000127 ARGBTORGB_SIMD(src, dst, n); \
128 ARGBTORGB_C(src + n * SBPP, dst + n * BPP, width & MASK); \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000129 }
130
131#if defined(HAS_ARGBTORGB24ROW_SSSE3)
132RGBANY(ARGBToRGB24Row_Any_SSSE3, ARGBToRGB24Row_SSSE3, ARGBToRGB24Row_C,
133 15, 4, 3)
134RGBANY(ARGBToRAWRow_Any_SSSE3, ARGBToRAWRow_SSSE3, ARGBToRAWRow_C,
135 15, 4, 3)
136RGBANY(ARGBToRGB565Row_Any_SSE2, ARGBToRGB565Row_SSE2, ARGBToRGB565Row_C,
137 3, 4, 2)
138RGBANY(ARGBToARGB1555Row_Any_SSE2, ARGBToARGB1555Row_SSE2, ARGBToARGB1555Row_C,
139 3, 4, 2)
140RGBANY(ARGBToARGB4444Row_Any_SSE2, ARGBToARGB4444Row_SSE2, ARGBToARGB4444Row_C,
141 3, 4, 2)
fbarchard@google.com00b69a22012-11-02 06:03:28 +0000142RGBANY(I400ToARGBRow_Any_SSE2, I400ToARGBRow_Unaligned_SSE2, I400ToARGBRow_C,
143 7, 1, 4)
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000144RGBANY(YToARGBRow_Any_SSE2, YToARGBRow_SSE2, YToARGBRow_C,
145 7, 1, 4)
fbarchard@google.com793e5a02012-11-03 15:12:48 +0000146RGBANY(YUY2ToARGBRow_Any_SSSE3, YUY2ToARGBRow_Unaligned_SSSE3, YUY2ToARGBRow_C,
fbarchard@google.comf1daa3d2012-11-07 08:27:24 +0000147 15, 2, 4)
fbarchard@google.com793e5a02012-11-03 15:12:48 +0000148RGBANY(UYVYToARGBRow_Any_SSSE3, UYVYToARGBRow_Unaligned_SSSE3, UYVYToARGBRow_C,
fbarchard@google.comf1daa3d2012-11-07 08:27:24 +0000149 15, 2, 4)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000150#endif
151#if defined(HAS_ARGBTORGB24ROW_NEON)
152RGBANY(ARGBToRGB24Row_Any_NEON, ARGBToRGB24Row_NEON, ARGBToRGB24Row_C, 7, 4, 3)
153RGBANY(ARGBToRAWRow_Any_NEON, ARGBToRAWRow_NEON, ARGBToRAWRow_C, 7, 4, 3)
154RGBANY(ARGBToRGB565Row_Any_NEON, ARGBToRGB565Row_NEON, ARGBToRGB565Row_C,
155 7, 4, 2)
156RGBANY(ARGBToARGB1555Row_Any_NEON, ARGBToARGB1555Row_NEON, ARGBToARGB1555Row_C,
157 7, 4, 2)
158RGBANY(ARGBToARGB4444Row_Any_NEON, ARGBToARGB4444Row_NEON, ARGBToARGB4444Row_C,
159 7, 4, 2)
fbarchard@google.com00b69a22012-11-02 06:03:28 +0000160RGBANY(I400ToARGBRow_Any_NEON, I400ToARGBRow_NEON, I400ToARGBRow_C,
161 7, 1, 4)
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000162RGBANY(YToARGBRow_Any_NEON, YToARGBRow_NEON, YToARGBRow_C,
163 7, 1, 4)
fbarchard@google.com793e5a02012-11-03 15:12:48 +0000164RGBANY(YUY2ToARGBRow_Any_NEON, YUY2ToARGBRow_NEON, YUY2ToARGBRow_C,
165 7, 2, 4)
166RGBANY(UYVYToARGBRow_Any_NEON, UYVYToARGBRow_NEON, UYVYToARGBRow_C,
167 7, 2, 4)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000168#endif
169#undef RGBANY
170
fbarchard@google.com522d7572012-11-09 23:14:57 +0000171// ARGB to Bayer does multiple of 4 pixels, SSSE3 aligned src, unaligned dst.
172#define BAYERANY(NAMEANY, ARGBTORGB_SIMD, ARGBTORGB_C, MASK, SBPP, BPP) \
173 void NAMEANY(const uint8* src, \
174 uint8* dst, uint32 selector, \
175 int width) { \
176 int n = width & ~MASK; \
177 ARGBTORGB_SIMD(src, dst, selector, n); \
178 ARGBTORGB_C(src + n * SBPP, dst + n * BPP, selector, width & MASK); \
179 }
180
181#if defined(HAS_ARGBTOBAYERROW_SSSE3)
182BAYERANY(ARGBToBayerRow_Any_SSSE3, ARGBToBayerRow_SSSE3, ARGBToBayerRow_C,
183 3, 4, 1)
184#endif
185#if defined(HAS_ARGBTOBAYERROW_NEON)
186BAYERANY(ARGBToBayerRow_Any_NEON, ARGBToBayerRow_NEON, ARGBToBayerRow_C,
187 3, 4, 1)
188#endif
189#undef BAYERANY
190
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000191// RGB/YUV to Y does multiple of 16 with SIMD and last 16 with SIMD.
fbarchard@google.com793e5a02012-11-03 15:12:48 +0000192// TODO(fbarchard): Use last 16 method for all unsubsampled conversions.
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000193#define YANY(NAMEANY, ARGBTOY_SIMD, SBPP, BPP, NUM) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000194 void NAMEANY(const uint8* src_argb, uint8* dst_y, int width) { \
195 ARGBTOY_SIMD(src_argb, dst_y, width - NUM); \
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000196 ARGBTOY_SIMD(src_argb + (width - NUM) * SBPP, \
197 dst_y + (width - NUM) * BPP, NUM); \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000198 }
199
200#ifdef HAS_ARGBTOYROW_SSSE3
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000201YANY(ARGBToYRow_Any_SSSE3, ARGBToYRow_Unaligned_SSSE3, 4, 1, 16)
202YANY(BGRAToYRow_Any_SSSE3, BGRAToYRow_Unaligned_SSSE3, 4, 1, 16)
203YANY(ABGRToYRow_Any_SSSE3, ABGRToYRow_Unaligned_SSSE3, 4, 1, 16)
204YANY(RGBAToYRow_Any_SSSE3, RGBAToYRow_Unaligned_SSSE3, 4, 1, 16)
205YANY(YUY2ToYRow_Any_SSE2, YUY2ToYRow_Unaligned_SSE2, 2, 1, 16)
206YANY(UYVYToYRow_Any_SSE2, UYVYToYRow_Unaligned_SSE2, 2, 1, 16)
207YANY(RGB24ToARGBRow_Any_SSSE3, RGB24ToARGBRow_SSSE3, 3, 4, 16)
208YANY(RAWToARGBRow_Any_SSSE3, RAWToARGBRow_SSSE3, 3, 4, 16)
209YANY(RGB565ToARGBRow_Any_SSE2, RGB565ToARGBRow_SSE2, 2, 4, 8)
fbarchard@google.com4b4a32c2012-11-06 01:56:52 +0000210YANY(ARGB1555ToARGBRow_Any_SSE2, ARGB1555ToARGBRow_SSE2, 2, 4, 8)
211YANY(ARGB4444ToARGBRow_Any_SSE2, ARGB4444ToARGBRow_SSE2, 2, 4, 8)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000212#endif
213#ifdef HAS_ARGBTOYROW_NEON
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000214YANY(ARGBToYRow_Any_NEON, ARGBToYRow_NEON, 4, 1, 8)
215YANY(BGRAToYRow_Any_NEON, BGRAToYRow_NEON, 4, 1, 8)
216YANY(ABGRToYRow_Any_NEON, ABGRToYRow_NEON, 4, 1, 8)
217YANY(RGBAToYRow_Any_NEON, RGBAToYRow_NEON, 4, 1, 8)
218YANY(RGB24ToYRow_Any_NEON, RGB24ToYRow_NEON, 3, 1, 8)
219YANY(RAWToYRow_Any_NEON, RAWToYRow_NEON, 3, 1, 8)
220YANY(RGB565ToYRow_Any_NEON, RGB565ToYRow_NEON, 2, 1, 8)
fbarchard@google.com1dee6252012-11-06 02:14:23 +0000221YANY(ARGB1555ToYRow_Any_NEON, ARGB1555ToYRow_NEON, 2, 1, 8)
222YANY(ARGB4444ToYRow_Any_NEON, ARGB4444ToYRow_NEON, 2, 1, 8)
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000223YANY(YUY2ToYRow_Any_NEON, YUY2ToYRow_NEON, 2, 1, 16)
224YANY(UYVYToYRow_Any_NEON, UYVYToYRow_NEON, 2, 1, 16)
225YANY(RGB24ToARGBRow_Any_NEON, RGB24ToARGBRow_NEON, 3, 4, 8)
226YANY(RAWToARGBRow_Any_NEON, RAWToARGBRow_NEON, 3, 4, 8)
227YANY(RGB565ToARGBRow_Any_NEON, RGB565ToARGBRow_NEON, 2, 4, 8)
fbarchard@google.com4b4a32c2012-11-06 01:56:52 +0000228YANY(ARGB1555ToARGBRow_Any_NEON, ARGB1555ToARGBRow_NEON, 2, 4, 8)
229YANY(ARGB4444ToARGBRow_Any_NEON, ARGB4444ToARGBRow_NEON, 2, 4, 8)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000230#endif
231#undef YANY
232
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000233// Attenuate is destructive so last16 method can not be used due to overlap.
234#define YANY(NAMEANY, ARGBTOY_SIMD, ARGBTOY_C, SBPP, BPP, MASK) \
235 void NAMEANY(const uint8* src_argb, uint8* dst_y, int width) { \
236 int n = width & ~MASK; \
237 ARGBTOY_SIMD(src_argb, dst_y, n); \
238 ARGBTOY_C(src_argb + n * SBPP, \
239 dst_y + n * BPP, width & MASK); \
240 }
241
242#ifdef HAS_ARGBATTENUATEROW_SSSE3
243YANY(ARGBAttenuateRow_Any_SSSE3, ARGBAttenuateRow_SSSE3, ARGBAttenuateRow_C,
244 4, 4, 3)
245#endif
246#ifdef HAS_ARGBATTENUATEROW_SSE2
247YANY(ARGBAttenuateRow_Any_SSE2, ARGBAttenuateRow_SSE2, ARGBAttenuateRow_C,
248 4, 4, 3)
249#endif
250#ifdef HAS_ARGBATTENUATEROW_NEON
251YANY(ARGBAttenuateRow_Any_NEON, ARGBAttenuateRow_NEON, ARGBAttenuateRow_C,
252 4, 4, 7)
253#endif
254
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000255// RGB/YUV to UV does multiple of 16 with SIMD and remainder with C.
256#define UVANY(NAMEANY, ANYTOUV_SIMD, ANYTOUV_C, BPP) \
257 void NAMEANY(const uint8* src_argb, int src_stride_argb, \
258 uint8* dst_u, uint8* dst_v, int width) { \
259 int n = width & ~15; \
260 ANYTOUV_SIMD(src_argb, src_stride_argb, dst_u, dst_v, n); \
261 ANYTOUV_C(src_argb + n * BPP, src_stride_argb, \
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000262 dst_u + (n >> 1), \
263 dst_v + (n >> 1), \
264 width & 15); \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000265 }
266
267#ifdef HAS_ARGBTOUVROW_SSSE3
268UVANY(ARGBToUVRow_Any_SSSE3, ARGBToUVRow_Unaligned_SSSE3, ARGBToUVRow_C, 4)
269UVANY(BGRAToUVRow_Any_SSSE3, BGRAToUVRow_Unaligned_SSSE3, BGRAToUVRow_C, 4)
270UVANY(ABGRToUVRow_Any_SSSE3, ABGRToUVRow_Unaligned_SSSE3, ABGRToUVRow_C, 4)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000271UVANY(RGBAToUVRow_Any_SSSE3, RGBAToUVRow_Unaligned_SSSE3, RGBAToUVRow_C, 4)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000272UVANY(YUY2ToUVRow_Any_SSE2, YUY2ToUVRow_Unaligned_SSE2, YUY2ToUVRow_C, 2)
273UVANY(UYVYToUVRow_Any_SSE2, UYVYToUVRow_Unaligned_SSE2, UYVYToUVRow_C, 2)
274#endif
fbarchard@google.comf1daa3d2012-11-07 08:27:24 +0000275#ifdef HAS_ARGBTOUVROW_NEON
276UVANY(ARGBToUVRow_Any_NEON, ARGBToUVRow_NEON, ARGBToUVRow_C, 4)
fbarchard@google.com95730712012-11-12 20:42:48 +0000277UVANY(BGRAToUVRow_Any_NEON, BGRAToUVRow_NEON, BGRAToUVRow_C, 4)
278UVANY(ABGRToUVRow_Any_NEON, ABGRToUVRow_NEON, ABGRToUVRow_C, 4)
279UVANY(RGBAToUVRow_Any_NEON, RGBAToUVRow_NEON, RGBAToUVRow_C, 4)
280UVANY(RGB24ToUVRow_Any_NEON, RGB24ToUVRow_NEON, RGB24ToUVRow_C, 3)
281UVANY(RAWToUVRow_Any_NEON, RAWToUVRow_NEON, RAWToUVRow_C, 3)
fbarchard@google.comf1daa3d2012-11-07 08:27:24 +0000282UVANY(RGB565ToUVRow_Any_NEON, RGB565ToUVRow_NEON, RGB565ToUVRow_C, 2)
fbarchard@google.com522d7572012-11-09 23:14:57 +0000283UVANY(ARGB1555ToUVRow_Any_NEON, ARGB1555ToUVRow_NEON, ARGB1555ToUVRow_C, 2)
284UVANY(ARGB4444ToUVRow_Any_NEON, ARGB4444ToUVRow_NEON, ARGB4444ToUVRow_C, 2)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000285UVANY(YUY2ToUVRow_Any_NEON, YUY2ToUVRow_NEON, YUY2ToUVRow_C, 2)
286UVANY(UYVYToUVRow_Any_NEON, UYVYToUVRow_NEON, UYVYToUVRow_C, 2)
287#endif
288#undef UVANY
289
fbarchard@google.com522d7572012-11-09 23:14:57 +0000290#define UV422ANY(NAMEANY, ANYTOUV_SIMD, ANYTOUV_C, BPP, MASK, SHIFT) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000291 void NAMEANY(const uint8* src_uv, \
292 uint8* dst_u, uint8* dst_v, int width) { \
fbarchard@google.com522d7572012-11-09 23:14:57 +0000293 int n = width & ~MASK; \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000294 ANYTOUV_SIMD(src_uv, dst_u, dst_v, n); \
295 ANYTOUV_C(src_uv + n * BPP, \
fbarchard@google.com522d7572012-11-09 23:14:57 +0000296 dst_u + (n >> SHIFT), \
297 dst_v + (n >> SHIFT), \
298 width & MASK); \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000299 }
300
fbarchard@google.coma9c92422013-01-16 09:48:29 +0000301#ifdef HAS_ARGBTOUV444ROW_SSSE3
302UV422ANY(ARGBToUV444Row_Any_SSSE3, ARGBToUV444Row_Unaligned_SSSE3,
303 ARGBToUV444Row_C, 4, 15, 0)
304#endif
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000305#ifdef HAS_ARGBTOUVROW_SSSE3
306UV422ANY(ARGBToUV422Row_Any_SSSE3, ARGBToUV422Row_Unaligned_SSSE3,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000307 ARGBToUV422Row_C, 4, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000308UV422ANY(YUY2ToUV422Row_Any_SSE2, YUY2ToUV422Row_Unaligned_SSE2,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000309 YUY2ToUV422Row_C, 2, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000310UV422ANY(UYVYToUV422Row_Any_SSE2, UYVYToUV422Row_Unaligned_SSE2,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000311 UYVYToUV422Row_C, 2, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000312#endif
313#ifdef HAS_YUY2TOUV422ROW_NEON
fbarchard@google.com522d7572012-11-09 23:14:57 +0000314UV422ANY(ARGBToUV444Row_Any_NEON, ARGBToUV444Row_NEON,
fbarchard@google.com752cb9e2012-11-14 05:46:56 +0000315 ARGBToUV444Row_C, 4, 7, 0)
fbarchard@google.com522d7572012-11-09 23:14:57 +0000316UV422ANY(ARGBToUV422Row_Any_NEON, ARGBToUV422Row_NEON,
317 ARGBToUV422Row_C, 4, 15, 1)
318UV422ANY(ARGBToUV411Row_Any_NEON, ARGBToUV411Row_NEON,
319 ARGBToUV411Row_C, 4, 31, 2)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000320UV422ANY(YUY2ToUV422Row_Any_NEON, YUY2ToUV422Row_NEON,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000321 YUY2ToUV422Row_C, 2, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000322UV422ANY(UYVYToUV422Row_Any_NEON, UYVYToUV422Row_NEON,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000323 UYVYToUV422Row_C, 2, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000324#endif
325#undef UV422ANY
326
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000327#define SPLITUVROWANY(NAMEANY, ANYTOUV_SIMD, ANYTOUV_C, MASK) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000328 void NAMEANY(const uint8* src_uv, \
329 uint8* dst_u, uint8* dst_v, int width) { \
330 int n = width & ~MASK; \
331 ANYTOUV_SIMD(src_uv, dst_u, dst_v, n); \
332 ANYTOUV_C(src_uv + n * 2, \
333 dst_u + n, \
334 dst_v + n, \
335 width & MASK); \
336 }
337
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000338#ifdef HAS_SPLITUVROW_SSE2
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000339SPLITUVROWANY(SplitUVRow_Any_SSE2, SplitUVRow_Unaligned_SSE2, SplitUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000340#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000341#ifdef HAS_SPLITUVROW_AVX2
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000342SPLITUVROWANY(SplitUVRow_Any_AVX2, SplitUVRow_Unaligned_AVX2, SplitUVRow_C, 31)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000343#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000344#ifdef HAS_SPLITUVROW_NEON
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000345SPLITUVROWANY(SplitUVRow_Any_NEON, SplitUVRow_NEON, SplitUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000346#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000347#ifdef HAS_SPLITUVROW_MIPS_DSPR2
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000348SPLITUVROWANY(SplitUVRow_Any_MIPS_DSPR2, SplitUVRow_Unaligned_MIPS_DSPR2,
fbarchard@google.comcb5262d2012-11-16 01:41:35 +0000349 SplitUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000350#endif
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000351#undef SPLITUVROWANY
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000352
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000353#define MERGEUVROW_ANY(NAMEANY, ANYTOUV_SIMD, ANYTOUV_C, MASK) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000354 void NAMEANY(const uint8* src_u, const uint8* src_v, \
355 uint8* dst_uv, int width) { \
356 int n = width & ~MASK; \
357 ANYTOUV_SIMD(src_u, src_v, dst_uv, n); \
358 ANYTOUV_C(src_u + n, \
359 src_v + n, \
360 dst_uv + n * 2, \
361 width & MASK); \
362 }
363
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000364#ifdef HAS_MERGEUVROW_SSE2
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000365MERGEUVROW_ANY(MergeUVRow_Any_SSE2, MergeUVRow_Unaligned_SSE2, MergeUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000366#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000367#ifdef HAS_MERGEUVROW_AVX2
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000368MERGEUVROW_ANY(MergeUVRow_Any_AVX2, MergeUVRow_Unaligned_AVX2, MergeUVRow_C, 31)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000369#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000370#ifdef HAS_MERGEUVROW_NEON
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000371MERGEUVROW_ANY(MergeUVRow_Any_NEON, MergeUVRow_NEON, MergeUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000372#endif
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000373#undef MERGEUVROW_ANY
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000374
fbarchard@google.com5b0f7e12013-01-21 08:42:59 +0000375#define MATHROW_ANY(NAMEANY, ARGBMATH_SIMD, ARGBMATH_C, MASK) \
fbarchard@google.com8fa76342013-01-18 02:25:04 +0000376 void NAMEANY(const uint8* src_argb0, const uint8* src_argb1, \
377 uint8* dst_argb, int width) { \
fbarchard@google.com8ec60332013-01-17 20:18:08 +0000378 int n = width & ~MASK; \
fbarchard@google.com5b0f7e12013-01-21 08:42:59 +0000379 ARGBMATH_SIMD(src_argb0, src_argb1, dst_argb, n); \
380 ARGBMATH_C(src_argb0 + n * 4, \
fbarchard@google.com8fa76342013-01-18 02:25:04 +0000381 src_argb1 + n * 4, \
fbarchard@google.com8ec60332013-01-17 20:18:08 +0000382 dst_argb + n * 4, \
383 width & MASK); \
384 }
385
386#ifdef HAS_ARGBMULTIPLYROW_SSE2
fbarchard@google.com29aa2142013-01-18 23:43:01 +0000387MATHROW_ANY(ARGBMultiplyRow_Any_SSE2, ARGBMultiplyRow_SSE2, ARGBMultiplyRow_C,
388 3)
fbarchard@google.com8ec60332013-01-17 20:18:08 +0000389#endif
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000390#ifdef HAS_ARGBADDROW_SSE2
391MATHROW_ANY(ARGBAddRow_Any_SSE2, ARGBAddRow_SSE2, ARGBAddRow_C, 3)
392#endif
fbarchard@google.com573a8832013-01-24 23:08:12 +0000393#ifdef HAS_ARGBSUBTRACTROW_SSE2
394MATHROW_ANY(ARGBSubtractRow_Any_SSE2, ARGBSubtractRow_SSE2, ARGBSubtractRow_C,
395 3)
396#endif
fbarchard@google.com5b0f7e12013-01-21 08:42:59 +0000397#ifdef HAS_ARGBMULTIPLYROW_NEON
398MATHROW_ANY(ARGBMultiplyRow_Any_NEON, ARGBMultiplyRow_NEON, ARGBMultiplyRow_C,
399 7)
400#endif
401#ifdef HAS_ARGBADDROW_NEON
402MATHROW_ANY(ARGBAddRow_Any_NEON, ARGBAddRow_NEON, ARGBAddRow_C, 7)
403#endif
fbarchard@google.com573a8832013-01-24 23:08:12 +0000404#ifdef HAS_ARGBSUBTRACTROW_NEON
405MATHROW_ANY(ARGBSubtractRow_Any_NEON, ARGBSubtractRow_NEON, ARGBSubtractRow_C,
406 7)
407#endif
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000408#undef MATHROW_ANY
409
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000410#ifdef __cplusplus
411} // extern "C"
412} // namespace libyuv
413#endif