1 /*
2 * jsimd_arm.c
3 *
4 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
5 * Copyright 2009-2011 D. R. Commander
6 *
7 * Based on the x86 SIMD extension for IJG JPEG library,
8 * Copyright (C) 1999-2006, MIYASAKA Masaru.
9 * For conditions of distribution and use, see copyright notice in jsimdext.inc
10 *
11 * This file contains the interface between the "normal" portions
12 * of the library and the SIMD implementations when running on
13 * ARM architecture.
14 *
15 * Based on the stubs from 'jsimd_none.c'
16 */
17
18 #define JPEG_INTERNALS
19 #include "../jinclude.h"
20 #include "../jpeglib.h"
21 #include "../jsimd.h"
22 #include "../jdct.h"
23 #include "../jsimddct.h"
24 #include "jsimd.h"
25
26 #include <stdio.h>
27 #include <string.h>
28 #include <ctype.h>
29
30 static unsigned int simd_support = ~0;
31
32 #if defined(__linux__) || defined(ANDROID) || defined(__ANDROID__)
33
34 #define SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT (1024 * 1024)
35
36 LOCAL(int)
check_feature(char * buffer,char * feature)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)
parse_proc_cpuinfo(int bufsize)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 /*
95 * Check what SIMD accelerations are supported.
96 *
97 * FIXME: This code is racy under a multi-threaded environment.
98 */
99 LOCAL(void)
init_simd(void)100 init_simd (void)
101 {
102 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
107 if (simd_support != ~0U)
108 return;
109
110 simd_support = 0;
111
112 #if defined(__ARM_NEON__)
113 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
125 /* Force different settings through environment variables */
126 env = getenv("JSIMD_FORCE_ARM_NEON");
127 if ((env != NULL) && (strcmp(env, "1") == 0))
128 simd_support &= JSIMD_ARM_NEON;
129 env = getenv("JSIMD_FORCE_NO_SIMD");
130 if ((env != NULL) && (strcmp(env, "1") == 0))
131 simd_support = 0;
132 }
133
134 GLOBAL(int)
jsimd_can_rgb_ycc(void)135 jsimd_can_rgb_ycc (void)
136 {
137 init_simd();
138
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;
151 }
152
153 GLOBAL(int)
jsimd_can_rgb_gray(void)154 jsimd_can_rgb_gray (void)
155 {
156 init_simd();
157
158 return 0;
159 }
160
161 GLOBAL(int)
jsimd_can_ycc_rgb(void)162 jsimd_can_ycc_rgb (void)
163 {
164 init_simd();
165
166 /* The code is optimised for these values only */
167 if (BITS_IN_JSAMPLE != 8)
168 return 0;
169 if (sizeof(JDIMENSION) != 4)
170 return 0;
171 if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4))
172 return 0;
173 if (simd_support & JSIMD_ARM_NEON)
174 return 1;
175
176 return 0;
177 }
178
179 GLOBAL(void)
jsimd_rgb_ycc_convert(j_compress_ptr cinfo,JSAMPARRAY input_buf,JSAMPIMAGE output_buf,JDIMENSION output_row,int num_rows)180 jsimd_rgb_ycc_convert (j_compress_ptr cinfo,
181 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
182 JDIMENSION output_row, int num_rows)
183 {
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 }
219
220 GLOBAL(void)
jsimd_rgb_gray_convert(j_compress_ptr cinfo,JSAMPARRAY input_buf,JSAMPIMAGE output_buf,JDIMENSION output_row,int num_rows)221 jsimd_rgb_gray_convert (j_compress_ptr cinfo,
222 JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
223 JDIMENSION output_row, int num_rows)
224 {
225 }
226
227 GLOBAL(void)
jsimd_ycc_rgb_convert(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION input_row,JSAMPARRAY output_buf,int num_rows)228 jsimd_ycc_rgb_convert (j_decompress_ptr cinfo,
229 JSAMPIMAGE input_buf, JDIMENSION input_row,
230 JSAMPARRAY output_buf, int num_rows)
231 {
232 void (*neonfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int);
233
234 switch(cinfo->out_color_space)
235 {
236 case JCS_EXT_RGB:
237 neonfct=jsimd_ycc_extrgb_convert_neon;
238 break;
239 case JCS_EXT_RGBX:
240 case JCS_EXT_RGBA:
241 neonfct=jsimd_ycc_extrgbx_convert_neon;
242 break;
243 case JCS_EXT_BGR:
244 neonfct=jsimd_ycc_extbgr_convert_neon;
245 break;
246 case JCS_EXT_BGRX:
247 case JCS_EXT_BGRA:
248 neonfct=jsimd_ycc_extbgrx_convert_neon;
249 break;
250 case JCS_EXT_XBGR:
251 case JCS_EXT_ABGR:
252 neonfct=jsimd_ycc_extxbgr_convert_neon;
253 break;
254 case JCS_EXT_XRGB:
255 case JCS_EXT_ARGB:
256 neonfct=jsimd_ycc_extxrgb_convert_neon;
257 break;
258 default:
259 neonfct=jsimd_ycc_extrgb_convert_neon;
260 break;
261 }
262
263 if (simd_support & JSIMD_ARM_NEON)
264 neonfct(cinfo->output_width, input_buf,
265 input_row, output_buf, num_rows);
266 }
267
268 GLOBAL(int)
jsimd_can_h2v2_downsample(void)269 jsimd_can_h2v2_downsample (void)
270 {
271 init_simd();
272
273 return 0;
274 }
275
276 GLOBAL(int)
jsimd_can_h2v1_downsample(void)277 jsimd_can_h2v1_downsample (void)
278 {
279 init_simd();
280
281 return 0;
282 }
283
284 GLOBAL(void)
jsimd_h2v2_downsample(j_compress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY output_data)285 jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
286 JSAMPARRAY input_data, JSAMPARRAY output_data)
287 {
288 }
289
290 GLOBAL(void)
jsimd_h2v1_downsample(j_compress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY output_data)291 jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
292 JSAMPARRAY input_data, JSAMPARRAY output_data)
293 {
294 }
295
296 GLOBAL(int)
jsimd_can_h2v2_upsample(void)297 jsimd_can_h2v2_upsample (void)
298 {
299 init_simd();
300
301 return 0;
302 }
303
304 GLOBAL(int)
jsimd_can_h2v1_upsample(void)305 jsimd_can_h2v1_upsample (void)
306 {
307 init_simd();
308
309 return 0;
310 }
311
312 GLOBAL(void)
jsimd_h2v2_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)313 jsimd_h2v2_upsample (j_decompress_ptr cinfo,
314 jpeg_component_info * compptr,
315 JSAMPARRAY input_data,
316 JSAMPARRAY * output_data_ptr)
317 {
318 }
319
320 GLOBAL(void)
jsimd_h2v1_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)321 jsimd_h2v1_upsample (j_decompress_ptr cinfo,
322 jpeg_component_info * compptr,
323 JSAMPARRAY input_data,
324 JSAMPARRAY * output_data_ptr)
325 {
326 }
327
328 GLOBAL(int)
jsimd_can_h2v2_fancy_upsample(void)329 jsimd_can_h2v2_fancy_upsample (void)
330 {
331 init_simd();
332
333 return 0;
334 }
335
336 GLOBAL(int)
jsimd_can_h2v1_fancy_upsample(void)337 jsimd_can_h2v1_fancy_upsample (void)
338 {
339 init_simd();
340
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;
351 }
352
353 GLOBAL(void)
jsimd_h2v2_fancy_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)354 jsimd_h2v2_fancy_upsample (j_decompress_ptr cinfo,
355 jpeg_component_info * compptr,
356 JSAMPARRAY input_data,
357 JSAMPARRAY * output_data_ptr)
358 {
359 }
360
361 GLOBAL(void)
jsimd_h2v1_fancy_upsample(j_decompress_ptr cinfo,jpeg_component_info * compptr,JSAMPARRAY input_data,JSAMPARRAY * output_data_ptr)362 jsimd_h2v1_fancy_upsample (j_decompress_ptr cinfo,
363 jpeg_component_info * compptr,
364 JSAMPARRAY input_data,
365 JSAMPARRAY * output_data_ptr)
366 {
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 }
371
372 GLOBAL(int)
jsimd_can_h2v2_merged_upsample(void)373 jsimd_can_h2v2_merged_upsample (void)
374 {
375 init_simd();
376
377 return 0;
378 }
379
380 GLOBAL(int)
jsimd_can_h2v1_merged_upsample(void)381 jsimd_can_h2v1_merged_upsample (void)
382 {
383 init_simd();
384
385 return 0;
386 }
387
388 GLOBAL(void)
jsimd_h2v2_merged_upsample(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION in_row_group_ctr,JSAMPARRAY output_buf)389 jsimd_h2v2_merged_upsample (j_decompress_ptr cinfo,
390 JSAMPIMAGE input_buf,
391 JDIMENSION in_row_group_ctr,
392 JSAMPARRAY output_buf)
393 {
394 }
395
396 GLOBAL(void)
jsimd_h2v1_merged_upsample(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION in_row_group_ctr,JSAMPARRAY output_buf)397 jsimd_h2v1_merged_upsample (j_decompress_ptr cinfo,
398 JSAMPIMAGE input_buf,
399 JDIMENSION in_row_group_ctr,
400 JSAMPARRAY output_buf)
401 {
402 }
403
404 GLOBAL(int)
jsimd_can_convsamp(void)405 jsimd_can_convsamp (void)
406 {
407 init_simd();
408
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;
423 }
424
425 GLOBAL(int)
jsimd_can_convsamp_float(void)426 jsimd_can_convsamp_float (void)
427 {
428 init_simd();
429
430 return 0;
431 }
432
433 GLOBAL(void)
jsimd_convsamp(JSAMPARRAY sample_data,JDIMENSION start_col,DCTELEM * workspace)434 jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col,
435 DCTELEM * workspace)
436 {
437 if (simd_support & JSIMD_ARM_NEON)
438 jsimd_convsamp_neon(sample_data, start_col, workspace);
439 }
440
441 GLOBAL(void)
jsimd_convsamp_float(JSAMPARRAY sample_data,JDIMENSION start_col,FAST_FLOAT * workspace)442 jsimd_convsamp_float (JSAMPARRAY sample_data, JDIMENSION start_col,
443 FAST_FLOAT * workspace)
444 {
445 }
446
447 GLOBAL(int)
jsimd_can_fdct_islow(void)448 jsimd_can_fdct_islow (void)
449 {
450 init_simd();
451
452 return 0;
453 }
454
455 GLOBAL(int)
jsimd_can_fdct_ifast(void)456 jsimd_can_fdct_ifast (void)
457 {
458 init_simd();
459
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;
470 }
471
472 GLOBAL(int)
jsimd_can_fdct_float(void)473 jsimd_can_fdct_float (void)
474 {
475 init_simd();
476
477 return 0;
478 }
479
480 GLOBAL(void)
jsimd_fdct_islow(DCTELEM * data)481 jsimd_fdct_islow (DCTELEM * data)
482 {
483 }
484
485 GLOBAL(void)
jsimd_fdct_ifast(DCTELEM * data)486 jsimd_fdct_ifast (DCTELEM * data)
487 {
488 if (simd_support & JSIMD_ARM_NEON)
489 jsimd_fdct_ifast_neon(data);
490 }
491
492 GLOBAL(void)
jsimd_fdct_float(FAST_FLOAT * data)493 jsimd_fdct_float (FAST_FLOAT * data)
494 {
495 }
496
497 GLOBAL(int)
jsimd_can_quantize(void)498 jsimd_can_quantize (void)
499 {
500 init_simd();
501
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;
514 }
515
516 GLOBAL(int)
jsimd_can_quantize_float(void)517 jsimd_can_quantize_float (void)
518 {
519 init_simd();
520
521 return 0;
522 }
523
524 GLOBAL(void)
jsimd_quantize(JCOEFPTR coef_block,DCTELEM * divisors,DCTELEM * workspace)525 jsimd_quantize (JCOEFPTR coef_block, DCTELEM * divisors,
526 DCTELEM * workspace)
527 {
528 if (simd_support & JSIMD_ARM_NEON)
529 jsimd_quantize_neon(coef_block, divisors, workspace);
530 }
531
532 GLOBAL(void)
jsimd_quantize_float(JCOEFPTR coef_block,FAST_FLOAT * divisors,FAST_FLOAT * workspace)533 jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT * divisors,
534 FAST_FLOAT * workspace)
535 {
536 }
537
538 GLOBAL(int)
jsimd_can_idct_2x2(void)539 jsimd_can_idct_2x2 (void)
540 {
541 init_simd();
542
543 /* The code is optimised for these values only */
544 if (DCTSIZE != 8)
545 return 0;
546 if (sizeof(JCOEF) != 2)
547 return 0;
548 if (BITS_IN_JSAMPLE != 8)
549 return 0;
550 if (sizeof(JDIMENSION) != 4)
551 return 0;
552 if (sizeof(ISLOW_MULT_TYPE) != 2)
553 return 0;
554
555 if ((simd_support & JSIMD_ARM_NEON))
556 return 1;
557
558 return 0;
559 }
560
561 GLOBAL(int)
jsimd_can_idct_4x4(void)562 jsimd_can_idct_4x4 (void)
563 {
564 init_simd();
565
566 /* The code is optimised for these values only */
567 if (DCTSIZE != 8)
568 return 0;
569 if (sizeof(JCOEF) != 2)
570 return 0;
571 if (BITS_IN_JSAMPLE != 8)
572 return 0;
573 if (sizeof(JDIMENSION) != 4)
574 return 0;
575 if (sizeof(ISLOW_MULT_TYPE) != 2)
576 return 0;
577
578 if ((simd_support & JSIMD_ARM_NEON))
579 return 1;
580
581 return 0;
582 }
583
584 GLOBAL(void)
jsimd_idct_2x2(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)585 jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
586 JCOEFPTR coef_block, JSAMPARRAY output_buf,
587 JDIMENSION output_col)
588 {
589 if ((simd_support & JSIMD_ARM_NEON))
590 jsimd_idct_2x2_neon(compptr->dct_table, coef_block, output_buf, output_col);
591 }
592
593 GLOBAL(void)
jsimd_idct_4x4(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)594 jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
595 JCOEFPTR coef_block, JSAMPARRAY output_buf,
596 JDIMENSION output_col)
597 {
598 if ((simd_support & JSIMD_ARM_NEON))
599 jsimd_idct_4x4_neon(compptr->dct_table, coef_block, output_buf, output_col);
600 }
601
602 GLOBAL(int)
jsimd_can_idct_islow(void)603 jsimd_can_idct_islow (void)
604 {
605 init_simd();
606
607 /* The code is optimised for these values only */
608 if (DCTSIZE != 8)
609 return 0;
610 if (sizeof(JCOEF) != 2)
611 return 0;
612 if (BITS_IN_JSAMPLE != 8)
613 return 0;
614 if (sizeof(JDIMENSION) != 4)
615 return 0;
616 if (sizeof(ISLOW_MULT_TYPE) != 2)
617 return 0;
618
619 if (simd_support & JSIMD_ARM_NEON)
620 return 1;
621
622 return 0;
623 }
624
625 GLOBAL(int)
jsimd_can_idct_ifast(void)626 jsimd_can_idct_ifast (void)
627 {
628 init_simd();
629
630 /* The code is optimised for these values only */
631 if (DCTSIZE != 8)
632 return 0;
633 if (sizeof(JCOEF) != 2)
634 return 0;
635 if (BITS_IN_JSAMPLE != 8)
636 return 0;
637 if (sizeof(JDIMENSION) != 4)
638 return 0;
639 if (sizeof(IFAST_MULT_TYPE) != 2)
640 return 0;
641 if (IFAST_SCALE_BITS != 2)
642 return 0;
643
644 if ((simd_support & JSIMD_ARM_NEON))
645 return 1;
646
647 return 0;
648 }
649
650 GLOBAL(int)
jsimd_can_idct_float(void)651 jsimd_can_idct_float (void)
652 {
653 init_simd();
654
655 return 0;
656 }
657
658 GLOBAL(void)
jsimd_idct_islow(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)659 jsimd_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
660 JCOEFPTR coef_block, JSAMPARRAY output_buf,
661 JDIMENSION output_col)
662 {
663 if ((simd_support & JSIMD_ARM_NEON))
664 jsimd_idct_islow_neon(compptr->dct_table, coef_block, output_buf, output_col);
665 }
666
667 GLOBAL(void)
jsimd_idct_ifast(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)668 jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
669 JCOEFPTR coef_block, JSAMPARRAY output_buf,
670 JDIMENSION output_col)
671 {
672 if ((simd_support & JSIMD_ARM_NEON))
673 jsimd_idct_ifast_neon(compptr->dct_table, coef_block, output_buf, output_col);
674 }
675
676 GLOBAL(void)
jsimd_idct_float(j_decompress_ptr cinfo,jpeg_component_info * compptr,JCOEFPTR coef_block,JSAMPARRAY output_buf,JDIMENSION output_col)677 jsimd_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
678 JCOEFPTR coef_block, JSAMPARRAY output_buf,
679 JDIMENSION output_col)
680 {
681 }
682
683