OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 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 LIBYUV_SOURCE_ROW_H_ | |
12 #define LIBYUV_SOURCE_ROW_H_ | |
13 | |
14 #include "third_party/libyuv/include/libyuv/basic_types.h" | |
15 | |
16 #define kMaxStride (2048 * 4) | |
17 #define IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1))) | |
18 | |
19 #if defined(COVERAGE_ENABLED) || defined(TARGET_IPHONE_SIMULATOR) | |
20 #define YUV_DISABLE_ASM | |
21 #endif | |
22 | |
23 #if defined(__ARM_NEON__) && !defined(YUV_DISABLE_ASM) | |
24 #define HAS_FASTCONVERTYUVTOARGBROW_NEON | |
25 void FastConvertYUVToARGBRow_NEON(const uint8* y_buf, | |
26 const uint8* u_buf, | |
27 const uint8* v_buf, | |
28 uint8* rgb_buf, | |
29 int width); | |
30 #define HAS_FASTCONVERTYUVTOBGRAROW_NEON | |
31 void FastConvertYUVToBGRARow_NEON(const uint8* y_buf, | |
32 const uint8* u_buf, | |
33 const uint8* v_buf, | |
34 uint8* rgb_buf, | |
35 int width); | |
36 #define HAS_FASTCONVERTYUVTOABGRROW_NEON | |
37 void FastConvertYUVToABGRRow_NEON(const uint8* y_buf, | |
38 const uint8* u_buf, | |
39 const uint8* v_buf, | |
40 uint8* rgb_buf, | |
41 int width); | |
42 #endif | |
43 | |
44 // The following are available on all x86 platforms | |
45 #if (defined(_M_IX86) || defined(__x86_64__) || defined(__i386__)) && \ | |
46 !defined(YUV_DISABLE_ASM) | |
47 #define HAS_ABGRTOARGBROW_SSSE3 | |
48 #define HAS_BGRATOARGBROW_SSSE3 | |
49 #define HAS_BG24TOARGBROW_SSSE3 | |
50 #define HAS_RAWTOARGBROW_SSSE3 | |
51 #define HAS_RGB24TOYROW_SSSE3 | |
52 #define HAS_RAWTOYROW_SSSE3 | |
53 #define HAS_RGB24TOUVROW_SSSE3 | |
54 #define HAS_RAWTOUVROW_SSSE3 | |
55 #define HAS_ARGBTOYROW_SSSE3 | |
56 #define HAS_BGRATOYROW_SSSE3 | |
57 #define HAS_ABGRTOYROW_SSSE3 | |
58 #define HAS_ARGBTOUVROW_SSSE3 | |
59 #define HAS_BGRATOUVROW_SSSE3 | |
60 #define HAS_ABGRTOUVROW_SSSE3 | |
61 #define HAS_I400TOARGBROW_SSE2 | |
62 #define HAS_FASTCONVERTYTOARGBROW_SSE2 | |
63 #define HAS_FASTCONVERTYUVTOARGBROW_SSSE3 | |
64 #define HAS_FASTCONVERTYUVTOBGRAROW_SSSE3 | |
65 #define HAS_FASTCONVERTYUVTOABGRROW_SSSE3 | |
66 #define HAS_FASTCONVERTYUV444TOARGBROW_SSSE3 | |
67 #define HAS_REVERSE_ROW_SSSE3 | |
68 #endif | |
69 | |
70 // The following are available on Neon platforms | |
71 #if defined(__ARM_NEON__) && !defined(YUV_DISABLE_ASM) | |
72 #define HAS_REVERSE_ROW_NEON | |
73 #endif | |
74 | |
75 #ifdef __cplusplus | |
76 namespace libyuv { | |
77 extern "C" { | |
78 #endif | |
79 | |
80 #ifdef HAS_ARGBTOYROW_SSSE3 | |
81 void ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); | |
82 void BGRAToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); | |
83 void ABGRToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); | |
84 void ARGBToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, | |
85 uint8* dst_u, uint8* dst_v, int width); | |
86 void BGRAToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, | |
87 uint8* dst_u, uint8* dst_v, int width); | |
88 void ABGRToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, | |
89 uint8* dst_u, uint8* dst_v, int width); | |
90 #endif | |
91 #if defined(HAS_BG24TOARGBROW_SSSE3) && defined(HAS_ARGBTOYROW_SSSE3) | |
92 #define HASRGB24TOYROW_SSSE3 | |
93 #endif | |
94 #ifdef HASRGB24TOYROW_SSSE3 | |
95 void RGB24ToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); | |
96 void RAWToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix); | |
97 void RGB24ToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, | |
98 uint8* dst_u, uint8* dst_v, int width); | |
99 void RAWToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, | |
100 uint8* dst_u, uint8* dst_v, int width); | |
101 #endif | |
102 #ifdef HAS_REVERSE_ROW_SSSE3 | |
103 void ReverseRow_SSSE3(const uint8* src, uint8* dst, int width); | |
104 #endif | |
105 #ifdef HAS_REVERSE_ROW_NEON | |
106 void ReverseRow_NEON(const uint8* src, uint8* dst, int width); | |
107 #endif | |
108 void ReverseRow_C(const uint8* src, uint8* dst, int width); | |
109 | |
110 void ARGBToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); | |
111 void BGRAToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); | |
112 void ABGRToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); | |
113 void RGB24ToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); | |
114 void RAWToYRow_C(const uint8* src_argb, uint8* dst_y, int pix); | |
115 void ARGBToUVRow_C(const uint8* src_argb0, int src_stride_argb, | |
116 uint8* dst_u, uint8* dst_v, int width); | |
117 void BGRAToUVRow_C(const uint8* src_argb0, int src_stride_argb, | |
118 uint8* dst_u, uint8* dst_v, int width); | |
119 void ABGRToUVRow_C(const uint8* src_argb0, int src_stride_argb, | |
120 uint8* dst_u, uint8* dst_v, int width); | |
121 void RGB24ToUVRow_C(const uint8* src_argb0, int src_stride_argb, | |
122 uint8* dst_u, uint8* dst_v, int width); | |
123 void RAWToUVRow_C(const uint8* src_argb0, int src_stride_argb, | |
124 uint8* dst_u, uint8* dst_v, int width); | |
125 | |
126 #ifdef HAS_BG24TOARGBROW_SSSE3 | |
127 void ABGRToARGBRow_SSSE3(const uint8* src_abgr, uint8* dst_argb, int pix); | |
128 void BGRAToARGBRow_SSSE3(const uint8* src_bgra, uint8* dst_argb, int pix); | |
129 void BG24ToARGBRow_SSSE3(const uint8* src_bg24, uint8* dst_argb, int pix); | |
130 void RAWToARGBRow_SSSE3(const uint8* src_bg24, uint8* dst_argb, int pix); | |
131 #endif | |
132 void ABGRToARGBRow_C(const uint8* src_abgr, uint8* dst_argb, int pix); | |
133 void BGRAToARGBRow_C(const uint8* src_bgra, uint8* dst_argb, int pix); | |
134 void BG24ToARGBRow_C(const uint8* src_bg24, uint8* dst_argb, int pix); | |
135 void RAWToARGBRow_C(const uint8* src_bg24, uint8* dst_argb, int pix); | |
136 | |
137 #ifdef HAS_I400TOARGBROW_SSE2 | |
138 void I400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix); | |
139 #endif | |
140 void I400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int pix); | |
141 | |
142 #if defined(_MSC_VER) | |
143 #define SIMD_ALIGNED(var) __declspec(align(16)) var | |
144 typedef __declspec(align(16)) signed char vec8[16]; | |
145 typedef __declspec(align(16)) unsigned char uvec8[16]; | |
146 typedef __declspec(align(16)) signed short vec16[8]; | |
147 #else // __GNUC__ | |
148 #define SIMD_ALIGNED(var) var __attribute__((aligned(16))) | |
149 typedef signed char __attribute__((vector_size(16))) vec8; | |
150 typedef unsigned char __attribute__((vector_size(16))) uvec8; | |
151 typedef signed short __attribute__((vector_size(16))) vec16; | |
152 #endif | |
153 | |
154 //extern "C" | |
155 SIMD_ALIGNED(const int16 kCoefficientsRgbY[768][4]); | |
156 //extern "C" | |
157 SIMD_ALIGNED(const int16 kCoefficientsBgraY[768][4]); | |
158 //extern "C" | |
159 SIMD_ALIGNED(const int16 kCoefficientsAbgrY[768][4]); | |
160 | |
161 void FastConvertYUVToARGBRow_C(const uint8* y_buf, | |
162 const uint8* u_buf, | |
163 const uint8* v_buf, | |
164 uint8* rgb_buf, | |
165 int width); | |
166 | |
167 void FastConvertYUVToBGRARow_C(const uint8* y_buf, | |
168 const uint8* u_buf, | |
169 const uint8* v_buf, | |
170 uint8* rgb_buf, | |
171 int width); | |
172 | |
173 void FastConvertYUVToABGRRow_C(const uint8* y_buf, | |
174 const uint8* u_buf, | |
175 const uint8* v_buf, | |
176 uint8* rgb_buf, | |
177 int width); | |
178 | |
179 void FastConvertYUV444ToARGBRow_C(const uint8* y_buf, | |
180 const uint8* u_buf, | |
181 const uint8* v_buf, | |
182 uint8* rgb_buf, | |
183 int width); | |
184 | |
185 void FastConvertYToARGBRow_C(const uint8* y_buf, | |
186 uint8* rgb_buf, | |
187 int width); | |
188 | |
189 #ifdef HAS_FASTCONVERTYUVTOARGBROW_SSE2 | |
190 void FastConvertYUVToARGBRow_SSE2(const uint8* y_buf, | |
191 const uint8* u_buf, | |
192 const uint8* v_buf, | |
193 uint8* rgb_buf, | |
194 int width); | |
195 | |
196 void FastConvertYUVToARGBRow4_SSE2(const uint8* y_buf, | |
197 const uint8* u_buf, | |
198 const uint8* v_buf, | |
199 uint8* rgb_buf, | |
200 int width); | |
201 | |
202 void FastConvertYUVToBGRARow_SSE2(const uint8* y_buf, | |
203 const uint8* u_buf, | |
204 const uint8* v_buf, | |
205 uint8* rgb_buf, | |
206 int width); | |
207 | |
208 void FastConvertYUVToABGRRow_SSE2(const uint8* y_buf, | |
209 const uint8* u_buf, | |
210 const uint8* v_buf, | |
211 uint8* rgb_buf, | |
212 int width); | |
213 | |
214 void FastConvertYUV444ToARGBRow_SSE2(const uint8* y_buf, | |
215 const uint8* u_buf, | |
216 const uint8* v_buf, | |
217 uint8* rgb_buf, | |
218 int width); | |
219 | |
220 void FastConvertYToARGBRow_SSE2(const uint8* y_buf, | |
221 uint8* rgb_buf, | |
222 int width); | |
223 #endif | |
224 | |
225 #ifdef HAS_FASTCONVERTYUVTOARGBROW_SSSE3 | |
226 void FastConvertYUVToARGBRow_SSSE3(const uint8* y_buf, | |
227 const uint8* u_buf, | |
228 const uint8* v_buf, | |
229 uint8* rgb_buf, | |
230 int width); | |
231 | |
232 void FastConvertYUVToBGRARow_SSSE3(const uint8* y_buf, | |
233 const uint8* u_buf, | |
234 const uint8* v_buf, | |
235 uint8* rgb_buf, | |
236 int width); | |
237 | |
238 void FastConvertYUVToABGRRow_SSSE3(const uint8* y_buf, | |
239 const uint8* u_buf, | |
240 const uint8* v_buf, | |
241 uint8* rgb_buf, | |
242 int width); | |
243 | |
244 void FastConvertYUV444ToARGBRow_SSSE3(const uint8* y_buf, | |
245 const uint8* u_buf, | |
246 const uint8* v_buf, | |
247 uint8* rgb_buf, | |
248 int width); | |
249 | |
250 #endif | |
251 | |
252 #ifdef HAS_FASTCONVERTYTOARGBROW_SSE2 | |
253 void FastConvertYToARGBRow_SSE2(const uint8* y_buf, | |
254 uint8* rgb_buf, | |
255 int width); | |
256 | |
257 #endif | |
258 | |
259 #ifdef __cplusplus | |
260 } // extern "C" | |
261 } // namespace libyuv | |
262 #endif | |
263 | |
264 #endif // LIBYUV_SOURCE_ROW_H_ | |
OLD | NEW |