/* * jidctint.c * * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1998, Thomas G. Lane. * Modification developed 2002-2018 by Guido Vollbeding. * libjpeg-turbo Modifications: * Copyright (C) 2015, 2020, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * * This file contains a slower but more accurate integer implementation of the * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine * must also perform dequantization of the input coefficients. * * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT * on each row (or vice versa, but it's more convenient to emit a row at * a time). Direct algorithms are also available, but they are much more * complex and seem not to be any faster when reduced to code. * * This implementation is based on an algorithm described in * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. * The primary algorithm described there uses 11 multiplies and 29 adds. * We use their alternate method with 12 multiplies and 32 adds. * The advantage of this method is that no data path contains more than one * multiplication; this allows a very simple and accurate implementation in * scaled fixed-point arithmetic, with a minimal number of shifts. * * We also provide IDCT routines with various output sample block sizes for * direct resolution reduction or enlargement without additional resampling: * NxN (N=1...16) pixels for one 8x8 input DCT block. * * For N<8 we simply take the corresponding low-frequency coefficients of * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block * to yield the downscaled outputs. * This can be seen as direct low-pass downsampling from the DCT domain * point of view rather than the usual spatial domain point of view, * yielding significant computational savings and results at least * as good as common bilinear (averaging) spatial downsampling. * * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as * lower frequencies and higher frequencies assumed to be zero. * It turns out that the computational effort is similar to the 8x8 IDCT * regarding the output size. * Furthermore, the scaling and descaling is the same for all IDCT sizes. * * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases * since there would be too many additional constants to pre-calculate. */ #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" #include "jdct.h" /* Private declarations for DCT subsystem */ #ifdef DCT_ISLOW_SUPPORTED /* * This module is specialized to the case DCTSIZE = 8. */ #if DCTSIZE != 8 Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */ #endif /* * The poop on this scaling stuff is as follows: * * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) * larger than the true IDCT outputs. The final outputs are therefore * a factor of N larger than desired; since N=8 this can be cured by * a simple right shift at the end of the algorithm. The advantage of * this arrangement is that we save two multiplications per 1-D IDCT, * because the y0 and y4 inputs need not be divided by sqrt(N). * * We have to do addition and subtraction of the integer inputs, which * is no problem, and multiplication by fractional constants, which is * a problem to do in integer arithmetic. We multiply all the constants * by CONST_SCALE and convert them to integer constants (thus retaining * CONST_BITS bits of precision in the constants). After doing a * multiplication we have to divide the product by CONST_SCALE, with proper * rounding, to produce the correct output. This division can be done * cheaply as a right shift of CONST_BITS bits. We postpone shifting * as long as possible so that partial sums can be added together with * full fractional precision. * * The outputs of the first pass are scaled up by PASS1_BITS bits so that * they are represented to better-than-integral precision. These outputs * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word * with the recommended scaling. (To scale up 12-bit sample data further, an * intermediate JLONG array would be needed.) * * To avoid overflow of the 32-bit intermediate results in pass 2, we must * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis * shows that the values given below are the most effective. */ #if BITS_IN_JSAMPLE == 8 #define CONST_BITS … #define PASS1_BITS … #else #define CONST_BITS … #define PASS1_BITS … #endif /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus * causing a lot of useless floating-point operations at run time. * To get around this we use the following pre-calculated constants. * If you change CONST_BITS you may want to add appropriate values. * (With a reasonable C compiler, you can just rely on the FIX() macro...) */ #if CONST_BITS == 13 #define FIX_0_298631336 … #define FIX_0_390180644 … #define FIX_0_541196100 … #define FIX_0_765366865 … #define FIX_0_899976223 … #define FIX_1_175875602 … #define FIX_1_501321110 … #define FIX_1_847759065 … #define FIX_1_961570560 … #define FIX_2_053119869 … #define FIX_2_562915447 … #define FIX_3_072711026 … #else #define FIX_0_298631336 … #define FIX_0_390180644 … #define FIX_0_541196100 … #define FIX_0_765366865 … #define FIX_0_899976223 … #define FIX_1_175875602 … #define FIX_1_501321110 … #define FIX_1_847759065 … #define FIX_1_961570560 … #define FIX_2_053119869 … #define FIX_2_562915447 … #define FIX_3_072711026 … #endif /* Multiply an JLONG variable by an JLONG constant to yield an JLONG result. * For 8-bit samples with the recommended scaling, all the variable * and constant values involved are no more than 16 bits wide, so a * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. * For 12-bit samples, a full 32-bit multiplication will be needed. */ #if BITS_IN_JSAMPLE == 8 #define MULTIPLY(var, const) … #else #define MULTIPLY … #endif /* Dequantize a coefficient by multiplying it by the multiplier-table * entry; produce an int result. In this module, both inputs and result * are 16 bits or less, so either int or short multiply will work. */ #define DEQUANTIZE(coef, quantval) … /* * Perform dequantization and inverse DCT on one block of coefficients. */ GLOBAL(void) jpeg_idct_islow(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } #ifdef IDCT_SCALING_SUPPORTED /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a reduced-size 7x7 output block. * * Optimized algorithm with 12 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/14). */ GLOBAL(void) jpeg_idct_7x7(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a reduced-size 6x6 output block. * * Optimized algorithm with 3 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/12). */ GLOBAL(void) jpeg_idct_6x6(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a reduced-size 5x5 output block. * * Optimized algorithm with 5 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/10). */ GLOBAL(void) jpeg_idct_5x5(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a reduced-size 3x3 output block. * * Optimized algorithm with 2 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/6). */ GLOBAL(void) jpeg_idct_3x3(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a 9x9 output block. * * Optimized algorithm with 10 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/18). */ GLOBAL(void) jpeg_idct_9x9(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a 10x10 output block. * * Optimized algorithm with 12 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/20). */ GLOBAL(void) jpeg_idct_10x10(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing an 11x11 output block. * * Optimized algorithm with 24 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/22). */ GLOBAL(void) jpeg_idct_11x11(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a 12x12 output block. * * Optimized algorithm with 15 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/24). */ GLOBAL(void) jpeg_idct_12x12(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a 13x13 output block. * * Optimized algorithm with 29 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/26). */ GLOBAL(void) jpeg_idct_13x13(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a 14x14 output block. * * Optimized algorithm with 20 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/28). */ GLOBAL(void) jpeg_idct_14x14(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a 15x15 output block. * * Optimized algorithm with 22 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/30). */ GLOBAL(void) jpeg_idct_15x15(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } /* * Perform dequantization and inverse DCT on one block of coefficients, * producing a 16x16 output block. * * Optimized algorithm with 28 multiplications in the 1-D kernel. * cK represents sqrt(2) * cos(K*pi/32). */ GLOBAL(void) jpeg_idct_16x16(j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col) { … } #endif /* IDCT_SCALING_SUPPORTED */ #endif /* DCT_ISLOW_SUPPORTED */