jrevdct.c
上传用户:jxp0626
上传日期:2007-01-08
资源大小:102k
文件大小:33k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Unix_Linux

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