diff options
Diffstat (limited to 'libjpegtwrp/jidctvenum.c')
-rw-r--r-- | libjpegtwrp/jidctvenum.c | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/libjpegtwrp/jidctvenum.c b/libjpegtwrp/jidctvenum.c new file mode 100644 index 000000000..f458bb565 --- /dev/null +++ b/libjpegtwrp/jidctvenum.c @@ -0,0 +1,229 @@ +/* + * jidctvenum.c + * + * Copyright (c) 2010, Code Aurora Forum. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Code Aurora Forum, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef ANDROID_JPEG_USE_VENUM +/* + * This module is specialized to the case DCTSIZE = 8. + */ +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#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) ((coef) * ((INT16)quantval)) + +GLOBAL(void) +jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + ISLOW_MULT_TYPE * quantptr; + JCOEFPTR coefptr; + int ctr; + + /* idct_out temp buffer is needed because output_buf sample allocation is 8 bits, + * while IDCT output expects 16 bits. + */ + INT16 idct_out[DCTSIZE2]; /* buffers data between passes */ + JSAMPROW outptr; + INT16* idctptr; + + coefptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Dequantize the coeff buffer and write it back to the same location */ + for (ctr = DCTSIZE; ctr > 0; ctr--) { + coefptr[0] = DEQUANTIZE(coefptr[0] , quantptr[0] ); + coefptr[DCTSIZE*1] = DEQUANTIZE(coefptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + coefptr[DCTSIZE*2] = DEQUANTIZE(coefptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + coefptr[DCTSIZE*3] = DEQUANTIZE(coefptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + coefptr[DCTSIZE*4] = DEQUANTIZE(coefptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + coefptr[DCTSIZE*5] = DEQUANTIZE(coefptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + coefptr[DCTSIZE*6] = DEQUANTIZE(coefptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + coefptr[DCTSIZE*7] = DEQUANTIZE(coefptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + /* advance pointers to next column */ + quantptr++; + coefptr++; + } + + idct_8x8_venum((INT16*)coef_block, + (INT16*)idct_out, + DCTSIZE * sizeof(INT16)); + + idctptr = idct_out; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + // outptr sample size is 1 byte while idctptr sample size is 2 bytes + outptr[0] = idctptr[0]; + outptr[1] = idctptr[1]; + outptr[2] = idctptr[2]; + outptr[3] = idctptr[3]; + outptr[4] = idctptr[4]; + outptr[5] = idctptr[5]; + outptr[6] = idctptr[6]; + outptr[7] = idctptr[7]; + idctptr += DCTSIZE; /* advance pointers to next row */ + } +} + +GLOBAL(void) +jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + + /* Note: Must allocate 8x4 even though only 4x4 is used because + * IDCT function expects stride of 8. Stride input to function is ignored. + */ + INT16 idct_out[DCTSIZE * (DCTSIZE>>1)]; /* buffers data between passes */ + INT16* idctptr; + JCOEFPTR coefptr; + int ctr; + + coefptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Dequantize the coeff buffer and write it back to the same location */ + for (ctr = (DCTSIZE>>1); ctr > 0; ctr--) { + coefptr[0] = DEQUANTIZE(coefptr[0] , quantptr[0] ); + coefptr[DCTSIZE*1] = DEQUANTIZE(coefptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + coefptr[DCTSIZE*2] = DEQUANTIZE(coefptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + coefptr[DCTSIZE*3] = DEQUANTIZE(coefptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + + /* advance pointers to next column */ + quantptr++; + coefptr++; + } + + idct_4x4_venum((INT16*)coef_block, + (INT16*)idct_out, + DCTSIZE * sizeof(INT16)); + + idctptr = idct_out; + for (ctr = 0; ctr < (DCTSIZE>>1); ctr++) { + outptr = output_buf[ctr] + output_col; + + /* outptr sample size is 1 byte while idctptr sample size is 2 bytes */ + outptr[0] = idctptr[0]; + outptr[1] = idctptr[1]; + outptr[2] = idctptr[2]; + outptr[3] = idctptr[3]; + /* IDCT function assumes stride of 8 units */ + idctptr += (DCTSIZE); /* advance pointers to next row */ + } +} + +GLOBAL(void) +jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; + + /* Note: Must allocate 8x2 even though only 2x2 is used because + * IDCT function expects stride of 8. Stride input to function is ignored. + * There is also a hw limitation requiring input size to be 8x2. + */ + INT16 idct_out[DCTSIZE * (DCTSIZE>>2)]; /* buffers data between passes */ + INT16* idctptr; + JCOEFPTR coefptr; + int ctr; + + coefptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + + /* Dequantize the coeff buffer and write it back to the same location */ + for (ctr = (DCTSIZE>>2); ctr > 0; ctr--) { + coefptr[0] = DEQUANTIZE(coefptr[0] , quantptr[0] ); + coefptr[DCTSIZE*1] = DEQUANTIZE(coefptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + /* advance pointers to next column */ + quantptr++; + coefptr++; + } + + idct_2x2_venum((INT16*)coef_block, + (INT16*)idct_out, + DCTSIZE * sizeof(INT16)); + + idctptr = idct_out; + for (ctr = 0; ctr < (DCTSIZE>>2); ctr++) { + outptr = output_buf[ctr] + output_col; + + /* outptr sample size is 1 bytes, idctptr sample size is 2 bytes */ + outptr[0] = idctptr[0]; + outptr[1] = idctptr[1]; + + /* IDCT function assumes stride of 8 units */ + idctptr += (DCTSIZE); /* advance pointers to next row */ + } +} + + +GLOBAL(void) +jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + ISLOW_MULT_TYPE * quantptr; + JSAMPROW outptr; // 8-bit type + INT16 idct_out[DCTSIZE]; /* Required to allocate 8 samples, even though we only use one. */ + JCOEFPTR coefptr; + int ctr; + + coefptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + outptr = output_buf[0] + output_col; + + /* Dequantize the coeff buffer and write it back to the same location */ + coefptr[0] = DEQUANTIZE(coefptr[0], quantptr[0]); + + idct_1x1_venum((INT16*)coef_block, + (INT16*)idct_out, + DCTSIZE * sizeof(INT16)); + outptr[0] = idct_out[0]; +} + + +#endif /* ANDROID_JPEG_USE_VENUM */ |