diff options
author | Keith Mok <kmok@cyngn.com> | 2016-02-08 13:49:49 -0800 |
---|---|---|
committer | Keith Mok <kmok@cyngn.com> | 2016-02-08 13:49:49 -0800 |
commit | ca613a2e18010365707d8d7b692ff74789038da6 (patch) | |
tree | 8c520659a2bd029ac9f07cd36a1ca8786be5835a | |
parent | 516cd8649d277676364a76fa9dfa26b32d9d3419 (diff) | |
download | android_external_jpeg-ca613a2e18010365707d8d7b692ff74789038da6.tar.gz android_external_jpeg-ca613a2e18010365707d8d7b692ff74789038da6.tar.bz2 android_external_jpeg-ca613a2e18010365707d8d7b692ff74789038da6.zip |
Add arm64 downsampler accelerationstable/cm-13.0-ZNH2KBstable/cm-13.0-ZNH2K
Change-Id: I4c7a6c2ac989149af02d761f9cc36ab75ea60b04
-rw-r--r-- | jcsample.c | 19 | ||||
-rw-r--r-- | jsimd_neon.c | 56 | ||||
-rw-r--r-- | jsimd_neon.h | 38 |
3 files changed, 99 insertions, 14 deletions
@@ -49,6 +49,9 @@ #include "jinclude.h" #include "jpeglib.h" +#if defined(__aarch64__) +#include "jsimd_neon.h" +#endif /* Pointer to routine to downsample a single component */ typedef JMETHOD(void, downsample1_ptr, @@ -494,7 +497,12 @@ jinit_downsampler (j_compress_ptr cinfo) } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && compptr->v_samp_factor == cinfo->max_v_samp_factor) { smoothok = FALSE; - downsample->methods[ci] = h2v1_downsample; +#if defined(__aarch64__) + if (cap_neon_h2v1_downsample()) + downsample->methods[ci] = jsimd_h2v1_downsample; + else +#endif + downsample->methods[ci] = h2v1_downsample; } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) { #ifdef INPUT_SMOOTHING_SUPPORTED @@ -503,7 +511,14 @@ jinit_downsampler (j_compress_ptr cinfo) downsample->pub.need_context_rows = TRUE; } else #endif - downsample->methods[ci] = h2v2_downsample; + { +#if defined(__aarch64__) + if (cap_neon_h2v2_downsample()) + downsample->methods[ci] = jsimd_h2v2_downsample; + else +#endif + downsample->methods[ci] = h2v2_downsample; + } } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) { smoothok = FALSE; diff --git a/jsimd_neon.c b/jsimd_neon.c index ab3ecc6..7bbb632 100644 --- a/jsimd_neon.c +++ b/jsimd_neon.c @@ -66,6 +66,16 @@ EXTERN(void) jsimd_idct_4x4_neon JPP((void * dct_table, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jsimd_h2v2_downsample_neon + (JDIMENSION image_width, int max_v_samp_factor, + JDIMENSION v_samp_factor, JDIMENSION width_blocks, + JSAMPARRAY input_data, JSAMPARRAY output_data); + +EXTERN(void) jsimd_h2v1_downsample_neon + (JDIMENSION image_width, int max_v_samp_factor, + JDIMENSION v_samp_factor, JDIMENSION width_blocks, + JSAMPARRAY input_data, JSAMPARRAY output_data); + #ifdef __aarch64__ HIDDEN(void) jsimd_ycc_rgb_convert (j_decompress_ptr cinfo, @@ -181,6 +191,52 @@ cap_neon_idct_islow(void) return 1; } + +HIDDEN(int) +cap_neon_h2v2_downsample (void) +{ + /* The code is optimised for these values only */ + if (BITS_IN_JSAMPLE != 8) + return 0; + if (DCTSIZE != 8) + return 0; + if (sizeof(JDIMENSION) != 4) + return 0; + + return 1; +} + +HIDDEN(int) +cap_neon_h2v1_downsample (void) +{ + /* The code is optimised for these values only */ + if (BITS_IN_JSAMPLE != 8) + return 0; + if (DCTSIZE != 8) + return 0; + if (sizeof(JDIMENSION) != 4) + return 0; + + return 1; +} + +HIDDEN(void) +jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + jsimd_h2v2_downsample_neon(cinfo->image_width, cinfo->max_v_samp_factor, + compptr->v_samp_factor, compptr->width_in_blocks, + input_data, output_data); +} + +HIDDEN(void) +jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + jsimd_h2v1_downsample_neon(cinfo->image_width, cinfo->max_v_samp_factor, + compptr->v_samp_factor, compptr->width_in_blocks, + input_data, output_data); +} #endif HIDDEN(int) diff --git a/jsimd_neon.h b/jsimd_neon.h index e001335..acd8e26 100644 --- a/jsimd_neon.h +++ b/jsimd_neon.h @@ -36,52 +36,66 @@ #error "ANDROID_ARMV6_IDCT and (NV_ARM_NEON or __arch64) are muturaly exclusive modes, both have been defined" #endif -GLOBAL(void) +HIDDEN(void) jsimd_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col); -GLOBAL(void) +HIDDEN(void) jsimd_idct_islow(j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col); -GLOBAL(void) +HIDDEN(void) jsimd_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col); -GLOBAL(void) +HIDDEN(void) jsimd_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col); -GLOBAL(int) +HIDDEN(void) +jsimd_h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data); + +HIDDEN(void) +jsimd_h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data); + +HIDDEN(int) cap_neon_idct_2x2 (void); -GLOBAL(int) +HIDDEN(int) cap_neon_idct_4x4 (void); -GLOBAL(int) +HIDDEN(int) cap_neon_idct_islow (void); -GLOBAL(int) +HIDDEN(int) cap_neon_idct_ifast (void); -GLOBAL(int) +HIDDEN(int) cap_neon_ycc_rgb (void); -GLOBAL(void) +HIDDEN(int) +cap_neon_h2v1_downsample(void); + +HIDDEN(int) +cap_neon_h2v2_downsample(void); + +HIDDEN(void) jsimd_ycc_rgb565_convert (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION input_row, JSAMPARRAY output_buf, int num_rows); -GLOBAL(void) +HIDDEN(void) jsimd_ycc_rgb_convert (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION input_row, JSAMPARRAY output_buf, int num_rows); -GLOBAL(void) +HIDDEN(void) jsimd_ycc_rgba8888_convert (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, JDIMENSION input_row, JSAMPARRAY output_buf, int num_rows); |