jrevdct.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:33k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * jrevdct.c
  3.  *
  4.  * Copyright (C) 1991, 1992, Thomas G. Lane.
  5.  * This file is part of the Independent JPEG Group's software.
  6.  * For conditions of distribution and use, see the accompanying README file.
  7.  *
  8.  * This file contains the basic inverse-DCT transformation subroutine.
  9.  *
  10.  * This implementation is based on an algorithm described in
  11.  *   C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
  12.  *   Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
  13.  *   Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
  14.  * The primary algorithm described there uses 11 multiplies and 29 adds.
  15.  * We use their alternate method with 12 multiplies and 32 adds.
  16.  * The advantage of this method is that no data path contains more than one
  17.  * multiplication; this allows a very simple and accurate implementation in
  18.  * scaled fixed-point arithmetic, with a minimal number of shifts.
  19.  * 
  20.  * I've made lots of modifications to attempt to take advantage of the
  21.  * sparse nature of the DCT matrices we're getting.  Although the logic
  22.  * is cumbersome, it's straightforward and the resulting code is much
  23.  * faster.
  24.  *
  25.  * A better way to do this would be to pass in the DCT block as a sparse
  26.  * matrix, perhaps with the difference cases encoded.
  27.  */
  28.  
  29. /**
  30.  * @file jrevdct.c
  31.  * Independent JPEG Group's LLM idct.
  32.  */
  33.  
  34. #include "common.h"
  35. #include "dsputil.h"
  36. #define EIGHT_BIT_SAMPLES
  37. #define DCTSIZE 8
  38. #define DCTSIZE2 64
  39. #define GLOBAL
  40. #define RIGHT_SHIFT(x, n) ((x) >> (n))
  41. typedef DCTELEM DCTBLOCK[DCTSIZE2];
  42. #define CONST_BITS 13
  43. /*
  44.  * This routine is specialized to the case DCTSIZE = 8.
  45.  */
  46. #if DCTSIZE != 8
  47.   Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
  48. #endif
  49. /*
  50.  * A 2-D IDCT can be done by 1-D IDCT on each row followed by 1-D IDCT
  51.  * on each column.  Direct algorithms are also available, but they are
  52.  * much more complex and seem not to be any faster when reduced to code.
  53.  *
  54.  * The poop on this scaling stuff is as follows:
  55.  *
  56.  * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
  57.  * larger than the true IDCT outputs.  The final outputs are therefore
  58.  * a factor of N larger than desired; since N=8 this can be cured by
  59.  * a simple right shift at the end of the algorithm.  The advantage of
  60.  * this arrangement is that we save two multiplications per 1-D IDCT,
  61.  * because the y0 and y4 inputs need not be divided by sqrt(N).
  62.  *
  63.  * We have to do addition and subtraction of the integer inputs, which
  64.  * is no problem, and multiplication by fractional constants, which is
  65.  * a problem to do in integer arithmetic.  We multiply all the constants
  66.  * by CONST_SCALE and convert them to integer constants (thus retaining
  67.  * CONST_BITS bits of precision in the constants).  After doing a
  68.  * multiplication we have to divide the product by CONST_SCALE, with proper
  69.  * rounding, to produce the correct output.  This division can be done
  70.  * cheaply as a right shift of CONST_BITS bits.  We postpone shifting
  71.  * as long as possible so that partial sums can be added together with
  72.  * full fractional precision.
  73.  *
  74.  * The outputs of the first pass are scaled up by PASS1_BITS bits so that
  75.  * they are represented to better-than-integral precision.  These outputs
  76.  * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
  77.  * with the recommended scaling.  (To scale up 12-bit sample data further, an
  78.  * intermediate int32 array would be needed.)
  79.  *
  80.  * To avoid overflow of the 32-bit intermediate results in pass 2, we must
  81.  * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26.  Error analysis
  82.  * shows that the values given below are the most effective.
  83.  */
  84. #ifdef EIGHT_BIT_SAMPLES
  85. #define PASS1_BITS  2
  86. #else
  87. #define PASS1_BITS  1 /* lose a little precision to avoid overflow */
  88. #endif
  89. #define ONE ((int32_t) 1)
  90. #define CONST_SCALE (ONE << CONST_BITS)
  91. /* Convert a positive real constant to an integer scaled by CONST_SCALE.
  92.  * IMPORTANT: if your compiler doesn't do this arithmetic at compile time,
  93.  * you will pay a significant penalty in run time.  In that case, figure
  94.  * the correct integer constant values and insert them by hand.
  95.  */
  96. /* Actually FIX is no longer used, we precomputed them all */
  97. #define FIX(x) ((int32_t) ((x) * CONST_SCALE + 0.5)) 
  98. /* Descale and correctly round an int32_t value that's scaled by N bits.
  99.  * We assume RIGHT_SHIFT rounds towards minus infinity, so adding
  100.  * the fudge factor is correct for either sign of X.
  101.  */
  102. #define DESCALE(x,n)  RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
  103. /* Multiply an int32_t variable by an int32_t constant to yield an int32_t result.
  104.  * For 8-bit samples with the recommended scaling, all the variable
  105.  * and constant values involved are no more than 16 bits wide, so a
  106.  * 16x16->32 bit multiply can be used instead of a full 32x32 multiply;
  107.  * this provides a useful speedup on many machines.
  108.  * There is no way to specify a 16x16->32 multiply in portable C, but
  109.  * some C compilers will do the right thing if you provide the correct
  110.  * combination of casts.
  111.  * NB: for 12-bit samples, a full 32-bit multiplication will be needed.
  112.  */
  113. #ifdef EIGHT_BIT_SAMPLES
  114. #ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */
  115. #define MULTIPLY(var,const)  (((int16_t) (var)) * ((int16_t) (const)))
  116. #endif
  117. #ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */
  118. #define MULTIPLY(var,const)  (((int16_t) (var)) * ((int32_t) (const)))
  119. #endif
  120. #endif
  121. #ifndef MULTIPLY /* default definition */
  122. #define MULTIPLY(var,const)  ((var) * (const))
  123. #endif
  124. /* 
  125.   Unlike our decoder where we approximate the FIXes, we need to use exact
  126. ones here or successive P-frames will drift too much with Reference frame coding 
  127. */
  128. #define FIX_0_211164243 1730
  129. #define FIX_0_275899380 2260
  130. #define FIX_0_298631336 2446
  131. #define FIX_0_390180644 3196
  132. #define FIX_0_509795579 4176
  133. #define FIX_0_541196100 4433
  134. #define FIX_0_601344887 4926
  135. #define FIX_0_765366865 6270
  136. #define FIX_0_785694958 6436
  137. #define FIX_0_899976223 7373
  138. #define FIX_1_061594337 8697
  139. #define FIX_1_111140466 9102
  140. #define FIX_1_175875602 9633
  141. #define FIX_1_306562965 10703
  142. #define FIX_1_387039845 11363
  143. #define FIX_1_451774981 11893
  144. #define FIX_1_501321110 12299
  145. #define FIX_1_662939225 13623
  146. #define FIX_1_847759065 15137
  147. #define FIX_1_961570560 16069
  148. #define FIX_2_053119869 16819
  149. #define FIX_2_172734803 17799
  150. #define FIX_2_562915447 20995
  151. #define FIX_3_072711026 25172
  152. /*
  153.  * Perform the inverse DCT on one block of coefficients.
  154.  */
  155. void j_rev_dct(DCTBLOCK data)
  156. {
  157.   int32_t tmp0, tmp1, tmp2, tmp3;
  158.   int32_t tmp10, tmp11, tmp12, tmp13;
  159.   int32_t z1, z2, z3, z4, z5;
  160.   int32_t d0, d1, d2, d3, d4, d5, d6, d7;
  161.   register DCTELEM *dataptr;
  162.   int rowctr;
  163.    
  164.   /* Pass 1: process rows. */
  165.   /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
  166.   /* furthermore, we scale the results by 2**PASS1_BITS. */
  167.   dataptr = data;
  168.   for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
  169.     /* Due to quantization, we will usually find that many of the input
  170.      * coefficients are zero, especially the AC terms.  We can exploit this
  171.      * by short-circuiting the IDCT calculation for any row in which all
  172.      * the AC terms are zero.  In that case each output is equal to the
  173.      * DC coefficient (with scale factor as needed).
  174.      * With typical images and quantization tables, half or more of the
  175.      * row DCT calculations can be simplified this way.
  176.      */
  177.     register int *idataptr = (int*)dataptr;
  178.     /* WARNING: we do the same permutation as MMX idct to simplify the
  179.        video core */
  180.     d0 = dataptr[0];
  181.     d2 = dataptr[1];
  182.     d4 = dataptr[2];
  183.     d6 = dataptr[3];
  184.     d1 = dataptr[4];
  185.     d3 = dataptr[5];
  186.     d5 = dataptr[6];
  187.     d7 = dataptr[7];
  188.     if ((d1 | d2 | d3 | d4 | d5 | d6 | d7) == 0) {
  189.       /* AC terms all zero */
  190.       if (d0) {
  191.   /* Compute a 32 bit value to assign. */
  192.   DCTELEM dcval = (DCTELEM) (d0 << PASS1_BITS);
  193.   register int v = (dcval & 0xffff) | ((dcval << 16) & 0xffff0000);
  194.   
  195.   idataptr[0] = v;
  196.   idataptr[1] = v;
  197.   idataptr[2] = v;
  198.   idataptr[3] = v;
  199.       }
  200.       
  201.       dataptr += DCTSIZE; /* advance pointer to next row */
  202.       continue;
  203.     }
  204.     /* Even part: reverse the even part of the forward DCT. */
  205.     /* The rotator is sqrt(2)*c(-6). */
  206. {
  207.     if (d6) {
  208.     if (d2) {
  209.     /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
  210.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  211.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  212.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  213.     tmp0 = (d0 + d4) << CONST_BITS;
  214.     tmp1 = (d0 - d4) << CONST_BITS;
  215.     tmp10 = tmp0 + tmp3;
  216.     tmp13 = tmp0 - tmp3;
  217.     tmp11 = tmp1 + tmp2;
  218.     tmp12 = tmp1 - tmp2;
  219.     } else {
  220.     /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
  221.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  222.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  223.     tmp0 = (d0 + d4) << CONST_BITS;
  224.     tmp1 = (d0 - d4) << CONST_BITS;
  225.     tmp10 = tmp0 + tmp3;
  226.     tmp13 = tmp0 - tmp3;
  227.     tmp11 = tmp1 + tmp2;
  228.     tmp12 = tmp1 - tmp2;
  229.     }
  230.     } else {
  231.     if (d2) {
  232.     /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
  233.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  234.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  235.     tmp0 = (d0 + d4) << CONST_BITS;
  236.     tmp1 = (d0 - d4) << CONST_BITS;
  237.     tmp10 = tmp0 + tmp3;
  238.     tmp13 = tmp0 - tmp3;
  239.     tmp11 = tmp1 + tmp2;
  240.     tmp12 = tmp1 - tmp2;
  241.     } else {
  242.     /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
  243.     tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
  244.     tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
  245.     }
  246.       }
  247.     /* Odd part per figure 8; the matrix is unitary and hence its
  248.      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
  249.      */
  250.     if (d7) {
  251. if (d5) {
  252.     if (d3) {
  253. if (d1) {
  254.     /* d1 != 0, d3 != 0, d5 != 0, d7 != 0 */
  255.     z1 = d7 + d1;
  256.     z2 = d5 + d3;
  257.     z3 = d7 + d3;
  258.     z4 = d5 + d1;
  259.     z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
  260.     
  261.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  262.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  263.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  264.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  265.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  266.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  267.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  268.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  269.     
  270.     z3 += z5;
  271.     z4 += z5;
  272.     
  273.     tmp0 += z1 + z3;
  274.     tmp1 += z2 + z4;
  275.     tmp2 += z2 + z3;
  276.     tmp3 += z1 + z4;
  277. } else {
  278.     /* d1 == 0, d3 != 0, d5 != 0, d7 != 0 */
  279.     z2 = d5 + d3;
  280.     z3 = d7 + d3;
  281.     z5 = MULTIPLY(z3 + d5, FIX_1_175875602);
  282.     
  283.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  284.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  285.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  286.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  287.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  288.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  289.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  290.     
  291.     z3 += z5;
  292.     z4 += z5;
  293.     
  294.     tmp0 += z1 + z3;
  295.     tmp1 += z2 + z4;
  296.     tmp2 += z2 + z3;
  297.     tmp3 = z1 + z4;
  298. }
  299.     } else {
  300. if (d1) {
  301.     /* d1 != 0, d3 == 0, d5 != 0, d7 != 0 */
  302.     z1 = d7 + d1;
  303.     z4 = d5 + d1;
  304.     z5 = MULTIPLY(d7 + z4, FIX_1_175875602);
  305.     
  306.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  307.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  308.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  309.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  310.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  311.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  312.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  313.     
  314.     z3 += z5;
  315.     z4 += z5;
  316.     
  317.     tmp0 += z1 + z3;
  318.     tmp1 += z2 + z4;
  319.     tmp2 = z2 + z3;
  320.     tmp3 += z1 + z4;
  321. } else {
  322.     /* d1 == 0, d3 == 0, d5 != 0, d7 != 0 */
  323.     tmp0 = MULTIPLY(-d7, FIX_0_601344887); 
  324.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  325.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  326.     tmp1 = MULTIPLY(-d5, FIX_0_509795579);
  327.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  328.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  329.     z5 = MULTIPLY(d5 + d7, FIX_1_175875602);
  330.     
  331.     z3 += z5;
  332.     z4 += z5;
  333.     
  334.     tmp0 += z3;
  335.     tmp1 += z4;
  336.     tmp2 = z2 + z3;
  337.     tmp3 = z1 + z4;
  338. }
  339.     }
  340. } else {
  341.     if (d3) {
  342. if (d1) {
  343.     /* d1 != 0, d3 != 0, d5 == 0, d7 != 0 */
  344.     z1 = d7 + d1;
  345.     z3 = d7 + d3;
  346.     z5 = MULTIPLY(z3 + d1, FIX_1_175875602);
  347.     
  348.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  349.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  350.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  351.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  352.     z2 = MULTIPLY(-d3, FIX_2_562915447);
  353.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  354.     z4 = MULTIPLY(-d1, FIX_0_390180644);
  355.     
  356.     z3 += z5;
  357.     z4 += z5;
  358.     
  359.     tmp0 += z1 + z3;
  360.     tmp1 = z2 + z4;
  361.     tmp2 += z2 + z3;
  362.     tmp3 += z1 + z4;
  363. } else {
  364.     /* d1 == 0, d3 != 0, d5 == 0, d7 != 0 */
  365.     z3 = d7 + d3;
  366.     
  367.     tmp0 = MULTIPLY(-d7, FIX_0_601344887); 
  368.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  369.     tmp2 = MULTIPLY(d3, FIX_0_509795579);
  370.     z2 = MULTIPLY(-d3, FIX_2_562915447);
  371.     z5 = MULTIPLY(z3, FIX_1_175875602);
  372.     z3 = MULTIPLY(-z3, FIX_0_785694958);
  373.     
  374.     tmp0 += z3;
  375.     tmp1 = z2 + z5;
  376.     tmp2 += z3;
  377.     tmp3 = z1 + z5;
  378. }
  379.     } else {
  380. if (d1) {
  381.     /* d1 != 0, d3 == 0, d5 == 0, d7 != 0 */
  382.     z1 = d7 + d1;
  383.     z5 = MULTIPLY(z1, FIX_1_175875602);
  384.     z1 = MULTIPLY(z1, FIX_0_275899380);
  385.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  386.     tmp0 = MULTIPLY(-d7, FIX_1_662939225); 
  387.     z4 = MULTIPLY(-d1, FIX_0_390180644);
  388.     tmp3 = MULTIPLY(d1, FIX_1_111140466);
  389.     tmp0 += z1;
  390.     tmp1 = z4 + z5;
  391.     tmp2 = z3 + z5;
  392.     tmp3 += z1;
  393. } else {
  394.     /* d1 == 0, d3 == 0, d5 == 0, d7 != 0 */
  395.     tmp0 = MULTIPLY(-d7, FIX_1_387039845);
  396.     tmp1 = MULTIPLY(d7, FIX_1_175875602);
  397.     tmp2 = MULTIPLY(-d7, FIX_0_785694958);
  398.     tmp3 = MULTIPLY(d7, FIX_0_275899380);
  399. }
  400.     }
  401. }
  402.     } else {
  403. if (d5) {
  404.     if (d3) {
  405. if (d1) {
  406.     /* d1 != 0, d3 != 0, d5 != 0, d7 == 0 */
  407.     z2 = d5 + d3;
  408.     z4 = d5 + d1;
  409.     z5 = MULTIPLY(d3 + z4, FIX_1_175875602);
  410.     
  411.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  412.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  413.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  414.     z1 = MULTIPLY(-d1, FIX_0_899976223);
  415.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  416.     z3 = MULTIPLY(-d3, FIX_1_961570560);
  417.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  418.     
  419.     z3 += z5;
  420.     z4 += z5;
  421.     
  422.     tmp0 = z1 + z3;
  423.     tmp1 += z2 + z4;
  424.     tmp2 += z2 + z3;
  425.     tmp3 += z1 + z4;
  426. } else {
  427.     /* d1 == 0, d3 != 0, d5 != 0, d7 == 0 */
  428.     z2 = d5 + d3;
  429.     
  430.     z5 = MULTIPLY(z2, FIX_1_175875602);
  431.     tmp1 = MULTIPLY(d5, FIX_1_662939225);
  432.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  433.     z2 = MULTIPLY(-z2, FIX_1_387039845);
  434.     tmp2 = MULTIPLY(d3, FIX_1_111140466);
  435.     z3 = MULTIPLY(-d3, FIX_1_961570560);
  436.     
  437.     tmp0 = z3 + z5;
  438.     tmp1 += z2;
  439.     tmp2 += z2;
  440.     tmp3 = z4 + z5;
  441. }
  442.     } else {
  443. if (d1) {
  444.     /* d1 != 0, d3 == 0, d5 != 0, d7 == 0 */
  445.     z4 = d5 + d1;
  446.     
  447.     z5 = MULTIPLY(z4, FIX_1_175875602);
  448.     z1 = MULTIPLY(-d1, FIX_0_899976223);
  449.     tmp3 = MULTIPLY(d1, FIX_0_601344887);
  450.     tmp1 = MULTIPLY(-d5, FIX_0_509795579);
  451.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  452.     z4 = MULTIPLY(z4, FIX_0_785694958);
  453.     
  454.     tmp0 = z1 + z5;
  455.     tmp1 += z4;
  456.     tmp2 = z2 + z5;
  457.     tmp3 += z4;
  458. } else {
  459.     /* d1 == 0, d3 == 0, d5 != 0, d7 == 0 */
  460.     tmp0 = MULTIPLY(d5, FIX_1_175875602);
  461.     tmp1 = MULTIPLY(d5, FIX_0_275899380);
  462.     tmp2 = MULTIPLY(-d5, FIX_1_387039845);
  463.     tmp3 = MULTIPLY(d5, FIX_0_785694958);
  464. }
  465.     }
  466. } else {
  467.     if (d3) {
  468. if (d1) {
  469.     /* d1 != 0, d3 != 0, d5 == 0, d7 == 0 */
  470.     z5 = d1 + d3;
  471.     tmp3 = MULTIPLY(d1, FIX_0_211164243);
  472.     tmp2 = MULTIPLY(-d3, FIX_1_451774981);
  473.     z1 = MULTIPLY(d1, FIX_1_061594337);
  474.     z2 = MULTIPLY(-d3, FIX_2_172734803);
  475.     z4 = MULTIPLY(z5, FIX_0_785694958);
  476.     z5 = MULTIPLY(z5, FIX_1_175875602);
  477.     
  478.     tmp0 = z1 - z4;
  479.     tmp1 = z2 + z4;
  480.     tmp2 += z5;
  481.     tmp3 += z5;
  482. } else {
  483.     /* d1 == 0, d3 != 0, d5 == 0, d7 == 0 */
  484.     tmp0 = MULTIPLY(-d3, FIX_0_785694958);
  485.     tmp1 = MULTIPLY(-d3, FIX_1_387039845);
  486.     tmp2 = MULTIPLY(-d3, FIX_0_275899380);
  487.     tmp3 = MULTIPLY(d3, FIX_1_175875602);
  488. }
  489.     } else {
  490. if (d1) {
  491.     /* d1 != 0, d3 == 0, d5 == 0, d7 == 0 */
  492.     tmp0 = MULTIPLY(d1, FIX_0_275899380);
  493.     tmp1 = MULTIPLY(d1, FIX_0_785694958);
  494.     tmp2 = MULTIPLY(d1, FIX_1_175875602);
  495.     tmp3 = MULTIPLY(d1, FIX_1_387039845);
  496. } else {
  497.     /* d1 == 0, d3 == 0, d5 == 0, d7 == 0 */
  498.     tmp0 = tmp1 = tmp2 = tmp3 = 0;
  499. }
  500.     }
  501. }
  502.     }
  503. }
  504.     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  505.     dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  506.     dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  507.     dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  508.     dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  509.     dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  510.     dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  511.     dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  512.     dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  513.     dataptr += DCTSIZE; /* advance pointer to next row */
  514.   }
  515.   /* Pass 2: process columns. */
  516.   /* Note that we must descale the results by a factor of 8 == 2**3, */
  517.   /* and also undo the PASS1_BITS scaling. */
  518.   dataptr = data;
  519.   for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
  520.     /* Columns of zeroes can be exploited in the same way as we did with rows.
  521.      * However, the row calculation has created many nonzero AC terms, so the
  522.      * simplification applies less often (typically 5% to 10% of the time).
  523.      * On machines with very fast multiplication, it's possible that the
  524.      * test takes more time than it's worth.  In that case this section
  525.      * may be commented out.
  526.      */
  527.     d0 = dataptr[DCTSIZE*0];
  528.     d1 = dataptr[DCTSIZE*1];
  529.     d2 = dataptr[DCTSIZE*2];
  530.     d3 = dataptr[DCTSIZE*3];
  531.     d4 = dataptr[DCTSIZE*4];
  532.     d5 = dataptr[DCTSIZE*5];
  533.     d6 = dataptr[DCTSIZE*6];
  534.     d7 = dataptr[DCTSIZE*7];
  535.     /* Even part: reverse the even part of the forward DCT. */
  536.     /* The rotator is sqrt(2)*c(-6). */
  537.     if (d6) {
  538.     if (d2) {
  539.     /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
  540.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  541.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  542.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  543.     tmp0 = (d0 + d4) << CONST_BITS;
  544.     tmp1 = (d0 - d4) << CONST_BITS;
  545.     tmp10 = tmp0 + tmp3;
  546.     tmp13 = tmp0 - tmp3;
  547.     tmp11 = tmp1 + tmp2;
  548.     tmp12 = tmp1 - tmp2;
  549.     } else {
  550.     /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
  551.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  552.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  553.     tmp0 = (d0 + d4) << CONST_BITS;
  554.     tmp1 = (d0 - d4) << CONST_BITS;
  555.     tmp10 = tmp0 + tmp3;
  556.     tmp13 = tmp0 - tmp3;
  557.     tmp11 = tmp1 + tmp2;
  558.     tmp12 = tmp1 - tmp2;
  559.     }
  560.     } else {
  561.     if (d2) {
  562.     /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
  563.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  564.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  565.     tmp0 = (d0 + d4) << CONST_BITS;
  566.     tmp1 = (d0 - d4) << CONST_BITS;
  567.     tmp10 = tmp0 + tmp3;
  568.     tmp13 = tmp0 - tmp3;
  569.     tmp11 = tmp1 + tmp2;
  570.     tmp12 = tmp1 - tmp2;
  571.     } else {
  572.     /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
  573.     tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
  574.     tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
  575.     }
  576.     }
  577.     /* Odd part per figure 8; the matrix is unitary and hence its
  578.      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
  579.      */
  580.     if (d7) {
  581. if (d5) {
  582.     if (d3) {
  583. if (d1) {
  584.     /* d1 != 0, d3 != 0, d5 != 0, d7 != 0 */
  585.     z1 = d7 + d1;
  586.     z2 = d5 + d3;
  587.     z3 = d7 + d3;
  588.     z4 = d5 + d1;
  589.     z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
  590.     
  591.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  592.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  593.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  594.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  595.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  596.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  597.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  598.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  599.     
  600.     z3 += z5;
  601.     z4 += z5;
  602.     
  603.     tmp0 += z1 + z3;
  604.     tmp1 += z2 + z4;
  605.     tmp2 += z2 + z3;
  606.     tmp3 += z1 + z4;
  607. } else {
  608.     /* d1 == 0, d3 != 0, d5 != 0, d7 != 0 */
  609.     z1 = d7;
  610.     z2 = d5 + d3;
  611.     z3 = d7 + d3;
  612.     z5 = MULTIPLY(z3 + d5, FIX_1_175875602);
  613.     
  614.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  615.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  616.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  617.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  618.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  619.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  620.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  621.     
  622.     z3 += z5;
  623.     z4 += z5;
  624.     
  625.     tmp0 += z1 + z3;
  626.     tmp1 += z2 + z4;
  627.     tmp2 += z2 + z3;
  628.     tmp3 = z1 + z4;
  629. }
  630.     } else {
  631. if (d1) {
  632.     /* d1 != 0, d3 == 0, d5 != 0, d7 != 0 */
  633.     z1 = d7 + d1;
  634.     z2 = d5;
  635.     z3 = d7;
  636.     z4 = d5 + d1;
  637.     z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
  638.     
  639.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  640.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  641.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  642.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  643.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  644.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  645.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  646.     
  647.     z3 += z5;
  648.     z4 += z5;
  649.     
  650.     tmp0 += z1 + z3;
  651.     tmp1 += z2 + z4;
  652.     tmp2 = z2 + z3;
  653.     tmp3 += z1 + z4;
  654. } else {
  655.     /* d1 == 0, d3 == 0, d5 != 0, d7 != 0 */
  656.     tmp0 = MULTIPLY(-d7, FIX_0_601344887); 
  657.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  658.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  659.     tmp1 = MULTIPLY(-d5, FIX_0_509795579);
  660.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  661.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  662.     z5 = MULTIPLY(d5 + d7, FIX_1_175875602);
  663.     
  664.     z3 += z5;
  665.     z4 += z5;
  666.     
  667.     tmp0 += z3;
  668.     tmp1 += z4;
  669.     tmp2 = z2 + z3;
  670.     tmp3 = z1 + z4;
  671. }
  672.     }
  673. } else {
  674.     if (d3) {
  675. if (d1) {
  676.     /* d1 != 0, d3 != 0, d5 == 0, d7 != 0 */
  677.     z1 = d7 + d1;
  678.     z3 = d7 + d3;
  679.     z5 = MULTIPLY(z3 + d1, FIX_1_175875602);
  680.     
  681.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  682.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  683.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  684.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  685.     z2 = MULTIPLY(-d3, FIX_2_562915447);
  686.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  687.     z4 = MULTIPLY(-d1, FIX_0_390180644);
  688.     
  689.     z3 += z5;
  690.     z4 += z5;
  691.     
  692.     tmp0 += z1 + z3;
  693.     tmp1 = z2 + z4;
  694.     tmp2 += z2 + z3;
  695.     tmp3 += z1 + z4;
  696. } else {
  697.     /* d1 == 0, d3 != 0, d5 == 0, d7 != 0 */
  698.     z3 = d7 + d3;
  699.     
  700.     tmp0 = MULTIPLY(-d7, FIX_0_601344887); 
  701.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  702.     tmp2 = MULTIPLY(d3, FIX_0_509795579);
  703.     z2 = MULTIPLY(-d3, FIX_2_562915447);
  704.     z5 = MULTIPLY(z3, FIX_1_175875602);
  705.     z3 = MULTIPLY(-z3, FIX_0_785694958);
  706.     
  707.     tmp0 += z3;
  708.     tmp1 = z2 + z5;
  709.     tmp2 += z3;
  710.     tmp3 = z1 + z5;
  711. }
  712.     } else {
  713. if (d1) {
  714.     /* d1 != 0, d3 == 0, d5 == 0, d7 != 0 */
  715.     z1 = d7 + d1;
  716.     z5 = MULTIPLY(z1, FIX_1_175875602);
  717.     z1 = MULTIPLY(z1, FIX_0_275899380);
  718.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  719.     tmp0 = MULTIPLY(-d7, FIX_1_662939225); 
  720.     z4 = MULTIPLY(-d1, FIX_0_390180644);
  721.     tmp3 = MULTIPLY(d1, FIX_1_111140466);
  722.     tmp0 += z1;
  723.     tmp1 = z4 + z5;
  724.     tmp2 = z3 + z5;
  725.     tmp3 += z1;
  726. } else {
  727.     /* d1 == 0, d3 == 0, d5 == 0, d7 != 0 */
  728.     tmp0 = MULTIPLY(-d7, FIX_1_387039845);
  729.     tmp1 = MULTIPLY(d7, FIX_1_175875602);
  730.     tmp2 = MULTIPLY(-d7, FIX_0_785694958);
  731.     tmp3 = MULTIPLY(d7, FIX_0_275899380);
  732. }
  733.     }
  734. }
  735.     } else {
  736. if (d5) {
  737.     if (d3) {
  738. if (d1) {
  739.     /* d1 != 0, d3 != 0, d5 != 0, d7 == 0 */
  740.     z2 = d5 + d3;
  741.     z4 = d5 + d1;
  742.     z5 = MULTIPLY(d3 + z4, FIX_1_175875602);
  743.     
  744.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  745.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  746.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  747.     z1 = MULTIPLY(-d1, FIX_0_899976223);
  748.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  749.     z3 = MULTIPLY(-d3, FIX_1_961570560);
  750.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  751.     
  752.     z3 += z5;
  753.     z4 += z5;
  754.     
  755.     tmp0 = z1 + z3;
  756.     tmp1 += z2 + z4;
  757.     tmp2 += z2 + z3;
  758.     tmp3 += z1 + z4;
  759. } else {
  760.     /* d1 == 0, d3 != 0, d5 != 0, d7 == 0 */
  761.     z2 = d5 + d3;
  762.     
  763.     z5 = MULTIPLY(z2, FIX_1_175875602);
  764.     tmp1 = MULTIPLY(d5, FIX_1_662939225);
  765.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  766.     z2 = MULTIPLY(-z2, FIX_1_387039845);
  767.     tmp2 = MULTIPLY(d3, FIX_1_111140466);
  768.     z3 = MULTIPLY(-d3, FIX_1_961570560);
  769.     
  770.     tmp0 = z3 + z5;
  771.     tmp1 += z2;
  772.     tmp2 += z2;
  773.     tmp3 = z4 + z5;
  774. }
  775.     } else {
  776. if (d1) {
  777.     /* d1 != 0, d3 == 0, d5 != 0, d7 == 0 */
  778.     z4 = d5 + d1;
  779.     
  780.     z5 = MULTIPLY(z4, FIX_1_175875602);
  781.     z1 = MULTIPLY(-d1, FIX_0_899976223);
  782.     tmp3 = MULTIPLY(d1, FIX_0_601344887);
  783.     tmp1 = MULTIPLY(-d5, FIX_0_509795579);
  784.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  785.     z4 = MULTIPLY(z4, FIX_0_785694958);
  786.     
  787.     tmp0 = z1 + z5;
  788.     tmp1 += z4;
  789.     tmp2 = z2 + z5;
  790.     tmp3 += z4;
  791. } else {
  792.     /* d1 == 0, d3 == 0, d5 != 0, d7 == 0 */
  793.     tmp0 = MULTIPLY(d5, FIX_1_175875602);
  794.     tmp1 = MULTIPLY(d5, FIX_0_275899380);
  795.     tmp2 = MULTIPLY(-d5, FIX_1_387039845);
  796.     tmp3 = MULTIPLY(d5, FIX_0_785694958);
  797. }
  798.     }
  799. } else {
  800.     if (d3) {
  801. if (d1) {
  802.     /* d1 != 0, d3 != 0, d5 == 0, d7 == 0 */
  803.     z5 = d1 + d3;
  804.     tmp3 = MULTIPLY(d1, FIX_0_211164243);
  805.     tmp2 = MULTIPLY(-d3, FIX_1_451774981);
  806.     z1 = MULTIPLY(d1, FIX_1_061594337);
  807.     z2 = MULTIPLY(-d3, FIX_2_172734803);
  808.     z4 = MULTIPLY(z5, FIX_0_785694958);
  809.     z5 = MULTIPLY(z5, FIX_1_175875602);
  810.     
  811.     tmp0 = z1 - z4;
  812.     tmp1 = z2 + z4;
  813.     tmp2 += z5;
  814.     tmp3 += z5;
  815. } else {
  816.     /* d1 == 0, d3 != 0, d5 == 0, d7 == 0 */
  817.     tmp0 = MULTIPLY(-d3, FIX_0_785694958);
  818.     tmp1 = MULTIPLY(-d3, FIX_1_387039845);
  819.     tmp2 = MULTIPLY(-d3, FIX_0_275899380);
  820.     tmp3 = MULTIPLY(d3, FIX_1_175875602);
  821. }
  822.     } else {
  823. if (d1) {
  824.     /* d1 != 0, d3 == 0, d5 == 0, d7 == 0 */
  825.     tmp0 = MULTIPLY(d1, FIX_0_275899380);
  826.     tmp1 = MULTIPLY(d1, FIX_0_785694958);
  827.     tmp2 = MULTIPLY(d1, FIX_1_175875602);
  828.     tmp3 = MULTIPLY(d1, FIX_1_387039845);
  829. } else {
  830.     /* d1 == 0, d3 == 0, d5 == 0, d7 == 0 */
  831.     tmp0 = tmp1 = tmp2 = tmp3 = 0;
  832. }
  833.     }
  834. }
  835.     }
  836.     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  837.     dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp3,
  838.    CONST_BITS+PASS1_BITS+3);
  839.     dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp10 - tmp3,
  840.    CONST_BITS+PASS1_BITS+3);
  841.     dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp11 + tmp2,
  842.    CONST_BITS+PASS1_BITS+3);
  843.     dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(tmp11 - tmp2,
  844.    CONST_BITS+PASS1_BITS+3);
  845.     dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp12 + tmp1,
  846.    CONST_BITS+PASS1_BITS+3);
  847.     dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12 - tmp1,
  848.    CONST_BITS+PASS1_BITS+3);
  849.     dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp13 + tmp0,
  850.    CONST_BITS+PASS1_BITS+3);
  851.     dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp13 - tmp0,
  852.    CONST_BITS+PASS1_BITS+3);
  853.     
  854.     dataptr++; /* advance pointer to next column */
  855.   }
  856. }
  857. #undef DCTSIZE
  858. #define DCTSIZE 4
  859. #define DCTSTRIDE 8
  860. void j_rev_dct4(DCTBLOCK data)
  861. {
  862.   int32_t tmp0, tmp1, tmp2, tmp3;
  863.   int32_t tmp10, tmp11, tmp12, tmp13;
  864.   int32_t z1;
  865.   int32_t d0, d2, d4, d6;
  866.   register DCTELEM *dataptr;
  867.   int rowctr;
  868.   /* Pass 1: process rows. */
  869.   /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
  870.   /* furthermore, we scale the results by 2**PASS1_BITS. */
  871.   data[0] += 4;
  872.   
  873.   dataptr = data;
  874.   for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
  875.     /* Due to quantization, we will usually find that many of the input
  876.      * coefficients are zero, especially the AC terms.  We can exploit this
  877.      * by short-circuiting the IDCT calculation for any row in which all
  878.      * the AC terms are zero.  In that case each output is equal to the
  879.      * DC coefficient (with scale factor as needed).
  880.      * With typical images and quantization tables, half or more of the
  881.      * row DCT calculations can be simplified this way.
  882.      */
  883.     register int *idataptr = (int*)dataptr;
  884.     d0 = dataptr[0];
  885.     d2 = dataptr[1];
  886.     d4 = dataptr[2];
  887.     d6 = dataptr[3];
  888.     if ((d2 | d4 | d6) == 0) {
  889.       /* AC terms all zero */
  890.       if (d0) {
  891.   /* Compute a 32 bit value to assign. */
  892.   DCTELEM dcval = (DCTELEM) (d0 << PASS1_BITS);
  893.   register int v = (dcval & 0xffff) | ((dcval << 16) & 0xffff0000);
  894.   
  895.   idataptr[0] = v;
  896.   idataptr[1] = v;
  897.       }
  898.       
  899.       dataptr += DCTSTRIDE; /* advance pointer to next row */
  900.       continue;
  901.     }
  902.     
  903.     /* Even part: reverse the even part of the forward DCT. */
  904.     /* The rotator is sqrt(2)*c(-6). */
  905.     if (d6) {
  906.     if (d2) {
  907.     /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
  908.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  909.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  910.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  911.     tmp0 = (d0 + d4) << CONST_BITS;
  912.     tmp1 = (d0 - d4) << CONST_BITS;
  913.     tmp10 = tmp0 + tmp3;
  914.     tmp13 = tmp0 - tmp3;
  915.     tmp11 = tmp1 + tmp2;
  916.     tmp12 = tmp1 - tmp2;
  917.     } else {
  918.     /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
  919.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  920.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  921.     tmp0 = (d0 + d4) << CONST_BITS;
  922.     tmp1 = (d0 - d4) << CONST_BITS;
  923.     tmp10 = tmp0 + tmp3;
  924.     tmp13 = tmp0 - tmp3;
  925.     tmp11 = tmp1 + tmp2;
  926.     tmp12 = tmp1 - tmp2;
  927.     }
  928.     } else {
  929.     if (d2) {
  930.     /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
  931.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  932.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  933.     tmp0 = (d0 + d4) << CONST_BITS;
  934.     tmp1 = (d0 - d4) << CONST_BITS;
  935.     tmp10 = tmp0 + tmp3;
  936.     tmp13 = tmp0 - tmp3;
  937.     tmp11 = tmp1 + tmp2;
  938.     tmp12 = tmp1 - tmp2;
  939.     } else {
  940.     /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
  941.     tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
  942.     tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
  943.     }
  944.       }
  945.     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  946.     dataptr[0] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);
  947.     dataptr[1] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);
  948.     dataptr[2] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);
  949.     dataptr[3] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);
  950.     dataptr += DCTSTRIDE; /* advance pointer to next row */
  951.   }
  952.   /* Pass 2: process columns. */
  953.   /* Note that we must descale the results by a factor of 8 == 2**3, */
  954.   /* and also undo the PASS1_BITS scaling. */
  955.   dataptr = data;
  956.   for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
  957.     /* Columns of zeroes can be exploited in the same way as we did with rows.
  958.      * However, the row calculation has created many nonzero AC terms, so the
  959.      * simplification applies less often (typically 5% to 10% of the time).
  960.      * On machines with very fast multiplication, it's possible that the
  961.      * test takes more time than it's worth.  In that case this section
  962.      * may be commented out.
  963.      */
  964.     d0 = dataptr[DCTSTRIDE*0];
  965.     d2 = dataptr[DCTSTRIDE*1];
  966.     d4 = dataptr[DCTSTRIDE*2];
  967.     d6 = dataptr[DCTSTRIDE*3];
  968.     /* Even part: reverse the even part of the forward DCT. */
  969.     /* The rotator is sqrt(2)*c(-6). */
  970.     if (d6) {
  971.     if (d2) {
  972.     /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
  973.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  974.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  975.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  976.     tmp0 = (d0 + d4) << CONST_BITS;
  977.     tmp1 = (d0 - d4) << CONST_BITS;
  978.     tmp10 = tmp0 + tmp3;
  979.     tmp13 = tmp0 - tmp3;
  980.     tmp11 = tmp1 + tmp2;
  981.     tmp12 = tmp1 - tmp2;
  982.     } else {
  983.     /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
  984.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  985.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  986.     tmp0 = (d0 + d4) << CONST_BITS;
  987.     tmp1 = (d0 - d4) << CONST_BITS;
  988.     tmp10 = tmp0 + tmp3;
  989.     tmp13 = tmp0 - tmp3;
  990.     tmp11 = tmp1 + tmp2;
  991.     tmp12 = tmp1 - tmp2;
  992.     }
  993.     } else {
  994.     if (d2) {
  995.     /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
  996.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  997.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  998.     tmp0 = (d0 + d4) << CONST_BITS;
  999.     tmp1 = (d0 - d4) << CONST_BITS;
  1000.     tmp10 = tmp0 + tmp3;
  1001.     tmp13 = tmp0 - tmp3;
  1002.     tmp11 = tmp1 + tmp2;
  1003.     tmp12 = tmp1 - tmp2;
  1004.     } else {
  1005.     /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
  1006.     tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
  1007.     tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
  1008.     }
  1009.     }
  1010.     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  1011.     dataptr[DCTSTRIDE*0] = tmp10 >> (CONST_BITS+PASS1_BITS+3);
  1012.     dataptr[DCTSTRIDE*1] = tmp11 >> (CONST_BITS+PASS1_BITS+3);
  1013.     dataptr[DCTSTRIDE*2] = tmp12 >> (CONST_BITS+PASS1_BITS+3);
  1014.     dataptr[DCTSTRIDE*3] = tmp13 >> (CONST_BITS+PASS1_BITS+3);
  1015.     
  1016.     dataptr++; /* advance pointer to next column */
  1017.   }
  1018. }
  1019. void j_rev_dct2(DCTBLOCK data){
  1020.   int d00, d01, d10, d11;
  1021.   data[0] += 4;
  1022.   d00 = data[0+0*DCTSTRIDE] + data[1+0*DCTSTRIDE];
  1023.   d01 = data[0+0*DCTSTRIDE] - data[1+0*DCTSTRIDE];
  1024.   d10 = data[0+1*DCTSTRIDE] + data[1+1*DCTSTRIDE];
  1025.   d11 = data[0+1*DCTSTRIDE] - data[1+1*DCTSTRIDE];
  1026.  
  1027.   data[0+0*DCTSTRIDE]= (d00 + d10)>>3;
  1028.   data[1+0*DCTSTRIDE]= (d01 + d11)>>3;
  1029.   data[0+1*DCTSTRIDE]= (d00 - d10)>>3;
  1030.   data[1+1*DCTSTRIDE]= (d01 - d11)>>3;
  1031. }
  1032. void j_rev_dct1(DCTBLOCK data){
  1033.   data[0] = (data[0] + 4)>>3;
  1034. }
  1035. #undef FIX
  1036. #undef CONST_BITS