From 365bc1ce1197914ef21af9673c7a5d06e40fc2a1 Mon Sep 17 00:00:00 2001 From: Kornel Date: Sat, 23 Dec 2017 01:29:16 +0000 Subject: [PATCH] Make IDCT method customizable --- jddctmgr.c | 14 ++++++++++++++ jdmaster.h | 5 +++++ jpeglib.h | 8 ++++++++ 3 files changed, 27 insertions(+) diff --git a/jddctmgr.c b/jddctmgr.c index 3a5ba7e8..a9f876f2 100644 --- a/jddctmgr.c +++ b/jddctmgr.c @@ -27,6 +27,7 @@ #include "jdct.h" /* Private declarations for DCT subsystem */ #include "jsimddct.h" #include "jpegcomp.h" +#include "jdmaster.h" /* @@ -86,6 +87,11 @@ typedef union { #endif #endif +EXTERN(void) jpeg_set_idct_method_selector (j_decompress_ptr cinfo, jpeg_idct_method_selector selector){ + my_master_ptr master = (my_master_ptr) cinfo->master; + master->custom_idct_selector = selector; +} + /* * Prepare for an output pass. @@ -225,6 +231,14 @@ start_pass (j_decompress_ptr cinfo) ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->_DCT_scaled_size); break; } + + // Allow custom idct function to be set dynamically + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (master->custom_idct_selector != NULL) { + master->custom_idct_selector(cinfo, compptr, &method_ptr, &method); + } + idct->pub.inverse_DCT[ci] = method_ptr; /* Create multiplier table from quant table. * However, we can skip this if the component is uninteresting diff --git a/jdmaster.h b/jdmaster.h index 76897e28..d08d1372 100644 --- a/jdmaster.h +++ b/jdmaster.h @@ -23,6 +23,11 @@ typedef struct { */ struct jpeg_color_quantizer *quantizer_1pass; struct jpeg_color_quantizer *quantizer_2pass; + + /* + * Permit users to replace the IDCT method + */ + jpeg_idct_method_selector custom_idct_selector; } my_decomp_master; typedef my_decomp_master *my_master_ptr; diff --git a/jpeglib.h b/jpeglib.h index 73a24e87..fac60fb4 100644 --- a/jpeglib.h +++ b/jpeglib.h @@ -514,6 +514,8 @@ struct jpeg_compress_struct { int script_space_size; }; +typedef void (*jpeg_idct_method) (j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col); +typedef void (*jpeg_idct_method_selector) (j_decompress_ptr cinfo, jpeg_component_info *compptr, jpeg_idct_method * set_idct_method, int * set_idct_category); /* Master record for a decompression instance */ @@ -1128,6 +1130,12 @@ EXTERN(void) jpeg_c_set_int_param (j_compress_ptr cinfo, J_INT_PARAM param, int value); EXTERN(int) jpeg_c_get_int_param (const j_compress_ptr cinfo, J_INT_PARAM param); +/* + * Permit users to replace the IDCT method dynamically. + * The selector callback is called after the default idct implementation was choosen, + * and is able to override it. + */ +EXTERN(void) jpeg_set_idct_method_selector (j_decompress_ptr cinfo, jpeg_idct_method_selector selector); /* These marker codes are exported since applications and data source modules * are likely to want to use them.