| /* |
| * 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 */ |