jrevdct.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:33k
源码类别:

Audio

开发平台:

Visual 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 (d4) {
  209.     if (d2) {
  210. if (d0) {
  211.     /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
  212.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  213.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  214.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  215.     tmp0 = (d0 + d4) << CONST_BITS;
  216.     tmp1 = (d0 - d4) << CONST_BITS;
  217.     tmp10 = tmp0 + tmp3;
  218.     tmp13 = tmp0 - tmp3;
  219.     tmp11 = tmp1 + tmp2;
  220.     tmp12 = tmp1 - tmp2;
  221. } else {
  222.     /* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
  223.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  224.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  225.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  226.     tmp0 = d4 << CONST_BITS;
  227.     tmp10 = tmp0 + tmp3;
  228.     tmp13 = tmp0 - tmp3;
  229.     tmp11 = tmp2 - tmp0;
  230.     tmp12 = -(tmp0 + tmp2);
  231. }
  232.     } else {
  233. if (d0) {
  234.     /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
  235.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  236.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  237.     tmp0 = (d0 + d4) << CONST_BITS;
  238.     tmp1 = (d0 - d4) << CONST_BITS;
  239.     tmp10 = tmp0 + tmp3;
  240.     tmp13 = tmp0 - tmp3;
  241.     tmp11 = tmp1 + tmp2;
  242.     tmp12 = tmp1 - tmp2;
  243. } else {
  244.     /* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
  245.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  246.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  247.     tmp0 = d4 << CONST_BITS;
  248.     tmp10 = tmp0 + tmp3;
  249.     tmp13 = tmp0 - tmp3;
  250.     tmp11 = tmp2 - tmp0;
  251.     tmp12 = -(tmp0 + tmp2);
  252. }
  253.     }
  254. } else {
  255.     if (d2) {
  256. if (d0) {
  257.     /* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
  258.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  259.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  260.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  261.     tmp0 = d0 << CONST_BITS;
  262.     tmp10 = tmp0 + tmp3;
  263.     tmp13 = tmp0 - tmp3;
  264.     tmp11 = tmp0 + tmp2;
  265.     tmp12 = tmp0 - tmp2;
  266. } else {
  267.     /* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
  268.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  269.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  270.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  271.     tmp10 = tmp3;
  272.     tmp13 = -tmp3;
  273.     tmp11 = tmp2;
  274.     tmp12 = -tmp2;
  275. }
  276.     } else {
  277. if (d0) {
  278.     /* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
  279.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  280.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  281.     tmp0 = d0 << CONST_BITS;
  282.     tmp10 = tmp0 + tmp3;
  283.     tmp13 = tmp0 - tmp3;
  284.     tmp11 = tmp0 + tmp2;
  285.     tmp12 = tmp0 - tmp2;
  286. } else {
  287.     /* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
  288.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  289.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  290.     tmp10 = tmp3;
  291.     tmp13 = -tmp3;
  292.     tmp11 = tmp2;
  293.     tmp12 = -tmp2;
  294. }
  295.     }
  296. }
  297.     } else {
  298. if (d4) {
  299.     if (d2) {
  300. if (d0) {
  301.     /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
  302.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  303.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  304.     tmp0 = (d0 + d4) << CONST_BITS;
  305.     tmp1 = (d0 - d4) << CONST_BITS;
  306.     tmp10 = tmp0 + tmp3;
  307.     tmp13 = tmp0 - tmp3;
  308.     tmp11 = tmp1 + tmp2;
  309.     tmp12 = tmp1 - tmp2;
  310. } else {
  311.     /* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
  312.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  313.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  314.     tmp0 = d4 << CONST_BITS;
  315.     tmp10 = tmp0 + tmp3;
  316.     tmp13 = tmp0 - tmp3;
  317.     tmp11 = tmp2 - tmp0;
  318.     tmp12 = -(tmp0 + tmp2);
  319. }
  320.     } else {
  321. if (d0) {
  322.     /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
  323.     tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
  324.     tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
  325. } else {
  326.     /* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
  327.     tmp10 = tmp13 = d4 << CONST_BITS;
  328.     tmp11 = tmp12 = -tmp10;
  329. }
  330.     }
  331. } else {
  332.     if (d2) {
  333. if (d0) {
  334.     /* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
  335.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  336.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  337.     tmp0 = d0 << CONST_BITS;
  338.     tmp10 = tmp0 + tmp3;
  339.     tmp13 = tmp0 - tmp3;
  340.     tmp11 = tmp0 + tmp2;
  341.     tmp12 = tmp0 - tmp2;
  342. } else {
  343.     /* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
  344.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  345.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  346.     tmp10 = tmp3;
  347.     tmp13 = -tmp3;
  348.     tmp11 = tmp2;
  349.     tmp12 = -tmp2;
  350. }
  351.     } else {
  352. if (d0) {
  353.     /* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
  354.     tmp10 = tmp13 = tmp11 = tmp12 = d0 << CONST_BITS;
  355. } else {
  356.     /* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
  357.     tmp10 = tmp13 = tmp11 = tmp12 = 0;
  358. }
  359.     }
  360. }
  361.       }
  362.     /* Odd part per figure 8; the matrix is unitary and hence its
  363.      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
  364.      */
  365.     if (d7) {
  366. if (d5) {
  367.     if (d3) {
  368. if (d1) {
  369.     /* d1 != 0, d3 != 0, d5 != 0, d7 != 0 */
  370.     z1 = d7 + d1;
  371.     z2 = d5 + d3;
  372.     z3 = d7 + d3;
  373.     z4 = d5 + d1;
  374.     z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
  375.     
  376.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  377.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  378.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  379.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  380.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  381.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  382.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  383.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  384.     
  385.     z3 += z5;
  386.     z4 += z5;
  387.     
  388.     tmp0 += z1 + z3;
  389.     tmp1 += z2 + z4;
  390.     tmp2 += z2 + z3;
  391.     tmp3 += z1 + z4;
  392. } else {
  393.     /* d1 == 0, d3 != 0, d5 != 0, d7 != 0 */
  394.     z2 = d5 + d3;
  395.     z3 = d7 + d3;
  396.     z5 = MULTIPLY(z3 + d5, FIX_1_175875602);
  397.     
  398.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  399.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  400.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  401.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  402.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  403.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  404.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  405.     
  406.     z3 += z5;
  407.     z4 += z5;
  408.     
  409.     tmp0 += z1 + z3;
  410.     tmp1 += z2 + z4;
  411.     tmp2 += z2 + z3;
  412.     tmp3 = z1 + z4;
  413. }
  414.     } else {
  415. if (d1) {
  416.     /* d1 != 0, d3 == 0, d5 != 0, d7 != 0 */
  417.     z1 = d7 + d1;
  418.     z4 = d5 + d1;
  419.     z5 = MULTIPLY(d7 + z4, FIX_1_175875602);
  420.     
  421.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  422.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  423.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  424.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  425.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  426.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  427.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  428.     
  429.     z3 += z5;
  430.     z4 += z5;
  431.     
  432.     tmp0 += z1 + z3;
  433.     tmp1 += z2 + z4;
  434.     tmp2 = z2 + z3;
  435.     tmp3 += z1 + z4;
  436. } else {
  437.     /* d1 == 0, d3 == 0, d5 != 0, d7 != 0 */
  438.     tmp0 = MULTIPLY(-d7, FIX_0_601344887); 
  439.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  440.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  441.     tmp1 = MULTIPLY(-d5, FIX_0_509795579);
  442.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  443.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  444.     z5 = MULTIPLY(d5 + d7, FIX_1_175875602);
  445.     
  446.     z3 += z5;
  447.     z4 += z5;
  448.     
  449.     tmp0 += z3;
  450.     tmp1 += z4;
  451.     tmp2 = z2 + z3;
  452.     tmp3 = z1 + z4;
  453. }
  454.     }
  455. } else {
  456.     if (d3) {
  457. if (d1) {
  458.     /* d1 != 0, d3 != 0, d5 == 0, d7 != 0 */
  459.     z1 = d7 + d1;
  460.     z3 = d7 + d3;
  461.     z5 = MULTIPLY(z3 + d1, FIX_1_175875602);
  462.     
  463.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  464.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  465.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  466.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  467.     z2 = MULTIPLY(-d3, FIX_2_562915447);
  468.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  469.     z4 = MULTIPLY(-d1, FIX_0_390180644);
  470.     
  471.     z3 += z5;
  472.     z4 += z5;
  473.     
  474.     tmp0 += z1 + z3;
  475.     tmp1 = z2 + z4;
  476.     tmp2 += z2 + z3;
  477.     tmp3 += z1 + z4;
  478. } else {
  479.     /* d1 == 0, d3 != 0, d5 == 0, d7 != 0 */
  480.     z3 = d7 + d3;
  481.     
  482.     tmp0 = MULTIPLY(-d7, FIX_0_601344887); 
  483.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  484.     tmp2 = MULTIPLY(d3, FIX_0_509795579);
  485.     z2 = MULTIPLY(-d3, FIX_2_562915447);
  486.     z5 = MULTIPLY(z3, FIX_1_175875602);
  487.     z3 = MULTIPLY(-z3, FIX_0_785694958);
  488.     
  489.     tmp0 += z3;
  490.     tmp1 = z2 + z5;
  491.     tmp2 += z3;
  492.     tmp3 = z1 + z5;
  493. }
  494.     } else {
  495. if (d1) {
  496.     /* d1 != 0, d3 == 0, d5 == 0, d7 != 0 */
  497.     z1 = d7 + d1;
  498.     z5 = MULTIPLY(z1, FIX_1_175875602);
  499.     z1 = MULTIPLY(z1, FIX_0_275899380);
  500.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  501.     tmp0 = MULTIPLY(-d7, FIX_1_662939225); 
  502.     z4 = MULTIPLY(-d1, FIX_0_390180644);
  503.     tmp3 = MULTIPLY(d1, FIX_1_111140466);
  504.     tmp0 += z1;
  505.     tmp1 = z4 + z5;
  506.     tmp2 = z3 + z5;
  507.     tmp3 += z1;
  508. } else {
  509.     /* d1 == 0, d3 == 0, d5 == 0, d7 != 0 */
  510.     tmp0 = MULTIPLY(-d7, FIX_1_387039845);
  511.     tmp1 = MULTIPLY(d7, FIX_1_175875602);
  512.     tmp2 = MULTIPLY(-d7, FIX_0_785694958);
  513.     tmp3 = MULTIPLY(d7, FIX_0_275899380);
  514. }
  515.     }
  516. }
  517.     } else {
  518. if (d5) {
  519.     if (d3) {
  520. if (d1) {
  521.     /* d1 != 0, d3 != 0, d5 != 0, d7 == 0 */
  522.     z2 = d5 + d3;
  523.     z4 = d5 + d1;
  524.     z5 = MULTIPLY(d3 + z4, FIX_1_175875602);
  525.     
  526.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  527.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  528.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  529.     z1 = MULTIPLY(-d1, FIX_0_899976223);
  530.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  531.     z3 = MULTIPLY(-d3, FIX_1_961570560);
  532.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  533.     
  534.     z3 += z5;
  535.     z4 += z5;
  536.     
  537.     tmp0 = z1 + z3;
  538.     tmp1 += z2 + z4;
  539.     tmp2 += z2 + z3;
  540.     tmp3 += z1 + z4;
  541. } else {
  542.     /* d1 == 0, d3 != 0, d5 != 0, d7 == 0 */
  543.     z2 = d5 + d3;
  544.     
  545.     z5 = MULTIPLY(z2, FIX_1_175875602);
  546.     tmp1 = MULTIPLY(d5, FIX_1_662939225);
  547.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  548.     z2 = MULTIPLY(-z2, FIX_1_387039845);
  549.     tmp2 = MULTIPLY(d3, FIX_1_111140466);
  550.     z3 = MULTIPLY(-d3, FIX_1_961570560);
  551.     
  552.     tmp0 = z3 + z5;
  553.     tmp1 += z2;
  554.     tmp2 += z2;
  555.     tmp3 = z4 + z5;
  556. }
  557.     } else {
  558. if (d1) {
  559.     /* d1 != 0, d3 == 0, d5 != 0, d7 == 0 */
  560.     z4 = d5 + d1;
  561.     
  562.     z5 = MULTIPLY(z4, FIX_1_175875602);
  563.     z1 = MULTIPLY(-d1, FIX_0_899976223);
  564.     tmp3 = MULTIPLY(d1, FIX_0_601344887);
  565.     tmp1 = MULTIPLY(-d5, FIX_0_509795579);
  566.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  567.     z4 = MULTIPLY(z4, FIX_0_785694958);
  568.     
  569.     tmp0 = z1 + z5;
  570.     tmp1 += z4;
  571.     tmp2 = z2 + z5;
  572.     tmp3 += z4;
  573. } else {
  574.     /* d1 == 0, d3 == 0, d5 != 0, d7 == 0 */
  575.     tmp0 = MULTIPLY(d5, FIX_1_175875602);
  576.     tmp1 = MULTIPLY(d5, FIX_0_275899380);
  577.     tmp2 = MULTIPLY(-d5, FIX_1_387039845);
  578.     tmp3 = MULTIPLY(d5, FIX_0_785694958);
  579. }
  580.     }
  581. } else {
  582.     if (d3) {
  583. if (d1) {
  584.     /* d1 != 0, d3 != 0, d5 == 0, d7 == 0 */
  585.     z5 = d1 + d3;
  586.     tmp3 = MULTIPLY(d1, FIX_0_211164243);
  587.     tmp2 = MULTIPLY(-d3, FIX_1_451774981);
  588.     z1 = MULTIPLY(d1, FIX_1_061594337);
  589.     z2 = MULTIPLY(-d3, FIX_2_172734803);
  590.     z4 = MULTIPLY(z5, FIX_0_785694958);
  591.     z5 = MULTIPLY(z5, FIX_1_175875602);
  592.     
  593.     tmp0 = z1 - z4;
  594.     tmp1 = z2 + z4;
  595.     tmp2 += z5;
  596.     tmp3 += z5;
  597. } else {
  598.     /* d1 == 0, d3 != 0, d5 == 0, d7 == 0 */
  599.     tmp0 = MULTIPLY(-d3, FIX_0_785694958);
  600.     tmp1 = MULTIPLY(-d3, FIX_1_387039845);
  601.     tmp2 = MULTIPLY(-d3, FIX_0_275899380);
  602.     tmp3 = MULTIPLY(d3, FIX_1_175875602);
  603. }
  604.     } else {
  605. if (d1) {
  606.     /* d1 != 0, d3 == 0, d5 == 0, d7 == 0 */
  607.     tmp0 = MULTIPLY(d1, FIX_0_275899380);
  608.     tmp1 = MULTIPLY(d1, FIX_0_785694958);
  609.     tmp2 = MULTIPLY(d1, FIX_1_175875602);
  610.     tmp3 = MULTIPLY(d1, FIX_1_387039845);
  611. } else {
  612.     /* d1 == 0, d3 == 0, d5 == 0, d7 == 0 */
  613.     tmp0 = tmp1 = tmp2 = tmp3 = 0;
  614. }
  615.     }
  616. }
  617.     }
  618. }
  619.     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  620.     dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  621.     dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  622.     dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  623.     dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  624.     dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  625.     dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  626.     dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  627.     dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  628.     dataptr += DCTSIZE; /* advance pointer to next row */
  629.   }
  630.   /* Pass 2: process columns. */
  631.   /* Note that we must descale the results by a factor of 8 == 2**3, */
  632.   /* and also undo the PASS1_BITS scaling. */
  633.   dataptr = data;
  634.   for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
  635.     /* Columns of zeroes can be exploited in the same way as we did with rows.
  636.      * However, the row calculation has created many nonzero AC terms, so the
  637.      * simplification applies less often (typically 5% to 10% of the time).
  638.      * On machines with very fast multiplication, it's possible that the
  639.      * test takes more time than it's worth.  In that case this section
  640.      * may be commented out.
  641.      */
  642.     d0 = dataptr[DCTSIZE*0];
  643.     d1 = dataptr[DCTSIZE*1];
  644.     d2 = dataptr[DCTSIZE*2];
  645.     d3 = dataptr[DCTSIZE*3];
  646.     d4 = dataptr[DCTSIZE*4];
  647.     d5 = dataptr[DCTSIZE*5];
  648.     d6 = dataptr[DCTSIZE*6];
  649.     d7 = dataptr[DCTSIZE*7];
  650.     /* Even part: reverse the even part of the forward DCT. */
  651.     /* The rotator is sqrt(2)*c(-6). */
  652.     if (d6) {
  653. if (d4) {
  654.     if (d2) {
  655. if (d0) {
  656.     /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
  657.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  658.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  659.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  660.     tmp0 = (d0 + d4) << CONST_BITS;
  661.     tmp1 = (d0 - d4) << CONST_BITS;
  662.     tmp10 = tmp0 + tmp3;
  663.     tmp13 = tmp0 - tmp3;
  664.     tmp11 = tmp1 + tmp2;
  665.     tmp12 = tmp1 - tmp2;
  666. } else {
  667.     /* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
  668.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  669.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  670.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  671.     tmp0 = d4 << CONST_BITS;
  672.     tmp10 = tmp0 + tmp3;
  673.     tmp13 = tmp0 - tmp3;
  674.     tmp11 = tmp2 - tmp0;
  675.     tmp12 = -(tmp0 + tmp2);
  676. }
  677.     } else {
  678. if (d0) {
  679.     /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
  680.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  681.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  682.     tmp0 = (d0 + d4) << CONST_BITS;
  683.     tmp1 = (d0 - d4) << CONST_BITS;
  684.     tmp10 = tmp0 + tmp3;
  685.     tmp13 = tmp0 - tmp3;
  686.     tmp11 = tmp1 + tmp2;
  687.     tmp12 = tmp1 - tmp2;
  688. } else {
  689.     /* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
  690.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  691.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  692.     tmp0 = d4 << CONST_BITS;
  693.     tmp10 = tmp0 + tmp3;
  694.     tmp13 = tmp0 - tmp3;
  695.     tmp11 = tmp2 - tmp0;
  696.     tmp12 = -(tmp0 + tmp2);
  697. }
  698.     }
  699. } else {
  700.     if (d2) {
  701. if (d0) {
  702.     /* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
  703.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  704.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  705.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  706.     tmp0 = d0 << CONST_BITS;
  707.     tmp10 = tmp0 + tmp3;
  708.     tmp13 = tmp0 - tmp3;
  709.     tmp11 = tmp0 + tmp2;
  710.     tmp12 = tmp0 - tmp2;
  711. } else {
  712.     /* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
  713.     z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
  714.     tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
  715.     tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
  716.     tmp10 = tmp3;
  717.     tmp13 = -tmp3;
  718.     tmp11 = tmp2;
  719.     tmp12 = -tmp2;
  720. }
  721.     } else {
  722. if (d0) {
  723.     /* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
  724.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  725.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  726.     tmp0 = d0 << CONST_BITS;
  727.     tmp10 = tmp0 + tmp3;
  728.     tmp13 = tmp0 - tmp3;
  729.     tmp11 = tmp0 + tmp2;
  730.     tmp12 = tmp0 - tmp2;
  731. } else {
  732.     /* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
  733.     tmp2 = MULTIPLY(-d6, FIX_1_306562965);
  734.     tmp3 = MULTIPLY(d6, FIX_0_541196100);
  735.     tmp10 = tmp3;
  736.     tmp13 = -tmp3;
  737.     tmp11 = tmp2;
  738.     tmp12 = -tmp2;
  739. }
  740.     }
  741. }
  742.     } else {
  743. if (d4) {
  744.     if (d2) {
  745. if (d0) {
  746.     /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
  747.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  748.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  749.     tmp0 = (d0 + d4) << CONST_BITS;
  750.     tmp1 = (d0 - d4) << CONST_BITS;
  751.     tmp10 = tmp0 + tmp3;
  752.     tmp13 = tmp0 - tmp3;
  753.     tmp11 = tmp1 + tmp2;
  754.     tmp12 = tmp1 - tmp2;
  755. } else {
  756.     /* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
  757.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  758.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  759.     tmp0 = d4 << CONST_BITS;
  760.     tmp10 = tmp0 + tmp3;
  761.     tmp13 = tmp0 - tmp3;
  762.     tmp11 = tmp2 - tmp0;
  763.     tmp12 = -(tmp0 + tmp2);
  764. }
  765.     } else {
  766. if (d0) {
  767.     /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
  768.     tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
  769.     tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
  770. } else {
  771.     /* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
  772.     tmp10 = tmp13 = d4 << CONST_BITS;
  773.     tmp11 = tmp12 = -tmp10;
  774. }
  775.     }
  776. } else {
  777.     if (d2) {
  778. if (d0) {
  779.     /* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
  780.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  781.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  782.     tmp0 = d0 << CONST_BITS;
  783.     tmp10 = tmp0 + tmp3;
  784.     tmp13 = tmp0 - tmp3;
  785.     tmp11 = tmp0 + tmp2;
  786.     tmp12 = tmp0 - tmp2;
  787. } else {
  788.     /* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
  789.     tmp2 = MULTIPLY(d2, FIX_0_541196100);
  790.     tmp3 = MULTIPLY(d2, FIX_1_306562965);
  791.     tmp10 = tmp3;
  792.     tmp13 = -tmp3;
  793.     tmp11 = tmp2;
  794.     tmp12 = -tmp2;
  795. }
  796.     } else {
  797. if (d0) {
  798.     /* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
  799.     tmp10 = tmp13 = tmp11 = tmp12 = d0 << CONST_BITS;
  800. } else {
  801.     /* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
  802.     tmp10 = tmp13 = tmp11 = tmp12 = 0;
  803. }
  804.     }
  805. }
  806.     }
  807.     /* Odd part per figure 8; the matrix is unitary and hence its
  808.      * transpose is its inverse.  i0..i3 are y7,y5,y3,y1 respectively.
  809.      */
  810.     if (d7) {
  811. if (d5) {
  812.     if (d3) {
  813. if (d1) {
  814.     /* d1 != 0, d3 != 0, d5 != 0, d7 != 0 */
  815.     z1 = d7 + d1;
  816.     z2 = d5 + d3;
  817.     z3 = d7 + d3;
  818.     z4 = d5 + d1;
  819.     z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
  820.     
  821.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  822.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  823.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  824.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  825.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  826.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  827.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  828.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  829.     
  830.     z3 += z5;
  831.     z4 += z5;
  832.     
  833.     tmp0 += z1 + z3;
  834.     tmp1 += z2 + z4;
  835.     tmp2 += z2 + z3;
  836.     tmp3 += z1 + z4;
  837. } else {
  838.     /* d1 == 0, d3 != 0, d5 != 0, d7 != 0 */
  839.     z1 = d7;
  840.     z2 = d5 + d3;
  841.     z3 = d7 + d3;
  842.     z5 = MULTIPLY(z3 + d5, FIX_1_175875602);
  843.     
  844.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  845.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  846.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  847.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  848.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  849.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  850.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  851.     
  852.     z3 += z5;
  853.     z4 += z5;
  854.     
  855.     tmp0 += z1 + z3;
  856.     tmp1 += z2 + z4;
  857.     tmp2 += z2 + z3;
  858.     tmp3 = z1 + z4;
  859. }
  860.     } else {
  861. if (d1) {
  862.     /* d1 != 0, d3 == 0, d5 != 0, d7 != 0 */
  863.     z1 = d7 + d1;
  864.     z2 = d5;
  865.     z3 = d7;
  866.     z4 = d5 + d1;
  867.     z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
  868.     
  869.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  870.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  871.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  872.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  873.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  874.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  875.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  876.     
  877.     z3 += z5;
  878.     z4 += z5;
  879.     
  880.     tmp0 += z1 + z3;
  881.     tmp1 += z2 + z4;
  882.     tmp2 = z2 + z3;
  883.     tmp3 += z1 + z4;
  884. } else {
  885.     /* d1 == 0, d3 == 0, d5 != 0, d7 != 0 */
  886.     tmp0 = MULTIPLY(-d7, FIX_0_601344887); 
  887.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  888.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  889.     tmp1 = MULTIPLY(-d5, FIX_0_509795579);
  890.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  891.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  892.     z5 = MULTIPLY(d5 + d7, FIX_1_175875602);
  893.     
  894.     z3 += z5;
  895.     z4 += z5;
  896.     
  897.     tmp0 += z3;
  898.     tmp1 += z4;
  899.     tmp2 = z2 + z3;
  900.     tmp3 = z1 + z4;
  901. }
  902.     }
  903. } else {
  904.     if (d3) {
  905. if (d1) {
  906.     /* d1 != 0, d3 != 0, d5 == 0, d7 != 0 */
  907.     z1 = d7 + d1;
  908.     z3 = d7 + d3;
  909.     z5 = MULTIPLY(z3 + d1, FIX_1_175875602);
  910.     
  911.     tmp0 = MULTIPLY(d7, FIX_0_298631336); 
  912.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  913.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  914.     z1 = MULTIPLY(-z1, FIX_0_899976223);
  915.     z2 = MULTIPLY(-d3, FIX_2_562915447);
  916.     z3 = MULTIPLY(-z3, FIX_1_961570560);
  917.     z4 = MULTIPLY(-d1, FIX_0_390180644);
  918.     
  919.     z3 += z5;
  920.     z4 += z5;
  921.     
  922.     tmp0 += z1 + z3;
  923.     tmp1 = z2 + z4;
  924.     tmp2 += z2 + z3;
  925.     tmp3 += z1 + z4;
  926. } else {
  927.     /* d1 == 0, d3 != 0, d5 == 0, d7 != 0 */
  928.     z3 = d7 + d3;
  929.     
  930.     tmp0 = MULTIPLY(-d7, FIX_0_601344887); 
  931.     z1 = MULTIPLY(-d7, FIX_0_899976223);
  932.     tmp2 = MULTIPLY(d3, FIX_0_509795579);
  933.     z2 = MULTIPLY(-d3, FIX_2_562915447);
  934.     z5 = MULTIPLY(z3, FIX_1_175875602);
  935.     z3 = MULTIPLY(-z3, FIX_0_785694958);
  936.     
  937.     tmp0 += z3;
  938.     tmp1 = z2 + z5;
  939.     tmp2 += z3;
  940.     tmp3 = z1 + z5;
  941. }
  942.     } else {
  943. if (d1) {
  944.     /* d1 != 0, d3 == 0, d5 == 0, d7 != 0 */
  945.     z1 = d7 + d1;
  946.     z5 = MULTIPLY(z1, FIX_1_175875602);
  947.     z1 = MULTIPLY(z1, FIX_0_275899380);
  948.     z3 = MULTIPLY(-d7, FIX_1_961570560);
  949.     tmp0 = MULTIPLY(-d7, FIX_1_662939225); 
  950.     z4 = MULTIPLY(-d1, FIX_0_390180644);
  951.     tmp3 = MULTIPLY(d1, FIX_1_111140466);
  952.     tmp0 += z1;
  953.     tmp1 = z4 + z5;
  954.     tmp2 = z3 + z5;
  955.     tmp3 += z1;
  956. } else {
  957.     /* d1 == 0, d3 == 0, d5 == 0, d7 != 0 */
  958.     tmp0 = MULTIPLY(-d7, FIX_1_387039845);
  959.     tmp1 = MULTIPLY(d7, FIX_1_175875602);
  960.     tmp2 = MULTIPLY(-d7, FIX_0_785694958);
  961.     tmp3 = MULTIPLY(d7, FIX_0_275899380);
  962. }
  963.     }
  964. }
  965.     } else {
  966. if (d5) {
  967.     if (d3) {
  968. if (d1) {
  969.     /* d1 != 0, d3 != 0, d5 != 0, d7 == 0 */
  970.     z2 = d5 + d3;
  971.     z4 = d5 + d1;
  972.     z5 = MULTIPLY(d3 + z4, FIX_1_175875602);
  973.     
  974.     tmp1 = MULTIPLY(d5, FIX_2_053119869);
  975.     tmp2 = MULTIPLY(d3, FIX_3_072711026);
  976.     tmp3 = MULTIPLY(d1, FIX_1_501321110);
  977.     z1 = MULTIPLY(-d1, FIX_0_899976223);
  978.     z2 = MULTIPLY(-z2, FIX_2_562915447);
  979.     z3 = MULTIPLY(-d3, FIX_1_961570560);
  980.     z4 = MULTIPLY(-z4, FIX_0_390180644);
  981.     
  982.     z3 += z5;
  983.     z4 += z5;
  984.     
  985.     tmp0 = z1 + z3;
  986.     tmp1 += z2 + z4;
  987.     tmp2 += z2 + z3;
  988.     tmp3 += z1 + z4;
  989. } else {
  990.     /* d1 == 0, d3 != 0, d5 != 0, d7 == 0 */
  991.     z2 = d5 + d3;
  992.     
  993.     z5 = MULTIPLY(z2, FIX_1_175875602);
  994.     tmp1 = MULTIPLY(d5, FIX_1_662939225);
  995.     z4 = MULTIPLY(-d5, FIX_0_390180644);
  996.     z2 = MULTIPLY(-z2, FIX_1_387039845);
  997.     tmp2 = MULTIPLY(d3, FIX_1_111140466);
  998.     z3 = MULTIPLY(-d3, FIX_1_961570560);
  999.     
  1000.     tmp0 = z3 + z5;
  1001.     tmp1 += z2;
  1002.     tmp2 += z2;
  1003.     tmp3 = z4 + z5;
  1004. }
  1005.     } else {
  1006. if (d1) {
  1007.     /* d1 != 0, d3 == 0, d5 != 0, d7 == 0 */
  1008.     z4 = d5 + d1;
  1009.     
  1010.     z5 = MULTIPLY(z4, FIX_1_175875602);
  1011.     z1 = MULTIPLY(-d1, FIX_0_899976223);
  1012.     tmp3 = MULTIPLY(d1, FIX_0_601344887);
  1013.     tmp1 = MULTIPLY(-d5, FIX_0_509795579);
  1014.     z2 = MULTIPLY(-d5, FIX_2_562915447);
  1015.     z4 = MULTIPLY(z4, FIX_0_785694958);
  1016.     
  1017.     tmp0 = z1 + z5;
  1018.     tmp1 += z4;
  1019.     tmp2 = z2 + z5;
  1020.     tmp3 += z4;
  1021. } else {
  1022.     /* d1 == 0, d3 == 0, d5 != 0, d7 == 0 */
  1023.     tmp0 = MULTIPLY(d5, FIX_1_175875602);
  1024.     tmp1 = MULTIPLY(d5, FIX_0_275899380);
  1025.     tmp2 = MULTIPLY(-d5, FIX_1_387039845);
  1026.     tmp3 = MULTIPLY(d5, FIX_0_785694958);
  1027. }
  1028.     }
  1029. } else {
  1030.     if (d3) {
  1031. if (d1) {
  1032.     /* d1 != 0, d3 != 0, d5 == 0, d7 == 0 */
  1033.     z5 = d1 + d3;
  1034.     tmp3 = MULTIPLY(d1, FIX_0_211164243);
  1035.     tmp2 = MULTIPLY(-d3, FIX_1_451774981);
  1036.     z1 = MULTIPLY(d1, FIX_1_061594337);
  1037.     z2 = MULTIPLY(-d3, FIX_2_172734803);
  1038.     z4 = MULTIPLY(z5, FIX_0_785694958);
  1039.     z5 = MULTIPLY(z5, FIX_1_175875602);
  1040.     
  1041.     tmp0 = z1 - z4;
  1042.     tmp1 = z2 + z4;
  1043.     tmp2 += z5;
  1044.     tmp3 += z5;
  1045. } else {
  1046.     /* d1 == 0, d3 != 0, d5 == 0, d7 == 0 */
  1047.     tmp0 = MULTIPLY(-d3, FIX_0_785694958);
  1048.     tmp1 = MULTIPLY(-d3, FIX_1_387039845);
  1049.     tmp2 = MULTIPLY(-d3, FIX_0_275899380);
  1050.     tmp3 = MULTIPLY(d3, FIX_1_175875602);
  1051. }
  1052.     } else {
  1053. if (d1) {
  1054.     /* d1 != 0, d3 == 0, d5 == 0, d7 == 0 */
  1055.     tmp0 = MULTIPLY(d1, FIX_0_275899380);
  1056.     tmp1 = MULTIPLY(d1, FIX_0_785694958);
  1057.     tmp2 = MULTIPLY(d1, FIX_1_175875602);
  1058.     tmp3 = MULTIPLY(d1, FIX_1_387039845);
  1059. } else {
  1060.     /* d1 == 0, d3 == 0, d5 == 0, d7 == 0 */
  1061.     tmp0 = tmp1 = tmp2 = tmp3 = 0;
  1062. }
  1063.     }
  1064. }
  1065.     }
  1066.     /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  1067.     dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp3,
  1068.    CONST_BITS+PASS1_BITS+3);
  1069.     dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp10 - tmp3,
  1070.    CONST_BITS+PASS1_BITS+3);
  1071.     dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp11 + tmp2,
  1072.    CONST_BITS+PASS1_BITS+3);
  1073.     dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(tmp11 - tmp2,
  1074.    CONST_BITS+PASS1_BITS+3);
  1075.     dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp12 + tmp1,
  1076.    CONST_BITS+PASS1_BITS+3);
  1077.     dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12 - tmp1,
  1078.    CONST_BITS+PASS1_BITS+3);
  1079.     dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp13 + tmp0,
  1080.    CONST_BITS+PASS1_BITS+3);
  1081.     dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp13 - tmp0,
  1082.    CONST_BITS+PASS1_BITS+3);
  1083.     
  1084.     dataptr++; /* advance pointer to next column */
  1085.   }
  1086. }
  1087. #undef FIX
  1088. #undef CONST_BITS