Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

jidctint.c File Reference

#include "jinclude.h"
#include "jpeglib.h"
#include "jdct.h"

Go to the source code of this file.


Defines

#define JPEG_INTERNALS
#define CONST_BITS   13
#define PASS1_BITS   2
#define FIX_0_298631336   ((INT32) 2446)
#define FIX_0_390180644   ((INT32) 3196)
#define FIX_0_541196100   ((INT32) 4433)
#define FIX_0_765366865   ((INT32) 6270)
#define FIX_0_899976223   ((INT32) 7373)
#define FIX_1_175875602   ((INT32) 9633)
#define FIX_1_501321110   ((INT32) 12299)
#define FIX_1_847759065   ((INT32) 15137)
#define FIX_1_961570560   ((INT32) 16069)
#define FIX_2_053119869   ((INT32) 16819)
#define FIX_2_562915447   ((INT32) 20995)
#define FIX_3_072711026   ((INT32) 25172)
#define MULTIPLY(var, const)   MULTIPLY16C16(var,const)
#define DEQUANTIZE(coef, quantval)   (((ISLOW_MULT_TYPE) (coef)) * (quantval))

Functions

 jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info *compptr, JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)

Define Documentation

#define CONST_BITS   13
 

Definition at line 78 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define DEQUANTIZE coef,
quantval       (((ISLOW_MULT_TYPE) (coef)) * (quantval))
 

Definition at line 140 of file jidctint.c.

#define FIX_0_298631336   ((INT32) 2446)
 

Definition at line 93 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_0_390180644   ((INT32) 3196)
 

Definition at line 94 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_0_541196100   ((INT32) 4433)
 

Definition at line 95 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_0_765366865   ((INT32) 6270)
 

Definition at line 96 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_0_899976223   ((INT32) 7373)
 

Definition at line 97 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_1_175875602   ((INT32) 9633)
 

Definition at line 98 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_1_501321110   ((INT32) 12299)
 

Definition at line 99 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_1_847759065   ((INT32) 15137)
 

Definition at line 100 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_1_961570560   ((INT32) 16069)
 

Definition at line 101 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_2_053119869   ((INT32) 16819)
 

Definition at line 102 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_2_562915447   ((INT32) 20995)
 

Definition at line 103 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define FIX_3_072711026   ((INT32) 25172)
 

Definition at line 104 of file jidctint.c.

Referenced by jpeg_idct_islow().

#define JPEG_INTERNALS
 

Definition at line 28 of file jidctint.c.

#define MULTIPLY var,
const       MULTIPLY16C16(var,const)
 

Definition at line 129 of file jidctint.c.

#define PASS1_BITS   2
 

Definition at line 79 of file jidctint.c.

Referenced by jpeg_idct_islow().


Function Documentation

jpeg_idct_islow j_decompress_ptr    cinfo,
jpeg_component_info   compptr,
JCOEFPTR    coef_block,
JSAMPARRAY    output_buf,
JDIMENSION    output_col
 

Definition at line 148 of file jidctint.c.

References coef_block, compptr, CONST_BITS, jpeg_component_info::dct_table, DEQUANTIZE, DESCALE, FIX_0_298631336, FIX_0_390180644, FIX_0_541196100, FIX_0_765366865, FIX_0_899976223, FIX_1_175875602, FIX_1_501321110, FIX_1_847759065, FIX_1_961570560, FIX_2_053119869, FIX_2_562915447, FIX_3_072711026, IDCT_range_limit, INT32, ISLOW_MULT_TYPE, JCOEFPTR, JDIMENSION, JSAMPARRAY, JSAMPLE, JSAMPROW, MULTIPLY, output_col, PASS1_BITS, RANGE_MASK, and z1.

Referenced by start_pass().

