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