| OLD | NEW |
| 1 /* | 1 /* |
| 2 * jsimd_arm.c | 2 * jsimd_arm.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, 2013-2014D. R. Commander | 5 * Copyright 2009-2011, 2013-2014, 2016 D. R. Commander |
| 6 * Copyright 2015-2016 Matthieu Darbois |
| 6 * | 7 * |
| 7 * Based on the x86 SIMD extension for IJG JPEG library, | 8 * Based on the x86 SIMD extension for IJG JPEG library, |
| 8 * Copyright (C) 1999-2006, MIYASAKA Masaru. | 9 * Copyright (C) 1999-2006, MIYASAKA Masaru. |
| 9 * For conditions of distribution and use, see copyright notice in jsimdext.inc | 10 * For conditions of distribution and use, see copyright notice in jsimdext.inc |
| 10 * | 11 * |
| 11 * This file contains the interface between the "normal" portions | 12 * This file contains the interface between the "normal" portions |
| 12 * of the library and the SIMD implementations when running on | 13 * of the library and the SIMD implementations when running on a |
| 13 * ARM architecture. | 14 * 32-bit ARM architecture. |
| 14 * | |
| 15 * Based on the stubs from 'jsimd_none.c' | |
| 16 */ | 15 */ |
| 17 | 16 |
| 18 #define JPEG_INTERNALS | 17 #define JPEG_INTERNALS |
| 19 #include "../jinclude.h" | 18 #include "../jinclude.h" |
| 20 #include "../jpeglib.h" | 19 #include "../jpeglib.h" |
| 21 #include "../jsimd.h" | 20 #include "../jsimd.h" |
| 22 #include "../jdct.h" | 21 #include "../jdct.h" |
| 23 #include "../jsimddct.h" | 22 #include "../jsimddct.h" |
| 24 #include "jsimd.h" | 23 #include "jsimd.h" |
| 25 | 24 |
| 26 #include <stdio.h> | 25 #include <stdio.h> |
| 27 #include <string.h> | 26 #include <string.h> |
| 28 #include <ctype.h> | 27 #include <ctype.h> |
| 29 | 28 |
| 30 static unsigned int simd_support = ~0; | 29 static unsigned int simd_support = ~0; |
| 30 static unsigned int simd_huffman = 1; |
| 31 | 31 |
| 32 #if !defined(__ARM_NEON__) && (defined(__linux__) || defined(ANDROID) || defined
(__ANDROID__)) | 32 #if !defined(__ARM_NEON__) && (defined(__linux__) || defined(ANDROID) || defined
(__ANDROID__)) |
| 33 | 33 |
| 34 #define SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT (1024 * 1024) | 34 #define SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT (1024 * 1024) |
| 35 | 35 |
| 36 LOCAL(int) | 36 LOCAL(int) |
| 37 check_feature (char *buffer, char *feature) | 37 check_feature (char *buffer, char *feature) |
| 38 { | 38 { |
| 39 char *p; | 39 char *p; |
| 40 if (*feature == 0) | 40 if (*feature == 0) |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 * -mcpu/-mfpu options passed to gcc by performing runtime detection via | 116 * -mcpu/-mfpu options passed to gcc by performing runtime detection via |
| 117 * /proc/cpuinfo parsing on linux/android */ | 117 * /proc/cpuinfo parsing on linux/android */ |
| 118 while (!parse_proc_cpuinfo(bufsize)) { | 118 while (!parse_proc_cpuinfo(bufsize)) { |
| 119 bufsize *= 2; | 119 bufsize *= 2; |
| 120 if (bufsize > SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT) | 120 if (bufsize > SOMEWHAT_SANE_PROC_CPUINFO_SIZE_LIMIT) |
| 121 break; | 121 break; |
| 122 } | 122 } |
| 123 #endif | 123 #endif |
| 124 | 124 |
| 125 /* Force different settings through environment variables */ | 125 /* Force different settings through environment variables */ |
| 126 env = getenv("JSIMD_FORCE_ARM_NEON"); | 126 env = getenv("JSIMD_FORCENEON"); |
| 127 if ((env != NULL) && (strcmp(env, "1") == 0)) | 127 if ((env != NULL) && (strcmp(env, "1") == 0)) |
| 128 simd_support &= JSIMD_ARM_NEON; | 128 simd_support &= JSIMD_ARM_NEON; |
| 129 env = getenv("JSIMD_FORCE_NO_SIMD"); | 129 env = getenv("JSIMD_FORCENONE"); |
| 130 if ((env != NULL) && (strcmp(env, "1") == 0)) | 130 if ((env != NULL) && (strcmp(env, "1") == 0)) |
| 131 simd_support = 0; | 131 simd_support = 0; |
| 132 env = getenv("JSIMD_NOHUFFENC"); |
| 133 if ((env != NULL) && (strcmp(env, "1") == 0)) |
| 134 simd_huffman = 0; |
| 132 } | 135 } |
| 133 | 136 |
| 134 GLOBAL(int) | 137 GLOBAL(int) |
| 135 jsimd_can_rgb_ycc (void) | 138 jsimd_can_rgb_ycc (void) |
| 136 { | 139 { |
| 137 init_simd(); | 140 init_simd(); |
| 138 | 141 |
| 139 /* The code is optimised for these values only */ | 142 /* The code is optimised for these values only */ |
| 140 if (BITS_IN_JSAMPLE != 8) | 143 if (BITS_IN_JSAMPLE != 8) |
| 141 return 0; | 144 return 0; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 163 { | 166 { |
| 164 init_simd(); | 167 init_simd(); |
| 165 | 168 |
| 166 /* The code is optimised for these values only */ | 169 /* The code is optimised for these values only */ |
| 167 if (BITS_IN_JSAMPLE != 8) | 170 if (BITS_IN_JSAMPLE != 8) |
| 168 return 0; | 171 return 0; |
| 169 if (sizeof(JDIMENSION) != 4) | 172 if (sizeof(JDIMENSION) != 4) |
| 170 return 0; | 173 return 0; |
| 171 if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4)) | 174 if ((RGB_PIXELSIZE != 3) && (RGB_PIXELSIZE != 4)) |
| 172 return 0; | 175 return 0; |
| 176 |
| 173 if (simd_support & JSIMD_ARM_NEON) | 177 if (simd_support & JSIMD_ARM_NEON) |
| 174 return 1; | 178 return 1; |
| 175 | 179 |
| 176 return 0; | 180 return 0; |
| 177 } | 181 } |
| 178 | 182 |
| 179 GLOBAL(int) | 183 GLOBAL(int) |
| 180 jsimd_can_ycc_rgb565 (void) | 184 jsimd_can_ycc_rgb565 (void) |
| 181 { | 185 { |
| 182 init_simd(); | 186 init_simd(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 193 return 0; | 197 return 0; |
| 194 } | 198 } |
| 195 | 199 |
| 196 GLOBAL(void) | 200 GLOBAL(void) |
| 197 jsimd_rgb_ycc_convert (j_compress_ptr cinfo, | 201 jsimd_rgb_ycc_convert (j_compress_ptr cinfo, |
| 198 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, | 202 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, |
| 199 JDIMENSION output_row, int num_rows) | 203 JDIMENSION output_row, int num_rows) |
| 200 { | 204 { |
| 201 void (*neonfct)(JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int); | 205 void (*neonfct)(JDIMENSION, JSAMPARRAY, JSAMPIMAGE, JDIMENSION, int); |
| 202 | 206 |
| 203 switch(cinfo->in_color_space) | 207 switch(cinfo->in_color_space) { |
| 204 { | |
| 205 case JCS_EXT_RGB: | 208 case JCS_EXT_RGB: |
| 206 neonfct=jsimd_extrgb_ycc_convert_neon; | 209 neonfct=jsimd_extrgb_ycc_convert_neon; |
| 207 break; | 210 break; |
| 208 case JCS_EXT_RGBX: | 211 case JCS_EXT_RGBX: |
| 209 case JCS_EXT_RGBA: | 212 case JCS_EXT_RGBA: |
| 210 neonfct=jsimd_extrgbx_ycc_convert_neon; | 213 neonfct=jsimd_extrgbx_ycc_convert_neon; |
| 211 break; | 214 break; |
| 212 case JCS_EXT_BGR: | 215 case JCS_EXT_BGR: |
| 213 neonfct=jsimd_extbgr_ycc_convert_neon; | 216 neonfct=jsimd_extbgr_ycc_convert_neon; |
| 214 break; | 217 break; |
| 215 case JCS_EXT_BGRX: | 218 case JCS_EXT_BGRX: |
| 216 case JCS_EXT_BGRA: | 219 case JCS_EXT_BGRA: |
| 217 neonfct=jsimd_extbgrx_ycc_convert_neon; | 220 neonfct=jsimd_extbgrx_ycc_convert_neon; |
| 218 break; | 221 break; |
| 219 case JCS_EXT_XBGR: | 222 case JCS_EXT_XBGR: |
| 220 case JCS_EXT_ABGR: | 223 case JCS_EXT_ABGR: |
| 221 neonfct=jsimd_extxbgr_ycc_convert_neon; | 224 neonfct=jsimd_extxbgr_ycc_convert_neon; |
| 222 break; | 225 break; |
| 223 case JCS_EXT_XRGB: | 226 case JCS_EXT_XRGB: |
| 224 case JCS_EXT_ARGB: | 227 case JCS_EXT_ARGB: |
| 225 neonfct=jsimd_extxrgb_ycc_convert_neon; | 228 neonfct=jsimd_extxrgb_ycc_convert_neon; |
| 226 break; | 229 break; |
| 227 default: | 230 default: |
| 228 neonfct=jsimd_extrgb_ycc_convert_neon; | 231 neonfct=jsimd_extrgb_ycc_convert_neon; |
| 229 break; | 232 break; |
| 230 } | 233 } |
| 231 | 234 |
| 232 if (simd_support & JSIMD_ARM_NEON) | 235 neonfct(cinfo->image_width, input_buf, output_buf, output_row, num_rows); |
| 233 neonfct(cinfo->image_width, input_buf, | |
| 234 output_buf, output_row, num_rows); | |
| 235 } | 236 } |
| 236 | 237 |
| 237 GLOBAL(void) | 238 GLOBAL(void) |
| 238 jsimd_rgb_gray_convert (j_compress_ptr cinfo, | 239 jsimd_rgb_gray_convert (j_compress_ptr cinfo, |
| 239 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, | 240 JSAMPARRAY input_buf, JSAMPIMAGE output_buf, |
| 240 JDIMENSION output_row, int num_rows) | 241 JDIMENSION output_row, int num_rows) |
| 241 { | 242 { |
| 242 } | 243 } |
| 243 | 244 |
| 244 GLOBAL(void) | 245 GLOBAL(void) |
| 245 jsimd_ycc_rgb_convert (j_decompress_ptr cinfo, | 246 jsimd_ycc_rgb_convert (j_decompress_ptr cinfo, |
| 246 JSAMPIMAGE input_buf, JDIMENSION input_row, | 247 JSAMPIMAGE input_buf, JDIMENSION input_row, |
| 247 JSAMPARRAY output_buf, int num_rows) | 248 JSAMPARRAY output_buf, int num_rows) |
| 248 { | 249 { |
| 249 void (*neonfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int); | 250 void (*neonfct)(JDIMENSION, JSAMPIMAGE, JDIMENSION, JSAMPARRAY, int); |
| 250 | 251 |
| 251 switch(cinfo->out_color_space) | 252 switch(cinfo->out_color_space) { |
| 252 { | |
| 253 case JCS_EXT_RGB: | 253 case JCS_EXT_RGB: |
| 254 neonfct=jsimd_ycc_extrgb_convert_neon; | 254 neonfct=jsimd_ycc_extrgb_convert_neon; |
| 255 break; | 255 break; |
| 256 case JCS_EXT_RGBX: | 256 case JCS_EXT_RGBX: |
| 257 case JCS_EXT_RGBA: | 257 case JCS_EXT_RGBA: |
| 258 neonfct=jsimd_ycc_extrgbx_convert_neon; | 258 neonfct=jsimd_ycc_extrgbx_convert_neon; |
| 259 break; | 259 break; |
| 260 case JCS_EXT_BGR: | 260 case JCS_EXT_BGR: |
| 261 neonfct=jsimd_ycc_extbgr_convert_neon; | 261 neonfct=jsimd_ycc_extbgr_convert_neon; |
| 262 break; | 262 break; |
| 263 case JCS_EXT_BGRX: | 263 case JCS_EXT_BGRX: |
| 264 case JCS_EXT_BGRA: | 264 case JCS_EXT_BGRA: |
| 265 neonfct=jsimd_ycc_extbgrx_convert_neon; | 265 neonfct=jsimd_ycc_extbgrx_convert_neon; |
| 266 break; | 266 break; |
| 267 case JCS_EXT_XBGR: | 267 case JCS_EXT_XBGR: |
| 268 case JCS_EXT_ABGR: | 268 case JCS_EXT_ABGR: |
| 269 neonfct=jsimd_ycc_extxbgr_convert_neon; | 269 neonfct=jsimd_ycc_extxbgr_convert_neon; |
| 270 break; | 270 break; |
| 271 case JCS_EXT_XRGB: | 271 case JCS_EXT_XRGB: |
| 272 case JCS_EXT_ARGB: | 272 case JCS_EXT_ARGB: |
| 273 neonfct=jsimd_ycc_extxrgb_convert_neon; | 273 neonfct=jsimd_ycc_extxrgb_convert_neon; |
| 274 break; | 274 break; |
| 275 default: | 275 default: |
| 276 neonfct=jsimd_ycc_extrgb_convert_neon; | 276 neonfct=jsimd_ycc_extrgb_convert_neon; |
| 277 break; | 277 break; |
| 278 } | 278 } |
| 279 | 279 |
| 280 if (simd_support & JSIMD_ARM_NEON) | 280 neonfct(cinfo->output_width, input_buf, input_row, output_buf, num_rows); |
| 281 neonfct(cinfo->output_width, input_buf, | |
| 282 input_row, output_buf, num_rows); | |
| 283 } | 281 } |
| 284 | 282 |
| 285 GLOBAL(void) | 283 GLOBAL(void) |
| 286 jsimd_ycc_rgb565_convert (j_decompress_ptr cinfo, | 284 jsimd_ycc_rgb565_convert (j_decompress_ptr cinfo, |
| 287 JSAMPIMAGE input_buf, JDIMENSION input_row, | 285 JSAMPIMAGE input_buf, JDIMENSION input_row, |
| 288 JSAMPARRAY output_buf, int num_rows) | 286 JSAMPARRAY output_buf, int num_rows) |
| 289 { | 287 { |
| 290 if (simd_support & JSIMD_ARM_NEON) | 288 jsimd_ycc_rgb565_convert_neon(cinfo->output_width, input_buf, input_row, |
| 291 jsimd_ycc_rgb565_convert_neon(cinfo->output_width, input_buf, input_row, | 289 output_buf, num_rows); |
| 292 output_buf, num_rows); | |
| 293 } | 290 } |
| 294 | 291 |
| 295 GLOBAL(int) | 292 GLOBAL(int) |
| 296 jsimd_can_h2v2_downsample (void) | 293 jsimd_can_h2v2_downsample (void) |
| 297 { | 294 { |
| 298 init_simd(); | 295 init_simd(); |
| 299 | 296 |
| 300 return 0; | 297 return 0; |
| 301 } | 298 } |
| 302 | 299 |
| 303 GLOBAL(int) | 300 GLOBAL(int) |
| 304 jsimd_can_h2v1_downsample (void) | 301 jsimd_can_h2v1_downsample (void) |
| 305 { | 302 { |
| 306 init_simd(); | 303 init_simd(); |
| 307 | 304 |
| 308 return 0; | 305 return 0; |
| 309 } | 306 } |
| 310 | 307 |
| 311 GLOBAL(void) | 308 GLOBAL(void) |
| 312 jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, | 309 jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, |
| 313 JSAMPARRAY input_data, JSAMPARRAY output_data) | 310 JSAMPARRAY input_data, JSAMPARRAY output_data) |
| 314 { | 311 { |
| 315 } | 312 } |
| 316 | 313 |
| 317 GLOBAL(void) | 314 GLOBAL(void) |
| 318 jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, | 315 jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, |
| 319 JSAMPARRAY input_data, JSAMPARRAY output_data) | 316 JSAMPARRAY input_data, JSAMPARRAY output_data) |
| 320 { | 317 { |
| 321 } | 318 } |
| 322 | 319 |
| 323 GLOBAL(int) | 320 GLOBAL(int) |
| 324 jsimd_can_h2v2_upsample (void) | 321 jsimd_can_h2v2_upsample (void) |
| 325 { | 322 { |
| 326 init_simd(); | 323 init_simd(); |
| 327 | 324 |
| 328 return 0; | 325 return 0; |
| 329 } | 326 } |
| 330 | 327 |
| 331 GLOBAL(int) | 328 GLOBAL(int) |
| 332 jsimd_can_h2v1_upsample (void) | 329 jsimd_can_h2v1_upsample (void) |
| 333 { | 330 { |
| 334 init_simd(); | 331 init_simd(); |
| 335 | 332 |
| 336 return 0; | 333 return 0; |
| 337 } | 334 } |
| 338 | 335 |
| 339 GLOBAL(void) | 336 GLOBAL(void) |
| 340 jsimd_h2v2_upsample (j_decompress_ptr cinfo, | 337 jsimd_h2v2_upsample (j_decompress_ptr cinfo, |
| 341 jpeg_component_info * compptr, | 338 jpeg_component_info *compptr, |
| 342 JSAMPARRAY input_data, | 339 JSAMPARRAY input_data, |
| 343 JSAMPARRAY * output_data_ptr) | 340 JSAMPARRAY *output_data_ptr) |
| 344 { | 341 { |
| 345 } | 342 } |
| 346 | 343 |
| 347 GLOBAL(void) | 344 GLOBAL(void) |
| 348 jsimd_h2v1_upsample (j_decompress_ptr cinfo, | 345 jsimd_h2v1_upsample (j_decompress_ptr cinfo, |
| 349 jpeg_component_info * compptr, | 346 jpeg_component_info *compptr, |
| 350 JSAMPARRAY input_data, | 347 JSAMPARRAY input_data, |
| 351 JSAMPARRAY * output_data_ptr) | 348 JSAMPARRAY *output_data_ptr) |
| 352 { | 349 { |
| 353 } | 350 } |
| 354 | 351 |
| 355 GLOBAL(int) | 352 GLOBAL(int) |
| 356 jsimd_can_h2v2_fancy_upsample (void) | 353 jsimd_can_h2v2_fancy_upsample (void) |
| 357 { | 354 { |
| 358 init_simd(); | 355 init_simd(); |
| 359 | 356 |
| 360 return 0; | 357 return 0; |
| 361 } | 358 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 372 return 0; | 369 return 0; |
| 373 | 370 |
| 374 if (simd_support & JSIMD_ARM_NEON) | 371 if (simd_support & JSIMD_ARM_NEON) |
| 375 return 1; | 372 return 1; |
| 376 | 373 |
| 377 return 0; | 374 return 0; |
| 378 } | 375 } |
| 379 | 376 |
| 380 GLOBAL(void) | 377 GLOBAL(void) |
| 381 jsimd_h2v2_fancy_upsample (j_decompress_ptr cinfo, | 378 jsimd_h2v2_fancy_upsample (j_decompress_ptr cinfo, |
| 382 jpeg_component_info * compptr, | 379 jpeg_component_info *compptr, |
| 383 JSAMPARRAY input_data, | 380 JSAMPARRAY input_data, |
| 384 JSAMPARRAY * output_data_ptr) | 381 JSAMPARRAY *output_data_ptr) |
| 385 { | 382 { |
| 386 } | 383 } |
| 387 | 384 |
| 388 GLOBAL(void) | 385 GLOBAL(void) |
| 389 jsimd_h2v1_fancy_upsample (j_decompress_ptr cinfo, | 386 jsimd_h2v1_fancy_upsample (j_decompress_ptr cinfo, |
| 390 jpeg_component_info * compptr, | 387 jpeg_component_info *compptr, |
| 391 JSAMPARRAY input_data, | 388 JSAMPARRAY input_data, |
| 392 JSAMPARRAY * output_data_ptr) | 389 JSAMPARRAY *output_data_ptr) |
| 393 { | 390 { |
| 394 if (simd_support & JSIMD_ARM_NEON) | 391 jsimd_h2v1_fancy_upsample_neon(cinfo->max_v_samp_factor, |
| 395 jsimd_h2v1_fancy_upsample_neon(cinfo->max_v_samp_factor, | 392 compptr->downsampled_width, input_data, |
| 396 compptr->downsampled_width, input_data, output_data_ptr); | 393 output_data_ptr); |
| 397 } | 394 } |
| 398 | 395 |
| 399 GLOBAL(int) | 396 GLOBAL(int) |
| 400 jsimd_can_h2v2_merged_upsample (void) | 397 jsimd_can_h2v2_merged_upsample (void) |
| 401 { | 398 { |
| 402 init_simd(); | 399 init_simd(); |
| 403 | 400 |
| 404 return 0; | 401 return 0; |
| 405 } | 402 } |
| 406 | 403 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 GLOBAL(int) | 449 GLOBAL(int) |
| 453 jsimd_can_convsamp_float (void) | 450 jsimd_can_convsamp_float (void) |
| 454 { | 451 { |
| 455 init_simd(); | 452 init_simd(); |
| 456 | 453 |
| 457 return 0; | 454 return 0; |
| 458 } | 455 } |
| 459 | 456 |
| 460 GLOBAL(void) | 457 GLOBAL(void) |
| 461 jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col, | 458 jsimd_convsamp (JSAMPARRAY sample_data, JDIMENSION start_col, |
| 462 DCTELEM * workspace) | 459 DCTELEM *workspace) |
| 463 { | 460 { |
| 464 if (simd_support & JSIMD_ARM_NEON) | 461 jsimd_convsamp_neon(sample_data, start_col, workspace); |
| 465 jsimd_convsamp_neon(sample_data, start_col, workspace); | |
| 466 } | 462 } |
| 467 | 463 |
| 468 GLOBAL(void) | 464 GLOBAL(void) |
| 469 jsimd_convsamp_float (JSAMPARRAY sample_data, JDIMENSION start_col, | 465 jsimd_convsamp_float (JSAMPARRAY sample_data, JDIMENSION start_col, |
| 470 FAST_FLOAT * workspace) | 466 FAST_FLOAT *workspace) |
| 471 { | 467 { |
| 472 } | 468 } |
| 473 | 469 |
| 474 GLOBAL(int) | 470 GLOBAL(int) |
| 475 jsimd_can_fdct_islow (void) | 471 jsimd_can_fdct_islow (void) |
| 476 { | 472 { |
| 477 init_simd(); | 473 init_simd(); |
| 478 | 474 |
| 479 return 0; | 475 return 0; |
| 480 } | 476 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 498 | 494 |
| 499 GLOBAL(int) | 495 GLOBAL(int) |
| 500 jsimd_can_fdct_float (void) | 496 jsimd_can_fdct_float (void) |
| 501 { | 497 { |
| 502 init_simd(); | 498 init_simd(); |
| 503 | 499 |
| 504 return 0; | 500 return 0; |
| 505 } | 501 } |
| 506 | 502 |
| 507 GLOBAL(void) | 503 GLOBAL(void) |
| 508 jsimd_fdct_islow (DCTELEM * data) | 504 jsimd_fdct_islow (DCTELEM *data) |
| 509 { | 505 { |
| 510 } | 506 } |
| 511 | 507 |
| 512 GLOBAL(void) | 508 GLOBAL(void) |
| 513 jsimd_fdct_ifast (DCTELEM * data) | 509 jsimd_fdct_ifast (DCTELEM *data) |
| 514 { | 510 { |
| 515 if (simd_support & JSIMD_ARM_NEON) | 511 jsimd_fdct_ifast_neon(data); |
| 516 jsimd_fdct_ifast_neon(data); | |
| 517 } | 512 } |
| 518 | 513 |
| 519 GLOBAL(void) | 514 GLOBAL(void) |
| 520 jsimd_fdct_float (FAST_FLOAT * data) | 515 jsimd_fdct_float (FAST_FLOAT *data) |
| 521 { | 516 { |
| 522 } | 517 } |
| 523 | 518 |
| 524 GLOBAL(int) | 519 GLOBAL(int) |
| 525 jsimd_can_quantize (void) | 520 jsimd_can_quantize (void) |
| 526 { | 521 { |
| 527 init_simd(); | 522 init_simd(); |
| 528 | 523 |
| 529 /* The code is optimised for these values only */ | 524 /* The code is optimised for these values only */ |
| 530 if (DCTSIZE != 8) | 525 if (DCTSIZE != 8) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 542 | 537 |
| 543 GLOBAL(int) | 538 GLOBAL(int) |
| 544 jsimd_can_quantize_float (void) | 539 jsimd_can_quantize_float (void) |
| 545 { | 540 { |
| 546 init_simd(); | 541 init_simd(); |
| 547 | 542 |
| 548 return 0; | 543 return 0; |
| 549 } | 544 } |
| 550 | 545 |
| 551 GLOBAL(void) | 546 GLOBAL(void) |
| 552 jsimd_quantize (JCOEFPTR coef_block, DCTELEM * divisors, | 547 jsimd_quantize (JCOEFPTR coef_block, DCTELEM *divisors, |
| 553 DCTELEM * workspace) | 548 DCTELEM *workspace) |
| 554 { | 549 { |
| 555 if (simd_support & JSIMD_ARM_NEON) | 550 jsimd_quantize_neon(coef_block, divisors, workspace); |
| 556 jsimd_quantize_neon(coef_block, divisors, workspace); | |
| 557 } | 551 } |
| 558 | 552 |
| 559 GLOBAL(void) | 553 GLOBAL(void) |
| 560 jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT * divisors, | 554 jsimd_quantize_float (JCOEFPTR coef_block, FAST_FLOAT *divisors, |
| 561 FAST_FLOAT * workspace) | 555 FAST_FLOAT *workspace) |
| 562 { | 556 { |
| 563 } | 557 } |
| 564 | 558 |
| 565 GLOBAL(int) | 559 GLOBAL(int) |
| 566 jsimd_can_idct_2x2 (void) | 560 jsimd_can_idct_2x2 (void) |
| 567 { | 561 { |
| 568 init_simd(); | 562 init_simd(); |
| 569 | 563 |
| 570 /* The code is optimised for these values only */ | 564 /* The code is optimised for these values only */ |
| 571 if (DCTSIZE != 8) | 565 if (DCTSIZE != 8) |
| 572 return 0; | 566 return 0; |
| 573 if (sizeof(JCOEF) != 2) | 567 if (sizeof(JCOEF) != 2) |
| 574 return 0; | 568 return 0; |
| 575 if (BITS_IN_JSAMPLE != 8) | 569 if (BITS_IN_JSAMPLE != 8) |
| 576 return 0; | 570 return 0; |
| 577 if (sizeof(JDIMENSION) != 4) | 571 if (sizeof(JDIMENSION) != 4) |
| 578 return 0; | 572 return 0; |
| 579 if (sizeof(ISLOW_MULT_TYPE) != 2) | 573 if (sizeof(ISLOW_MULT_TYPE) != 2) |
| 580 return 0; | 574 return 0; |
| 581 | 575 |
| 582 if ((simd_support & JSIMD_ARM_NEON)) | 576 if (simd_support & JSIMD_ARM_NEON) |
| 583 return 1; | 577 return 1; |
| 584 | 578 |
| 585 return 0; | 579 return 0; |
| 586 } | 580 } |
| 587 | 581 |
| 588 GLOBAL(int) | 582 GLOBAL(int) |
| 589 jsimd_can_idct_4x4 (void) | 583 jsimd_can_idct_4x4 (void) |
| 590 { | 584 { |
| 591 init_simd(); | 585 init_simd(); |
| 592 | 586 |
| 593 /* The code is optimised for these values only */ | 587 /* The code is optimised for these values only */ |
| 594 if (DCTSIZE != 8) | 588 if (DCTSIZE != 8) |
| 595 return 0; | 589 return 0; |
| 596 if (sizeof(JCOEF) != 2) | 590 if (sizeof(JCOEF) != 2) |
| 597 return 0; | 591 return 0; |
| 598 if (BITS_IN_JSAMPLE != 8) | 592 if (BITS_IN_JSAMPLE != 8) |
| 599 return 0; | 593 return 0; |
| 600 if (sizeof(JDIMENSION) != 4) | 594 if (sizeof(JDIMENSION) != 4) |
| 601 return 0; | 595 return 0; |
| 602 if (sizeof(ISLOW_MULT_TYPE) != 2) | 596 if (sizeof(ISLOW_MULT_TYPE) != 2) |
| 603 return 0; | 597 return 0; |
| 604 | 598 |
| 605 if ((simd_support & JSIMD_ARM_NEON)) | 599 if (simd_support & JSIMD_ARM_NEON) |
| 606 return 1; | 600 return 1; |
| 607 | 601 |
| 608 return 0; | 602 return 0; |
| 609 } | 603 } |
| 610 | 604 |
| 611 GLOBAL(void) | 605 GLOBAL(void) |
| 612 jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 606 jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info *compptr, |
| 613 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 607 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
| 614 JDIMENSION output_col) | 608 JDIMENSION output_col) |
| 615 { | 609 { |
| 616 if ((simd_support & JSIMD_ARM_NEON)) | 610 jsimd_idct_2x2_neon(compptr->dct_table, coef_block, output_buf, |
| 617 jsimd_idct_2x2_neon(compptr->dct_table, coef_block, output_buf, output_col); | 611 output_col); |
| 618 } | 612 } |
| 619 | 613 |
| 620 GLOBAL(void) | 614 GLOBAL(void) |
| 621 jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 615 jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info *compptr, |
| 622 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 616 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
| 623 JDIMENSION output_col) | 617 JDIMENSION output_col) |
| 624 { | 618 { |
| 625 if ((simd_support & JSIMD_ARM_NEON)) | 619 jsimd_idct_4x4_neon(compptr->dct_table, coef_block, output_buf, |
| 626 jsimd_idct_4x4_neon(compptr->dct_table, coef_block, output_buf, output_col); | 620 output_col); |
| 627 } | 621 } |
| 628 | 622 |
| 629 GLOBAL(int) | 623 GLOBAL(int) |
| 630 jsimd_can_idct_islow (void) | 624 jsimd_can_idct_islow (void) |
| 631 { | 625 { |
| 632 init_simd(); | 626 init_simd(); |
| 633 | 627 |
| 634 /* The code is optimised for these values only */ | 628 /* The code is optimised for these values only */ |
| 635 if (DCTSIZE != 8) | 629 if (DCTSIZE != 8) |
| 636 return 0; | 630 return 0; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 661 return 0; | 655 return 0; |
| 662 if (BITS_IN_JSAMPLE != 8) | 656 if (BITS_IN_JSAMPLE != 8) |
| 663 return 0; | 657 return 0; |
| 664 if (sizeof(JDIMENSION) != 4) | 658 if (sizeof(JDIMENSION) != 4) |
| 665 return 0; | 659 return 0; |
| 666 if (sizeof(IFAST_MULT_TYPE) != 2) | 660 if (sizeof(IFAST_MULT_TYPE) != 2) |
| 667 return 0; | 661 return 0; |
| 668 if (IFAST_SCALE_BITS != 2) | 662 if (IFAST_SCALE_BITS != 2) |
| 669 return 0; | 663 return 0; |
| 670 | 664 |
| 671 if ((simd_support & JSIMD_ARM_NEON)) | 665 if (simd_support & JSIMD_ARM_NEON) |
| 672 return 1; | 666 return 1; |
| 673 | 667 |
| 674 return 0; | 668 return 0; |
| 675 } | 669 } |
| 676 | 670 |
| 677 GLOBAL(int) | 671 GLOBAL(int) |
| 678 jsimd_can_idct_float (void) | 672 jsimd_can_idct_float (void) |
| 679 { | 673 { |
| 680 init_simd(); | 674 init_simd(); |
| 681 | 675 |
| 682 return 0; | 676 return 0; |
| 683 } | 677 } |
| 684 | 678 |
| 685 GLOBAL(void) | 679 GLOBAL(void) |
| 686 jsimd_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 680 jsimd_idct_islow (j_decompress_ptr cinfo, jpeg_component_info *compptr, |
| 687 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 681 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
| 688 JDIMENSION output_col) | 682 JDIMENSION output_col) |
| 689 { | 683 { |
| 690 if ((simd_support & JSIMD_ARM_NEON)) | 684 jsimd_idct_islow_neon(compptr->dct_table, coef_block, output_buf, |
| 691 jsimd_idct_islow_neon(compptr->dct_table, coef_block, output_buf, output_col
); | 685 output_col); |
| 692 } | 686 } |
| 693 | 687 |
| 694 GLOBAL(void) | 688 GLOBAL(void) |
| 695 jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 689 jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info *compptr, |
| 696 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 690 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
| 697 JDIMENSION output_col) | 691 JDIMENSION output_col) |
| 698 { | 692 { |
| 699 if ((simd_support & JSIMD_ARM_NEON)) | 693 jsimd_idct_ifast_neon(compptr->dct_table, coef_block, output_buf, |
| 700 jsimd_idct_ifast_neon(compptr->dct_table, coef_block, output_buf, output_col
); | 694 output_col); |
| 701 } | 695 } |
| 702 | 696 |
| 703 GLOBAL(void) | 697 GLOBAL(void) |
| 704 jsimd_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, | 698 jsimd_idct_float (j_decompress_ptr cinfo, jpeg_component_info *compptr, |
| 705 JCOEFPTR coef_block, JSAMPARRAY output_buf, | 699 JCOEFPTR coef_block, JSAMPARRAY output_buf, |
| 706 JDIMENSION output_col) | 700 JDIMENSION output_col) |
| 707 { | 701 { |
| 708 } | 702 } |
| 709 | 703 |
| 704 GLOBAL(int) |
| 705 jsimd_can_huff_encode_one_block (void) |
| 706 { |
| 707 init_simd(); |
| 708 |
| 709 if (DCTSIZE != 8) |
| 710 return 0; |
| 711 if (sizeof(JCOEF) != 2) |
| 712 return 0; |
| 713 |
| 714 if (simd_support & JSIMD_ARM_NEON && simd_huffman) |
| 715 return 1; |
| 716 |
| 717 return 0; |
| 718 } |
| 719 |
| 720 GLOBAL(JOCTET*) |
| 721 jsimd_huff_encode_one_block (void *state, JOCTET *buffer, JCOEFPTR block, |
| 722 int last_dc_val, c_derived_tbl *dctbl, |
| 723 c_derived_tbl *actbl) |
| 724 { |
| 725 return jsimd_huff_encode_one_block_neon(state, buffer, block, last_dc_val, |
| 726 dctbl, actbl); |
| 727 } |
| OLD | NEW |