OLD | NEW |
1 /* | 1 /* |
2 * jsimd_arm.c | 2 * jsimd_arm64.c |
3 * | 3 * |
4 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB | 4 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB |
5 * Copyright 2009-2011 D. R. Commander | 5 * Copyright 2009-2011, 2013-2014 D. R. Commander |
6 * | 6 * |
7 * Based on the x86 SIMD extension for IJG JPEG library, | 7 * Based on the x86 SIMD extension for IJG JPEG library, |
8 * Copyright (C) 1999-2006, MIYASAKA Masaru. | 8 * Copyright (C) 1999-2006, MIYASAKA Masaru. |
9 * For conditions of distribution and use, see copyright notice in jsimdext.inc | 9 * For conditions of distribution and use, see copyright notice in jsimdext.inc |
10 * | 10 * |
11 * This file contains the interface between the "normal" portions | 11 * This file contains the interface between the "normal" portions |
12 * of the library and the SIMD implementations when running on | 12 * of the library and the SIMD implementations when running on a |
13 * ARM architecture. | 13 * 64-bit ARM architecture. |
14 * | |
15 * Based on the stubs from 'jsimd_none.c' | |
16 */ | 14 */ |
17 | 15 |
18 #define JPEG_INTERNALS | 16 #define JPEG_INTERNALS |
19 #include "../jinclude.h" | 17 #include "../jinclude.h" |
20 #include "../jpeglib.h" | 18 #include "../jpeglib.h" |
21 #include "../jsimd.h" | 19 #include "../jsimd.h" |
22 #include "../jdct.h" | 20 #include "../jdct.h" |
23 #include "../jsimddct.h" | 21 #include "../jsimddct.h" |
24 #include "jsimd.h" | 22 #include "jsimd.h" |
25 | 23 |
26 #include <stdio.h> | 24 #include <stdio.h> |
27 #include <string.h> | 25 #include <string.h> |
28 #include <ctype.h> | 26 #include <ctype.h> |
29 | 27 |
30 static unsigned int simd_support = ~0; | 28 static unsigned int simd_support = ~0; |
31 | 29 |
32 #if defined(__linux__) || defined(ANDROID) || defined(__ANDROID__) | |
33 | |
34 #define SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT (1024 * 1024) | |
35 | |
36 LOCAL(int) | |
37 check_feature (char *buffer, char *feature) | |
38 { | |
39 char *p; | |
40 if (*feature == 0) | |
41 return 0; | |
42 if (strncmp(buffer, "Features", 8) != 0) | |
43 return 0; | |
44 buffer += 8; | |
45 while (isspace(*buffer)) | |
46 buffer++; | |
47 | |
48 /* Check if 'feature' is present in the buffer as a separate word */ | |
49 while ((p = strstr(buffer, feature))) { | |
50 if (p > buffer && !isspace(*(p - 1))) { | |
51 buffer++; | |
52 continue; | |
53 } | |
54 p += strlen(feature); | |
55 if (*p != 0 && !isspace(*p)) { | |
56 buffer++; | |
57 continue; | |
58 } | |
59 return 1; | |
60 } | |
61 return 0; | |
62 } | |
63 | |
64 LOCAL(int) | |
65 parse_proc_cpuinfo (int bufsize) | |
66 { | |
67 char *buffer = (char *)malloc(bufsize); | |
68 FILE *fd; | |
69 simd_support = 0; | |
70 | |
71 if (!buffer) | |
72 return 0; | |
73 | |
74 fd = fopen("/proc/cpuinfo", "r"); | |
75 if (fd) { | |
76 while (fgets(buffer, bufsize, fd)) { | |
77 if (!strchr(buffer, '\n') && !feof(fd)) { | |
78 /* "impossible" happened - insufficient size of the buffer! */ | |
79 fclose(fd); | |
80 free(buffer); | |
81 return 0; | |
82 } | |
83 if (check_feature(buffer, "neon")) | |
84 simd_support |= JSIMD_ARM_NEON; | |
85 } | |
86 fclose(fd); | |
87 } | |
88 free(buffer); | |
89 return 1; | |
90 } | |
91 | |
92 #endif | |
93 | |
94 /* | 30 /* |
95 * Check what SIMD accelerations are supported. | 31 * Check what SIMD accelerations are supported. |
96 * | 32 * |
97 * FIXME: This code is racy under a multi-threaded environment. | 33 * FIXME: This code is racy under a multi-threaded environment. |
98 */ | 34 */ |
| 35 |
| 36 /* |
| 37 * ARMv8 architectures support NEON extensions by default. |
| 38 * It is no longer optional as it was with ARMv7. |
| 39 */ |
| 40 |
| 41 |
99 LOCAL(void) | 42 LOCAL(void) |
100 init_simd (void) | 43 init_simd (void) |
101 { | 44 { |
102 char *env = NULL; | 45 char *env = NULL; |
103 #if !defined(__ARM_NEON__) && defined(__linux__) || defined(ANDROID) || defined(
__ANDROID__) | |
104 int bufsize = 1024; /* an initial guess for the line buffer size limit */ | |
105 #endif | |
106 | 46 |
107 if (simd_support != ~0U) | 47 if (simd_support != ~0U) |
108 return; | 48 return; |
109 | 49 |
110 simd_support = 0; | 50 simd_support = 0; |
111 | 51 |
112 #if defined(__ARM_NEON__) | |
113 simd_support |= JSIMD_ARM_NEON; | 52 simd_support |= JSIMD_ARM_NEON; |
114 #elif defined(__linux__) || defined(ANDROID) || defined(__ANDROID__) | |
115 /* We still have a chance to use NEON regardless of globally used | |
116 * -mcpu/-mfpu options passed to gcc by performing runtime detection via | |
117 * /proc/cpuinfo parsing on linux/android */ | |
118 while (!parse_proc_cpuinfo(bufsize)) { | |
119 bufsize *= 2; | |
120 if (bufsize > SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT) | |
121 break; | |
122 } | |
123 #endif | |
124 | 53 |
125 /* Force different settings through environment variables */ | 54 /* Force different settings through environment variables */ |
126 env = getenv("JSIMD_FORCE_ARM_NEON"); | 55 env = getenv("JSIMD_FORCENEON"); |
127 if ((env != NULL) && (strcmp(env, "1") == 0)) | 56 if ((env != NULL) && (strcmp(env, "1") == 0)) |
128 simd_support &= JSIMD_ARM_NEON; | 57 simd_support &= JSIMD_ARM_NEON; |
129 env = getenv("JSIMD_FORCE_NO_SIMD"); | 58 env = getenv("JSIMD_FORCENONE"); |
130 if ((env != NULL) && (strcmp(env, "1") == 0)) | 59 if ((env != NULL) && (strcmp(env, "1") == 0)) |
131 simd_support = 0; | 60 simd_support = 0; |
132 } | 61 } |
133 | 62 |
134 GLOBAL(int) | 63 GLOBAL(int) |
135 jsimd_can_rgb_ycc (void) | 64 jsimd_can_rgb_ycc (void) |
136 { | 65 { |
137 init_simd(); | 66 init_simd(); |
138 | 67 |
139 /* The code is optimised for these values only */ | |
140 if (BITS_IN_JSAMPLE != 8) | |
141 return 0; | |
142 if (sizeof(JDIMENSION) != 4) | |
143 return 0; | |
144 if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4)) | |
145 return 0; | |
146 | |
147 if (simd_support & JSIMD_ARM_NEON) | |
148 return 1; | |
149 | |
150 return 0; | 68 return 0; |
151 } | 69 } |
152 | 70 |
153 GLOBAL(int) | 71 GLOBAL(int) |
154 jsimd_can_rgb_gray (void) | 72 jsimd_can_rgb_gray (void) |
155 { | 73 { |
156 init_simd(); | 74 init_simd(); |
157 | 75 |
158 return 0; | 76 return 0; |
159 } | 77 } |
160 | 78 |
161 GLOBAL(int) | 79 GLOBAL(int) |
162 jsimd_can_ycc_rgb (void) | 80 jsimd_can_ycc_rgb (void) |
163 { | 81 { |
164 init_simd(); | 82 init_simd(); |
165 | 83 |
166 /* The code is optimised for these values only */ | 84 /* The code is optimised for these values only */ |
167 if (BITS_IN_JSAMPLE != 8) | 85 if (BITS_IN_JSAMPLE != 8) |
168 return 0; | 86 return 0; |
169 if (sizeof(JDIMENSION) != 4) | 87 if (sizeof(JDIMENSION) != 4) |
170 return 0; | 88 return 0; |
171 if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4)) | 89 if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4)) |
172 return 0; | 90 return 0; |
| 91 |
173 if (simd_support & JSIMD_ARM_NEON) | 92 if (simd_support & JSIMD_ARM_NEON) |
174 return 1; | 93 return 1; |
175 | 94 |
| 95 return 0; |
| 96 } |
| 97 |
| 98 GLOBAL(int) |
| 99 jsimd_can_ycc_rgb565 (void) |
| 100 { |
| 101 init_simd(); |
| 102 |
| 103 /* The code is optimised for these values only */ |
| 104 if (BITS_IN_JSAMPLE != 8) |
| 105 return 0; |
| 106 if (sizeof(JDIMENSION) != 4) |
| 107 return 0; |
| 108 |
| 109 if (simd_support & JSIMD_ARM_NEON) |
| 110 return 1; |
| 111 |
176 return 0; | 112 return 0; |
177 } | 113 } |
178 | 114 |
179 GLOBAL(void) | 115 GLOBAL(void) |
180 jsimd_rgb_ycc_convert (j_compress_ptr cinfo, | 116 jsimd_rgb_ycc_convert (j_compress_ptr cinfo, |
181 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, | 117 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, |
182 JDIMENSION output_row, int num_rows) | 118 JDIMENSION output_row, int num_rows) |
183 { | 119 { |
184 void (*neonfct)(JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int); | |
185 | |
186 switch(cinfo->in_color_space) | |
187 { | |
188 case JCS_EXT_RGB: | |
189 neonfct=jsimd_extrgb_ycc_convert_neon; | |
190 break; | |
191 case JCS_EXT_RGBX: | |
192 case JCS_EXT_RGBA: | |
193 neonfct=jsimd_extrgbx_ycc_convert_neon; | |
194 break; | |
195 case JCS_EXT_BGR: | |
196 neonfct=jsimd_extbgr_ycc_convert_neon; | |
197 break; | |
198 case JCS_EXT_BGRX: | |
199 case JCS_EXT_BGRA: | |
200 neonfct=jsimd_extbgrx_ycc_convert_neon; | |
201 break; | |
202 case JCS_EXT_XBGR: | |
203 case JCS_EXT_ABGR: | |
204 neonfct=jsimd_extxbgr_ycc_convert_neon; | |
205 break; | |
206 case JCS_EXT_XRGB: | |
207 case JCS_EXT_ARGB: | |
208 neonfct=jsimd_extxrgb_ycc_convert_neon; | |
209 break; | |
210 default: | |
211 neonfct=jsimd_extrgb_ycc_convert_neon; | |
212 break; | |
213 } | |
214 | |
215 if (simd_support & JSIMD_ARM_NEON) | |
216 neonfct(cinfo->image_width, input_buf, | |
217 output_buf, output_row, num_rows); | |
218 } | 120 } |
219 | 121 |
220 GLOBAL(void) | 122 GLOBAL(void) |
221 jsimd_rgb_gray_convert (j_compress_ptr cinfo, | 123 jsimd_rgb_gray_convert (j_compress_ptr cinfo, |
222 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, | 124 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, |
223 JDIMENSION output_row, int num_rows) | 125 JDIMENSION output_row, int num_rows) |
224 { | 126 { |
225 } | 127 } |
226 | 128 |
227 GLOBAL(void) | 129 GLOBAL(void) |
228 jsimd_ycc_rgb_convert (j_decompress_ptr cinfo, | 130 jsimd_ycc_rgb_convert (j_decompress_ptr cinfo, |
229 JSAMPIMAGE input_buf, JDIMENSION input_row, | 131 JSAMPIMAGE input_buf, JDIMENSION input_row, |
230 JSAMPARRAY output_buf, int num_rows) | 132 JSAMPARRAY output_buf, int num_rows) |
231 { | 133 { |
232 void (*neonfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int); | 134 void (*neonfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int); |
233 | 135 |
234 switch(cinfo->out_color_space) | 136 switch(cinfo->out_color_space) { |
235 { | |
236 case JCS_EXT_RGB: | 137 case JCS_EXT_RGB: |
237 neonfct=jsimd_ycc_extrgb_convert_neon; | 138 neonfct=jsimd_ycc_extrgb_convert_neon; |
238 break; | 139 break; |
239 case JCS_EXT_RGBX: | 140 case JCS_EXT_RGBX: |
240 case JCS_EXT_RGBA: | 141 case JCS_EXT_RGBA: |
241 neonfct=jsimd_ycc_extrgbx_convert_neon; | 142 neonfct=jsimd_ycc_extrgbx_convert_neon; |
242 break; | 143 break; |
243 case JCS_EXT_BGR: | 144 case JCS_EXT_BGR: |
244 neonfct=jsimd_ycc_extbgr_convert_neon; | 145 neonfct=jsimd_ycc_extbgr_convert_neon; |
245 break; | 146 break; |
246 case JCS_EXT_BGRX: | 147 case JCS_EXT_BGRX: |
247 case JCS_EXT_BGRA: | 148 case JCS_EXT_BGRA: |
248 neonfct=jsimd_ycc_extbgrx_convert_neon; | 149 neonfct=jsimd_ycc_extbgrx_convert_neon; |
249 break; | 150 break; |
250 case JCS_EXT_XBGR: | 151 case JCS_EXT_XBGR: |
251 case JCS_EXT_ABGR: | 152 case JCS_EXT_ABGR: |
252 neonfct=jsimd_ycc_extxbgr_convert_neon; | 153 neonfct=jsimd_ycc_extxbgr_convert_neon; |
253 break; | 154 break; |
254 case JCS_EXT_XRGB: | 155 case JCS_EXT_XRGB: |
255 case JCS_EXT_ARGB: | 156 case JCS_EXT_ARGB: |
256 neonfct=jsimd_ycc_extxrgb_convert_neon; | 157 neonfct=jsimd_ycc_extxrgb_convert_neon; |
257 break; | 158 break; |
258 default: | 159 default: |
259 neonfct=jsimd_ycc_extrgb_convert_neon; | 160 neonfct=jsimd_ycc_extrgb_convert_neon; |
260 break; | 161 break; |
261 } | 162 } |
262 | 163 |
263 if (simd_support & JSIMD_ARM_NEON) | 164 if (simd_support & JSIMD_ARM_NEON) |
264 neonfct(cinfo->output_width, input_buf, | 165 neonfct(cinfo->output_width, input_buf, input_row, output_buf, num_rows); |
265 input_row, output_buf, num_rows); | 166 } |
| 167 |
| 168 GLOBAL(void) |
| 169 jsimd_ycc_rgb565_convert (j_decompress_ptr cinfo, |
| 170 JSAMPIMAGE input_buf, JDIMENSION input_row, |
| 171 JSAMPARRAY output_buf, int num_rows) |
| 172 { |
| 173 if (simd_support & JSIMD_ARM_NEON) |
| 174 jsimd_ycc_rgb565_convert_neon(cinfo->output_width, input_buf, input_row, |
| 175 output_buf, num_rows); |
266 } | 176 } |
267 | 177 |
268 GLOBAL(int) | 178 GLOBAL(int) |
269 jsimd_can_h2v2_downsample (void) | 179 jsimd_can_h2v2_downsample (void) |
270 { | 180 { |
271 init_simd(); | 181 init_simd(); |
272 | 182 |
273 return 0; | 183 return 0; |
274 } | 184 } |
275 | 185 |
(...skipping 28 matching lines...) Expand all Loading... |
304 GLOBAL(int) | 214 GLOBAL(int) |
305 jsimd_can_h2v1_upsample (void) | 215 jsimd_can_h2v1_upsample (void) |
306 { | 216 { |
307 init_simd(); | 217 init_simd(); |
308 | 218 |
309 return 0; | 219 return 0; |
310 } | 220 } |
311 | 221 |
312 GLOBAL(void) | 222 GLOBAL(void) |
313 jsimd_h2v2_upsample (j_decompress_ptr cinfo, | 223 jsimd_h2v2_upsample (j_decompress_ptr cinfo, |
314 jpeg_component_info * compptr, | 224 jpeg_component_info * compptr, |
315 JSAMPARRAY input_data, | 225 JSAMPARRAY input_data, |
316 JSAMPARRAY * output_data_ptr) | 226 JSAMPARRAY * output_data_ptr) |
317 { | 227 { |
318 } | 228 } |
319 | 229 |
320 GLOBAL(void) | 230 GLOBAL(void) |
321 jsimd_h2v1_upsample (j_decompress_ptr cinfo, | 231 jsimd_h2v1_upsample (j_decompress_ptr cinfo, |
322 jpeg_component_info * compptr, | 232 jpeg_component_info * compptr, |
323 JSAMPARRAY input_data, | 233 JSAMPARRAY input_data, |
324 JSAMPARRAY * output_data_ptr) | 234 JSAMPARRAY * output_data_ptr) |
325 { | 235 { |
326 } | 236 } |
327 | 237 |
328 GLOBAL(int) | 238 GLOBAL(int) |
329 jsimd_can_h2v2_fancy_upsample (void) | 239 jsimd_can_h2v2_fancy_upsample (void) |
330 { | 240 { |
331 init_simd(); | 241 init_simd(); |
332 | 242 |
333 return 0; | 243 return 0; |
334 } | 244 } |
335 | 245 |
336 GLOBAL(int) | 246 GLOBAL(int) |
337 jsimd_can_h2v1_fancy_upsample (void) | 247 jsimd_can_h2v1_fancy_upsample (void) |
338 { | 248 { |
339 init_simd(); | 249 init_simd(); |
340 | 250 |
341 /* The code is optimised for these values only */ | |
342 if (BITS_IN_JSAMPLE != 8) | |
343 return 0; | |
344 if (sizeof(JDIMENSION) != 4) | |
345 return 0; | |
346 | |
347 if (simd_support & JSIMD_ARM_NEON) | |
348 return 1; | |
349 | |
350 return 0; | 251 return 0; |
351 } | 252 } |
352 | 253 |
353 GLOBAL(void) | 254 GLOBAL(void) |
354 jsimd_h2v2_fancy_upsample (j_decompress_ptr cinfo, | 255 jsimd_h2v2_fancy_upsample (j_decompress_ptr cinfo, |
355 jpeg_component_info * compptr, | 256 jpeg_component_info * compptr, |
356 JSAMPARRAY input_data, | 257 JSAMPARRAY input_data, |
357 JSAMPARRAY * output_data_ptr) | 258 JSAMPARRAY * output_data_ptr) |
358 { | 259 { |
359 } | 260 } |
360 | 261 |
361 GLOBAL(void) | 262 GLOBAL(void) |
362 jsimd_h2v1_fancy_upsample (j_decompress_ptr cinfo, | 263 jsimd_h2v1_fancy_upsample (j_decompress_ptr cinfo, |
363 jpeg_component_info * compptr, | 264 jpeg_component_info * compptr, |
364 JSAMPARRAY input_data, | 265 JSAMPARRAY input_data, |
365 JSAMPARRAY * output_data_ptr) | 266 JSAMPARRAY * output_data_ptr) |
366 { | 267 { |
367 if (simd_support & JSIMD_ARM_NEON) | |
368 jsimd_h2v1_fancy_upsample_neon(cinfo->max_v_samp_factor, | |
369 compptr->downsampled_width, input_data, output_data_ptr); | |
370 } | 268 } |
371 | 269 |
372 GLOBAL(int) | 270 GLOBAL(int) |
373 jsimd_can_h2v2_merged_upsample (void) | 271 jsimd_can_h2v2_merged_upsample (void) |
374 { | 272 { |
375 init_simd(); | 273 init_simd(); |
376 | 274 |
377 return 0; | 275 return 0; |
378 } | 276 } |
379 | 277 |
(...skipping 19 matching lines...) Expand all Loading... |
399 JDIMENSION in_row_group_ctr, | 297 JDIMENSION in_row_group_ctr, |
400 JSAMPARRAY output_buf) | 298 JSAMPARRAY output_buf) |
401 { | 299 { |
402 } | 300 } |
403 | 301 |
404 GLOBAL(int) | 302 GLOBAL(int) |
405 jsimd_can_convsamp (void) | 303 jsimd_can_convsamp (void) |
406 { | 304 { |
407 init_simd(); | 305 init_simd(); |
408 | 306 |
409 /* The code is optimised for these values only */ | |
410 if (DCTSIZE != 8) | |
411 return 0; | |
412 if (BITS_IN_JSAMPLE != 8) | |
413 return 0; | |
414 if (sizeof(JDIMENSION) != 4) | |
415 return 0; | |
416 if (sizeof(DCTELEM) != 2) | |
417 return 0; | |
418 | |
419 if (simd_support & JSIMD_ARM_NEON) | |
420 return 1; | |
421 | |
422 return 0; | 307 return 0; |
423 } | 308 } |
424 | 309 |
425 GLOBAL(int) | 310 GLOBAL(int) |
426 jsimd_can_convsamp_float (void) | 311 jsimd_can_convsamp_float (void) |
427 { | 312 { |
428 init_simd(); | 313 init_simd(); |
429 | 314 |
430 return 0; | 315 return 0; |
431 } | 316 } |
432 | 317 |
433 GLOBAL(void) | 318 GLOBAL(void) |
434 jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col, | 319 jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col, |
435 DCTELEM * workspace) | 320 DCTELEM * workspace) |
436 { | 321 { |
437 if (simd_support & JSIMD_ARM_NEON) | |
438 jsimd_convsamp_neon(sample_data, start_col, workspace); | |
439 } | 322 } |
440 | 323 |
441 GLOBAL(void) | 324 GLOBAL(void) |
442 jsimd_convsamp_float (JSAMPARRAY sample_data, JDIMENSION start_col, | 325 jsimd_convsamp_float (JSAMPARRAY sample_data, JDIMENSION start_col, |
443 FAST_FLOAT * workspace) | 326 FAST_FLOAT * workspace) |
444 { | 327 { |
445 } | 328 } |
446 | 329 |
447 GLOBAL(int) | 330 GLOBAL(int) |
448 jsimd_can_fdct_islow (void) | 331 jsimd_can_fdct_islow (void) |
449 { | 332 { |
450 init_simd(); | 333 init_simd(); |
451 | 334 |
452 return 0; | 335 return 0; |
453 } | 336 } |
454 | 337 |
455 GLOBAL(int) | 338 GLOBAL(int) |
456 jsimd_can_fdct_ifast (void) | 339 jsimd_can_fdct_ifast (void) |
457 { | 340 { |
458 init_simd(); | 341 init_simd(); |
459 | 342 |
460 /* The code is optimised for these values only */ | |
461 if (DCTSIZE != 8) | |
462 return 0; | |
463 if (sizeof(DCTELEM) != 2) | |
464 return 0; | |
465 | |
466 if (simd_support & JSIMD_ARM_NEON) | |
467 return 1; | |
468 | |
469 return 0; | 343 return 0; |
470 } | 344 } |
471 | 345 |
472 GLOBAL(int) | 346 GLOBAL(int) |
473 jsimd_can_fdct_float (void) | 347 jsimd_can_fdct_float (void) |
474 { | 348 { |
475 init_simd(); | 349 init_simd(); |
476 | 350 |
477 return 0; | 351 return 0; |
478 } | 352 } |
479 | 353 |
480 GLOBAL(void) | 354 GLOBAL(void) |
481 jsimd_fdct_islow (DCTELEM * data) | 355 jsimd_fdct_islow (DCTELEM * data) |
482 { | 356 { |
483 } | 357 } |
484 | 358 |
485 GLOBAL(void) | 359 GLOBAL(void) |
486 jsimd_fdct_ifast (DCTELEM * data) | 360 jsimd_fdct_ifast (DCTELEM * data) |
487 { | 361 { |
488 if (simd_support & JSIMD_ARM_NEON) | |
489 jsimd_fdct_ifast_neon(data); | |
490 } | 362 } |
491 | 363 |
492 GLOBAL(void) | 364 GLOBAL(void) |
493 jsimd_fdct_float (FAST_FLOAT * data) | 365 jsimd_fdct_float (FAST_FLOAT * data) |
494 { | 366 { |
495 } | 367 } |
496 | 368 |
497 GLOBAL(int) | 369 GLOBAL(int) |
498 jsimd_can_quantize (void) | 370 jsimd_can_quantize (void) |
499 { | 371 { |
500 init_simd(); | 372 init_simd(); |
501 | 373 |
502 /* The code is optimised for these values only */ | |
503 if (DCTSIZE != 8) | |
504 return 0; | |
505 if (sizeof(JCOEF) != 2) | |
506 return 0; | |
507 if (sizeof(DCTELEM) != 2) | |
508 return 0; | |
509 | |
510 if (simd_support & JSIMD_ARM_NEON) | |
511 return 1; | |
512 | |
513 return 0; | 374 return 0; |
514 } | 375 } |
515 | 376 |
516 GLOBAL(int) | 377 GLOBAL(int) |
517 jsimd_can_quantize_float (void) | 378 jsimd_can_quantize_float (void) |
518 { | 379 { |
519 init_simd(); | 380 init_simd(); |
520 | 381 |
521 return 0; | 382 return 0; |
522 } | 383 } |
523 | 384 |
524 GLOBAL(void) | 385 GLOBAL(void) |
525 jsimd_quantize (JCOEFPTR coef_block, DCTELEM * divisors, | 386 jsimd_quantize (JCOEFPTR coef_block, DCTELEM * divisors, |
526 DCTELEM * workspace) | 387 DCTELEM * workspace) |
527 { | 388 { |
528 if (simd_support & JSIMD_ARM_NEON) | |
529 jsimd_quantize_neon(coef_block, divisors, workspace); | |
530 } | 389 } |
531 | 390 |
532 GLOBAL(void) | 391 GLOBAL(void) |
533 jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT * divisors, | 392 jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT * divisors, |
534 FAST_FLOAT * workspace) | 393 FAST_FLOAT * workspace) |
535 { | 394 { |
536 } | 395 } |
537 | 396 |
538 GLOBAL(int) | 397 GLOBAL(int) |
539 jsimd_can_idct_2x2 (void) | 398 jsimd_can_idct_2x2 (void) |
540 { | 399 { |
541 init_simd(); | 400 init_simd(); |
542 | 401 |
543 /* The code is optimised for these values only */ | 402 /* The code is optimised for these values only */ |
544 if (DCTSIZE != 8) | 403 if (DCTSIZE != 8) |
545 return 0; | 404 return 0; |
546 if (sizeof(JCOEF) != 2) | 405 if (sizeof(JCOEF) != 2) |
547 return 0; | 406 return 0; |
548 if (BITS_IN_JSAMPLE != 8) | 407 if (BITS_IN_JSAMPLE != 8) |
549 return 0; | 408 return 0; |
550 if (sizeof(JDIMENSION) != 4) | 409 if (sizeof(JDIMENSION) != 4) |
551 return 0; | 410 return 0; |
552 if (sizeof(ISLOW_MULT_TYPE) != 2) | 411 if (sizeof(ISLOW_MULT_TYPE) != 2) |
553 return 0; | 412 return 0; |
554 | 413 |
555 if ((simd_support & JSIMD_ARM_NEON)) | 414 if (simd_support & JSIMD_ARM_NEON) |
556 return 1; | 415 return 1; |
557 | 416 |
558 return 0; | 417 return 0; |
559 } | 418 } |
560 | 419 |
561 GLOBAL(int) | 420 GLOBAL(int) |
562 jsimd_can_idct_4x4 (void) | 421 jsimd_can_idct_4x4 (void) |
563 { | 422 { |
564 init_simd(); | 423 init_simd(); |
565 | 424 |
566 /* The code is optimised for these values only */ | 425 /* The code is optimised for these values only */ |
567 if (DCTSIZE != 8) | 426 if (DCTSIZE != 8) |
568 return 0; | 427 return 0; |
569 if (sizeof(JCOEF) != 2) | 428 if (sizeof(JCOEF) != 2) |
570 return 0; | 429 return 0; |
571 if (BITS_IN_JSAMPLE != 8) | 430 if (BITS_IN_JSAMPLE != 8) |
572 return 0; | 431 return 0; |
573 if (sizeof(JDIMENSION) != 4) | 432 if (sizeof(JDIMENSION) != 4) |
574 return 0; | 433 return 0; |
575 if (sizeof(ISLOW_MULT_TYPE) != 2) | 434 if (sizeof(ISLOW_MULT_TYPE) != 2) |
576 return 0; | 435 return 0; |
577 | 436 |
578 if ((simd_support & JSIMD_ARM_NEON)) | 437 if (simd_support & JSIMD_ARM_NEON) |
579 return 1; | 438 return 1; |
580 | 439 |
581 return 0; | 440 return 0; |
582 } | 441 } |
583 | 442 |
584 GLOBAL(void) | 443 GLOBAL(void) |
585 jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 444 jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
586 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 445 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
587 JDIMENSION output_col) | 446 JDIMENSION output_col) |
588 { | 447 { |
589 if ((simd_support & JSIMD_ARM_NEON)) | 448 if (simd_support & JSIMD_ARM_NEON) |
590 jsimd_idct_2x2_neon(compptr->dct_table, coef_block, output_buf, output_col); | 449 jsimd_idct_2x2_neon(compptr->dct_table, coef_block, output_buf, |
| 450 output_col); |
591 } | 451 } |
592 | 452 |
593 GLOBAL(void) | 453 GLOBAL(void) |
594 jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 454 jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
595 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 455 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
596 JDIMENSION output_col) | 456 JDIMENSION output_col) |
597 { | 457 { |
598 if ((simd_support & JSIMD_ARM_NEON)) | 458 if (simd_support & JSIMD_ARM_NEON) |
599 jsimd_idct_4x4_neon(compptr->dct_table, coef_block, output_buf, output_col); | 459 jsimd_idct_4x4_neon(compptr->dct_table, coef_block, output_buf, |
| 460 output_col); |
600 } | 461 } |
601 | 462 |
602 GLOBAL(int) | 463 GLOBAL(int) |
603 jsimd_can_idct_islow (void) | 464 jsimd_can_idct_islow (void) |
604 { | 465 { |
605 init_simd(); | 466 init_simd(); |
606 | 467 |
607 /* The code is optimised for these values only */ | 468 /* The code is optimised for these values only */ |
608 if (DCTSIZE != 8) | 469 if (DCTSIZE != 8) |
609 return 0; | 470 return 0; |
(...skipping 24 matching lines...) Expand all Loading... |
634 return 0; | 495 return 0; |
635 if (BITS_IN_JSAMPLE != 8) | 496 if (BITS_IN_JSAMPLE != 8) |
636 return 0; | 497 return 0; |
637 if (sizeof(JDIMENSION) != 4) | 498 if (sizeof(JDIMENSION) != 4) |
638 return 0; | 499 return 0; |
639 if (sizeof(IFAST_MULT_TYPE) != 2) | 500 if (sizeof(IFAST_MULT_TYPE) != 2) |
640 return 0; | 501 return 0; |
641 if (IFAST_SCALE_BITS != 2) | 502 if (IFAST_SCALE_BITS != 2) |
642 return 0; | 503 return 0; |
643 | 504 |
644 if ((simd_support & JSIMD_ARM_NEON)) | 505 if (simd_support & JSIMD_ARM_NEON) |
645 return 1; | 506 return 1; |
646 | 507 |
647 return 0; | 508 return 0; |
648 } | 509 } |
649 | 510 |
650 GLOBAL(int) | 511 GLOBAL(int) |
651 jsimd_can_idct_float (void) | 512 jsimd_can_idct_float (void) |
652 { | 513 { |
653 init_simd(); | 514 init_simd(); |
654 | 515 |
655 return 0; | 516 return 0; |
656 } | 517 } |
657 | 518 |
658 GLOBAL(void) | 519 GLOBAL(void) |
659 jsimd_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 520 jsimd_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
660 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 521 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
661 JDIMENSION output_col) | 522 JDIMENSION output_col) |
662 { | 523 { |
663 if ((simd_support & JSIMD_ARM_NEON)) | 524 if (simd_support & JSIMD_ARM_NEON) |
664 jsimd_idct_islow_neon(compptr->dct_table, coef_block, output_buf, output_col
); | 525 jsimd_idct_islow_neon(compptr->dct_table, coef_block, output_buf, |
| 526 output_col); |
665 } | 527 } |
666 | 528 |
667 GLOBAL(void) | 529 GLOBAL(void) |
668 jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 530 jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
669 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 531 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
670 JDIMENSION output_col) | 532 JDIMENSION output_col) |
671 { | 533 { |
672 if ((simd_support & JSIMD_ARM_NEON)) | 534 if (simd_support & JSIMD_ARM_NEON) |
673 jsimd_idct_ifast_neon(compptr->dct_table, coef_block, output_buf, output_col
); | 535 jsimd_idct_ifast_neon(compptr->dct_table, coef_block, output_buf, |
| 536 output_col); |
674 } | 537 } |
675 | 538 |
676 GLOBAL(void) | 539 GLOBAL(void) |
677 jsimd_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 540 jsimd_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
678 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 541 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
679 JDIMENSION output_col) | 542 JDIMENSION output_col) |
680 { | 543 { |
681 } | 544 } |
682 | |
OLD | NEW |