170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jddctmgr.c 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1994-1996, Thomas G. Lane. 570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software. 670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file. 770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains the inverse-DCT management logic. 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This code selects a particular IDCT implementation to be used, 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and it performs related housekeeping chores. No code in this file 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * is executed per IDCT step, only during output pass setup. 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note that the IDCT routines are responsible for performing coefficient 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * dequantization as well as the IDCT proper. This module sets up the 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * dequantization multiplier table needed by the IDCT routine. 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h" 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h" 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jdct.h" /* Private declarations for DCT subsystem */ 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_ARMV6_IDCT 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #undef ANDROID_ARMV6_IDCT 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #ifdef __arm__ 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #include <machine/cpu-features.h> 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #if __ARM_ARCH__ >= 6 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #define ANDROID_ARMV6_IDCT 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #else 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #warning "ANDROID_ARMV6_IDCT is disabled" 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #endif 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine #endif 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_ARMV6_IDCT 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Intentionally declare the prototype with arguments of primitive types instead 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * of type-defined ones. This will at least generate some warnings if jmorecfg.h 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * is changed and becomes incompatible with the assembly code. 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineextern void armv6_idct(short *coefs, int *quans, unsigned char **rows, int col); 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinevoid jpeg_idct_armv6 (j_decompress_ptr cinfo, jpeg_component_info * compptr, 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JCOEFPTR coef_block, 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY output_buf, JDIMENSION output_col) 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine IFAST_MULT_TYPE *dct_table = (IFAST_MULT_TYPE *)compptr->dct_table; 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine armv6_idct(coef_block, dct_table, output_buf, output_col); 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The decompressor input side (jdinput.c) saves away the appropriate 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * quantization table for each component at the start of the first scan 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * involving that component. (This is necessary in order to correctly 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * decode files that reuse Q-table slots.) 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * When we are ready to make an output pass, the saved Q-table is converted 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to a multiplier table that will actually be used by the IDCT routine. 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The multiplier table contents are IDCT-method-dependent. To support 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * application changes in IDCT method between scans, we can remake the 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * multiplier tables if necessary. 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * In buffered-image mode, the first output pass may occur before any data 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * has been seen for some components, and thus before their Q-tables have 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * been saved away. To handle this case, multiplier tables are preset 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to zeroes; the result of the IDCT will be a neutral gray level. 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Private subobject for this module */ 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct { 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct jpeg_inverse_dct pub; /* public fields */ 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* This array contains the IDCT method code that each multiplier table 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * is currently set up for, or -1 if it's not yet set up. 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The actual multiplier tables are pointed to by dct_table in the 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * per-component comp_info structures. 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int cur_method[MAX_COMPONENTS]; 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} my_idct_controller; 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef my_idct_controller * my_idct_ptr; 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Allocated multiplier tables: big enough for any supported variant */ 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef union { 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ISLOW_MULT_TYPE islow_array[DCTSIZE2]; 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_IFAST_SUPPORTED 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine IFAST_MULT_TYPE ifast_array[DCTSIZE2]; 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_FLOAT_SUPPORTED 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FLOAT_MULT_TYPE float_array[DCTSIZE2]; 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} multiplier_table; 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* The current scaled-IDCT routines require ISLOW-style multiplier tables, 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * so be sure to compile that code if either ISLOW or SCALING is requested. 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_ISLOW_SUPPORTED 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define PROVIDE_ISLOW_TABLES 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef IDCT_SCALING_SUPPORTED 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define PROVIDE_ISLOW_TABLES 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Prepare for an output pass. 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Here we select the proper IDCT routine for each component and build 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * a matching multiplier table. 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_pass (j_decompress_ptr cinfo) 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_idct_ptr idct = (my_idct_ptr) cinfo->idct; 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci, i; 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int method = 0; 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inverse_DCT_method_ptr method_ptr = NULL; 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JQUANT_TBL * qtbl; 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ci++, compptr++) { 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Select the proper IDCT routine for this component's scaling */ 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (compptr->DCT_scaled_size) { 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef IDCT_SCALING_SUPPORTED 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 1: 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method_ptr = jpeg_idct_1x1; 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method = JDCT_ISLOW; /* jidctred uses islow-style table */ 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 2: 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method_ptr = jpeg_idct_2x2; 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method = JDCT_ISLOW; /* jidctred uses islow-style table */ 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 4: 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method_ptr = jpeg_idct_4x4; 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method = JDCT_ISLOW; /* jidctred uses islow-style table */ 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case DCTSIZE: 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (cinfo->dct_method) { 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_ARMV6_IDCT 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JDCT_ISLOW: 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JDCT_IFAST: 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method_ptr = jpeg_idct_armv6; 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method = JDCT_IFAST; 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else /* ANDROID_ARMV6_IDCT */ 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_ISLOW_SUPPORTED 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JDCT_ISLOW: 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method_ptr = jpeg_idct_islow; 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method = JDCT_ISLOW; 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_IFAST_SUPPORTED 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JDCT_IFAST: 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method_ptr = jpeg_idct_ifast; 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method = JDCT_IFAST; 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* ANDROID_ARMV6_IDCT */ 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_FLOAT_SUPPORTED 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JDCT_FLOAT: 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method_ptr = jpeg_idct_float; 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine method = JDCT_FLOAT; 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_NOT_COMPILED); 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size); 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine idct->pub.inverse_DCT[ci] = method_ptr; 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Create multiplier table from quant table. 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * However, we can skip this if the component is uninteresting 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * or if we already built the table. Also, if no quant table 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * has yet been saved for the component, we leave the 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * multiplier table all-zero; we'll be reading zeroes from the 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * coefficient controller's buffer anyway. 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! compptr->component_needed || idct->cur_method[ci] == method) 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine continue; 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine qtbl = compptr->quant_table; 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (qtbl == NULL) /* happens if no data yet for component */ 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine continue; 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine idct->cur_method[ci] = method; 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (method) { 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef PROVIDE_ISLOW_TABLES 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JDCT_ISLOW: 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* For LL&M IDCT method, multipliers are equal to raw quantization 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * coefficients, but are stored as ints to ensure access efficiency. 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table; 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < DCTSIZE2; i++) { 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i]; 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_IFAST_SUPPORTED 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JDCT_IFAST: 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* For AA&N IDCT method, multipliers are equal to quantization 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * coefficients scaled by scalefactor[row]*scalefactor[col], where 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * scalefactor[0] = 1 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For integer operation, the multiplier table is to be scaled by 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * IFAST_SCALE_BITS. 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table; 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_ARMV6_IDCT 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Precomputed values scaled up by 15 bits. */ 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const unsigned short scales[DCTSIZE2] = { 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32768, 45451, 42813, 38531, 32768, 25746, 17734, 9041, 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 45451, 63042, 59384, 53444, 45451, 35710, 24598, 12540, 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42813, 59384, 55938, 50343, 42813, 33638, 23170, 11812, 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 38531, 53444, 50343, 45308, 38531, 30274, 20853, 10631, 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32768, 45451, 42813, 38531, 32768, 25746, 17734, 9041, 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25746, 35710, 33638, 30274, 25746, 20228, 13933, 7103, 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17734, 24598, 23170, 20853, 17734, 13933, 9598, 4893, 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9041, 12540, 11812, 10631, 9041, 7103, 4893, 2494, 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine }; 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Inverse map of [7, 5, 1, 3, 0, 2, 4, 6]. */ 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const char orders[DCTSIZE] = {4, 2, 5, 3, 6, 1, 7, 0}; 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Reorder the columns after transposing. */ 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < DCTSIZE2; ++i) { 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int j = ((i & 7) << 3) + orders[i >> 3]; 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ifmtbl[j] = (qtbl->quantval[i] * scales[i] + 2) >> 2; 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else /* ANDROID_ARMV6_IDCT */ 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define CONST_BITS 14 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const INT16 aanscales[DCTSIZE2] = { 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* precomputed values scaled up by 14 bits */ 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine }; 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SHIFT_TEMPS 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < DCTSIZE2; i++) { 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ifmtbl[i] = (IFAST_MULT_TYPE) 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (INT32) aanscales[i]), 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine CONST_BITS-IFAST_SCALE_BITS); 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* ANDROID_ARMV6_IDCT */ 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_FLOAT_SUPPORTED 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case JDCT_FLOAT: 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine { 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* For float AA&N IDCT method, multipliers are equal to quantization 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * coefficients scaled by scalefactor[row]*scalefactor[col], where 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * scalefactor[0] = 1 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int row, col; 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine static const double aanscalefactor[DCTSIZE] = { 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1.0, 1.387039845, 1.306562965, 1.175875602, 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1.0, 0.785694958, 0.541196100, 0.275899379 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine }; 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine i = 0; 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (row = 0; row < DCTSIZE; row++) { 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = 0; col < DCTSIZE; col++) { 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fmtbl[i] = (FLOAT_MULT_TYPE) 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((double) qtbl->quantval[i] * 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine aanscalefactor[row] * aanscalefactor[col]); 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine i++; 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_NOT_COMPILED); 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize IDCT manager. 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void) 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_inverse_dct (j_decompress_ptr cinfo) 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine my_idct_ptr idct; 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci; 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_component_info *compptr; 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine idct = (my_idct_ptr) 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SIZEOF(my_idct_controller)); 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->idct = (struct jpeg_inverse_dct *) idct; 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine idct->pub.start_pass = start_pass; 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ci++, compptr++) { 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate and pre-zero a multiplier table for each component */ 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine compptr->dct_table = 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SIZEOF(multiplier_table)); 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MEMZERO(compptr->dct_table, SIZEOF(multiplier_table)); 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Mark multiplier table not yet set up for any method */ 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine idct->cur_method[ci] = -1; 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 329