00151 {
00152   INT32 tmp0, tmp1, tmp2, tmp3;
00153   INT32 tmp10, tmp11, tmp12, tmp13;
00154   INT32 z1, z2, z3, z4, z5;
00155   JCOEFPTR inptr;
00156   ISLOW_MULT_TYPE * quantptr;
00157   int * wsptr;
00158   JSAMPROW outptr;
00159   JSAMPLE *range_limit = IDCT_range_limit(cinfo);
00160   int ctr;
00161   int workspace[DCTSIZE2];      /* buffers data between passes */
00162   SHIFT_TEMPS
00163 
00164   /* Pass 1: process columns from input, store into work array. */
00165   /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
00166   /* furthermore, we scale the results by 2**PASS1_BITS. */
00167 
00168   inptr = coef_block;
00169   quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
00170   wsptr = workspace;
00171   for (ctr = DCTSIZE; ctr > 0; ctr--) {
00172     /* Due to quantization, we will usually find that many of the input
00173      * coefficients are zero, especially the AC terms.  We can exploit this
00174      * by short-circuiting the IDCT calculation for any column in which all
00175      * the AC terms are zero.  In that case each output is equal to the
00176      * DC coefficient (with scale factor as needed).
00177      * With typical images and quantization tables, half or more of the
00178      * column DCT calculations can be simplified this way.
00179      */
00180     
00181     if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
00182         inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
00183         inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
00184         inptr[DCTSIZE*7] == 0) {
00185       /* AC terms all zero */
00186       int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
00187       
00188       wsptr[DCTSIZE*0] = dcval;
00189       wsptr[DCTSIZE*1] = dcval;
00190       wsptr[DCTSIZE*2] = dcval;
00191       wsptr[DCTSIZE*3] = dcval;
00192       wsptr[DCTSIZE*4] = dcval;
00193       wsptr[DCTSIZE*5] = dcval;
00194       wsptr[DCTSIZE*6] = dcval;
00195       wsptr[DCTSIZE*7] = dcval;
00196       
00197       inptr++;                  /* advance pointers to next column */
00198       quantptr++;
00199       wsptr++;
00200       continue;
00201     }
00202     
00203     /* Even part: reverse the even part of the forward DCT. */
00204     /* The rotator is sqrt(2)*c(-6). */
00205     
00206     z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
00207     z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
00208     
00209     z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
00210     tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
00211     tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
00212     
00213     z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
00214     z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
00215 
00216     tmp0 = (z2 + z3) << CONST_BITS;
00217     tmp1 = (z2 - z3) << CONST_BITS;
00218     
00219     tmp10 = tmp0 + tmp3;
00220     tmp13 = tmp0 - tmp3;
00221     tmp11 = tmp1 + tmp2;
00222     tmp12 = tmp1 - tmp2;
00223     
00224     /* Odd part per figure 8; the matrix is unitary and hence its
00225      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
00226      */
00227     
00228     tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
00229     tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
00230     tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
00231     tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
00232     
00233     z1 = tmp0 + tmp3;
00234     z2 = tmp1 + tmp2;
00235     z3 = tmp0 + tmp2;
00236     z4 = tmp1 + tmp3;
00237     z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
00238     
00239     tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
00240     tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
00241     tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
00242     tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
00243     z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
00244     z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
00245     z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
00246     z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
00247     
00248     z3 += z5;
00249     z4 += z5;
00250     
00251     tmp0 += z1 + z3;
00252     tmp1 += z2 + z4;
00253     tmp2 += z2 + z3;
00254     tmp3 += z1 + z4;
00255     
00256     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
00257     
00258     wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
00259     wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
00260     wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
00261     wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
00262     wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
00263     wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
00264     wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
00265     wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
00266     
00267     inptr++;                    /* advance pointers to next column */
00268     quantptr++;
00269     wsptr++;
00270   }
00271   
00272   /* Pass 2: process rows from work array, store into output array. */
00273   /* Note that we must descale the results by a factor of 8 == 2**3, */
00274   /* and also undo the PASS1_BITS scaling. */
00275 
00276   wsptr = workspace;
00277   for (ctr = 0; ctr < DCTSIZE; ctr++) {
00278     outptr = output_buf[ctr] + output_col;
00279     /* Rows of zeroes can be exploited in the same way as we did with columns.
00280      * However, the column calculation has created many nonzero AC terms, so
00281      * the simplification applies less often (typically 5% to 10% of the time).
00282      * On machines with very fast multiplication, it's possible that the
00283      * test takes more time than it's worth.  In that case this section
00284      * may be commented out.
00285      */
00286     
00287 #ifndef NO_ZERO_ROW_TEST
00288     if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
00289         wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
00290       /* AC terms all zero */
00291       JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
00292                                   & RANGE_MASK];
00293       
00294       outptr[0] = dcval;
00295       outptr[1] = dcval;
00296       outptr[2] = dcval;
00297       outptr[3] = dcval;
00298       outptr[4] = dcval;
00299       outptr[5] = dcval;
00300       outptr[6] = dcval;
00301       outptr[7] = dcval;
00302 
00303       wsptr += DCTSIZE;         /* advance pointer to next row */
00304       continue;
00305     }
00306 #endif
00307     
00308     /* Even part: reverse the even part of the forward DCT. */
00309     /* The rotator is sqrt(2)*c(-6). */
00310     
00311     z2 = (INT32) wsptr[2];
00312     z3 = (INT32) wsptr[6];
00313     
00314     z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
00315     tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
00316     tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
00317     
00318     tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
00319     tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
00320     
00321     tmp10 = tmp0 + tmp3;
00322     tmp13 = tmp0 - tmp3;
00323     tmp11 = tmp1 + tmp2;
00324     tmp12 = tmp1 - tmp2;
00325     
00326     /* Odd part per figure 8; the matrix is unitary and hence its
00327      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
00328      */
00329     
00330     tmp0 = (INT32) wsptr[7];
00331     tmp1 = (INT32) wsptr[5];
00332     tmp2 = (INT32) wsptr[3];
00333     tmp3 = (INT32) wsptr[1];
00334     
00335     z1 = tmp0 + tmp3;
00336     z2 = tmp1 + tmp2;
00337     z3 = tmp0 + tmp2;
00338     z4 = tmp1 + tmp3;
00339     z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
00340     
00341     tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
00342     tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
00343     tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
00344     tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
00345     z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
00346     z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
00347     z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
00348     z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
00349     
00350     z3 += z5;
00351     z4 += z5;
00352     
00353     tmp0 += z1 + z3;
00354     tmp1 += z2 + z4;
00355     tmp2 += z2 + z3;
00356     tmp3 += z1 + z4;
00357     
00358     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
00359     
00360     outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
00361                                           CONST_BITS+PASS1_BITS+3)
00362                             & RANGE_MASK];
00363     outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
00364                                           CONST_BITS+PASS1_BITS+3)
00365                             & RANGE_MASK];
00366     outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
00367                                           CONST_BITS+PASS1_BITS+3)
00368                             & RANGE_MASK];
00369     outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
00370                                           CONST_BITS+PASS1_BITS+3)
00371                             & RANGE_MASK];
00372     outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
00373                                           CONST_BITS+PASS1_BITS+3)
00374                             & RANGE_MASK];
00375     outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
00376                                           CONST_BITS+PASS1_BITS+3)
00377                             & RANGE_MASK];
00378     outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
00379                                           CONST_BITS+PASS1_BITS+3)
00380                             & RANGE_MASK];
00381     outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
00382                                           CONST_BITS+PASS1_BITS+3)
00383                             & RANGE_MASK];
00384     
00385     wsptr += DCTSIZE;           /* advance pointer to next row */
00386   }
00387 }
 

Powered by Plone

This site conforms to the following standards: