aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Mok <kmok@cyngn.com>2016-02-08 13:49:49 -0800
committerKeith Mok <kmok@cyngn.com>2016-02-08 13:49:49 -0800
commitca613a2e18010365707d8d7b692ff74789038da6 (patch)
tree8c520659a2bd029ac9f07cd36a1ca8786be5835a
parent516cd8649d277676364a76fa9dfa26b32d9d3419 (diff)
downloadandroid_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.c19
-rw-r--r--jsimd_neon.c56
-rw-r--r--jsimd_neon.h38
3 files changed, 99 insertions, 14 deletions
diff --git a/jcsample.c b/jcsample.c
index 212ec87..dfb80c8 100644
--- a/jcsample.c
+++ b/jcsample.c
@@ -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);