1 /*****************************************************************************
2 * idct.c : C IDCT module
3 *****************************************************************************
4 * Copyright (C) 1999, 2000 VideoLAN
5 * $Id: idct.c,v 1.15 2001/09/05 16:07:49 massiot Exp $
7 * Author: Gaƫl Hendryckx <jimmy@via.ecp.fr>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
24 #define MODULE_NAME idct
25 #include "modules_inner.h"
27 /*****************************************************************************
29 *****************************************************************************/
44 #include "modules_export.h"
46 /*****************************************************************************
47 * Local and extern prototypes.
48 *****************************************************************************/
49 static void idct_getfunctions( function_list_t * p_function_list );
51 /*****************************************************************************
52 * Build configuration tree.
53 *****************************************************************************/
55 ADD_WINDOW( "Configuration for IDCT module" )
56 ADD_COMMENT( "Ha, ha -- nothing to configure yet" )
60 p_module->i_capabilities = MODULE_CAPABILITY_NULL
61 | MODULE_CAPABILITY_IDCT;
62 p_module->psz_longname = "IDCT module";
66 idct_getfunctions( &p_module->p_functions->idct );
69 MODULE_DEACTIVATE_START
70 MODULE_DEACTIVATE_STOP
72 /* Following functions are local */
74 /*****************************************************************************
75 * idct_Probe: returns a preference score
76 *****************************************************************************/
77 static int idct_Probe( probedata_t *p_data )
79 if( TestMethod( IDCT_METHOD_VAR, "idct" )
80 || TestMethod( IDCT_METHOD_VAR, "c" ))
85 /* This plugin always works */
89 /*****************************************************************************
90 * NormScan : Unused in this IDCT
91 *****************************************************************************/
92 static void NormScan( u8 ppi_scan[2][64] )
96 /*****************************************************************************
97 * IDCT : IDCT function for normal matrices
98 *****************************************************************************/
99 static __inline__ void IDCT( dctelem_t * p_block )
101 s32 tmp0, tmp1, tmp2, tmp3;
102 s32 tmp10, tmp11, tmp12, tmp13;
103 s32 z1, z2, z3, z4, z5;
104 s32 d0, d1, d2, d3, d4, d5, d6, d7;
110 /* Pass 1: process rows. */
111 /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
112 /* furthermore, we scale the results by 2**PASS1_BITS. */
116 for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--)
118 /* Due to quantization, we will usually find that many of the input
119 * coefficients are zero, especially the AC terms. We can exploit this
120 * by short-circuiting the IDCT calculation for any row in which all
121 * the AC terms are zero. In that case each output is equal to the
122 * DC coefficient (with scale factor as needed).
123 * With typical images and quantization tables, half or more of the
124 * row DCT calculations can be simplified this way.
127 register int * idataptr = (int*)dataptr;
130 if ( (d1 == 0) && ((idataptr[1] | idataptr[2] | idataptr[3]) == 0) )
132 /* AC terms all zero */
135 /* Compute a 32 bit value to assign. */
136 dctelem_t dcval = (dctelem_t) (d0 << PASS1_BITS);
137 register int v = (dcval & 0xffff) | (dcval << 16);
145 dataptr += DCTSIZE; /* advance pointer to next row */
155 /* Even part: reverse the even part of the forward DCT. */
156 /* The rotator is sqrt(2)*c(-6). */
165 /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
166 z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
167 tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
168 tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
170 tmp0 = (d0 + d4) << CONST_BITS;
171 tmp1 = (d0 - d4) << CONST_BITS;
180 /* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
181 z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
182 tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
183 tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
185 tmp0 = d4 << CONST_BITS;
190 tmp12 = -(tmp0 + tmp2);
197 /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
198 tmp2 = MULTIPLY(d6, - FIX2(1.306562965));
199 tmp3 = MULTIPLY(d6, FIX(0.541196100));
201 tmp0 = (d0 + d4) << CONST_BITS;
202 tmp1 = (d0 - d4) << CONST_BITS;
211 /* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
212 tmp2 = MULTIPLY(d6, - FIX2(1.306562965));
213 tmp3 = MULTIPLY(d6, FIX(0.541196100));
215 tmp0 = d4 << CONST_BITS;
220 tmp12 = -(tmp0 + tmp2);
230 /* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
231 z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
232 tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
233 tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
235 tmp0 = d0 << CONST_BITS;
244 /* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
245 z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
246 tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
247 tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
259 /* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
260 tmp2 = MULTIPLY(d6, - FIX2(1.306562965));
261 tmp3 = MULTIPLY(d6, FIX(0.541196100));
263 tmp0 = d0 << CONST_BITS;
272 /* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
273 tmp2 = MULTIPLY(d6, - FIX2(1.306562965));
274 tmp3 = MULTIPLY(d6, FIX(0.541196100));
292 /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
293 tmp2 = MULTIPLY(d2, FIX(0.541196100));
294 tmp3 = MULTIPLY(d2, (FIX(1.306562965) + .5));
296 tmp0 = (d0 + d4) << CONST_BITS;
297 tmp1 = (d0 - d4) << CONST_BITS;
306 /* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
307 tmp2 = MULTIPLY(d2, FIX(0.541196100));
308 tmp3 = MULTIPLY(d2, (FIX(1.306562965) + .5));
310 tmp0 = d4 << CONST_BITS;
315 tmp12 = -(tmp0 + tmp2);
322 /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
323 tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
324 tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
328 /* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
329 tmp10 = tmp13 = d4 << CONST_BITS;
330 tmp11 = tmp12 = -tmp10;
340 /* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
341 tmp2 = MULTIPLY(d2, FIX(0.541196100));
342 tmp3 = MULTIPLY(d2, (FIX(1.306562965) + .5));
344 tmp0 = d0 << CONST_BITS;
353 /* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
354 tmp2 = MULTIPLY(d2, FIX(0.541196100));
355 tmp3 = MULTIPLY(d2, (FIX(1.306562965) + .5));
367 /* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
368 tmp10 = tmp13 = tmp11 = tmp12 = d0 << CONST_BITS;
372 /* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
373 tmp10 = tmp13 = tmp11 = tmp12 = 0;
380 /* Odd part per figure 8; the matrix is unitary and hence its
381 * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
392 /* d1 != 0, d3 != 0, d5 != 0, d7 != 0 */
397 z5 = MULTIPLY(z3 + z4, FIX(1.175875602));
399 tmp0 = MULTIPLY(d7, FIX(0.298631336));
400 tmp1 = MULTIPLY(d5, FIX(2.053119869));
401 tmp2 = MULTIPLY(d3, FIX(3.072711026));
402 tmp3 = MULTIPLY(d1, FIX(1.501321110));
403 z1 = MULTIPLY(z1, - FIX(0.899976223));
404 z2 = MULTIPLY(z2, - FIX(2.562915447));
405 z3 = MULTIPLY(z3, - FIX(1.961570560));
406 z4 = MULTIPLY(z4, - FIX(0.390180644));
418 /* d1 == 0, d3 != 0, d5 != 0, d7 != 0 */
421 z5 = MULTIPLY(z3 + d5, FIX(1.175875602));
423 tmp0 = MULTIPLY(d7, FIX(0.298631336));
424 tmp1 = MULTIPLY(d5, FIX(2.053119869));
425 tmp2 = MULTIPLY(d3, FIX(3.072711026));
426 z1 = MULTIPLY(d7, - FIX(0.899976223));
427 z2 = MULTIPLY(z2, - FIX(2.562915447));
428 z3 = MULTIPLY(z3, - FIX(1.961570560));
429 z4 = MULTIPLY(d5, - FIX(0.390180644));
444 /* d1 != 0, d3 == 0, d5 != 0, d7 != 0 */
447 z5 = MULTIPLY(d7 + z4, FIX(1.175875602));
449 tmp0 = MULTIPLY(d7, FIX(0.298631336));
450 tmp1 = MULTIPLY(d5, FIX(2.053119869));
451 tmp3 = MULTIPLY(d1, FIX(1.501321110));
452 z1 = MULTIPLY(z1, - FIX(0.899976223));
453 z2 = MULTIPLY(d5, - FIX(2.562915447));
454 z3 = MULTIPLY(d7, - FIX(1.961570560));
455 z4 = MULTIPLY(z4, - FIX(0.390180644));
467 /* d1 == 0, d3 == 0, d5 != 0, d7 != 0 */
468 z5 = MULTIPLY(d7 + d5, FIX(1.175875602));
470 tmp0 = MULTIPLY(d7, - FIX2(0.601344887));
471 tmp1 = MULTIPLY(d5, - FIX2(0.509795578));
472 z1 = MULTIPLY(d7, - FIX(0.899976223));
473 z3 = MULTIPLY(d7, - FIX(1.961570560));
474 z2 = MULTIPLY(d5, - FIX(2.562915447));
475 z4 = MULTIPLY(d5, - FIX(0.390180644));
493 /* d1 != 0, d3 != 0, d5 == 0, d7 != 0 */
496 z5 = MULTIPLY(z3 + d1, FIX(1.175875602));
498 tmp0 = MULTIPLY(d7, FIX(0.298631336));
499 tmp2 = MULTIPLY(d3, FIX(3.072711026));
500 tmp3 = MULTIPLY(d1, FIX(1.501321110));
501 z1 = MULTIPLY(z1, - FIX(0.899976223));
502 z2 = MULTIPLY(d3, - FIX(2.562915447));
503 z3 = MULTIPLY(z3, - FIX(1.961570560));
504 z4 = MULTIPLY(d1, - FIX(0.390180644));
516 /* d1 == 0, d3 != 0, d5 == 0, d7 != 0 */
518 z5 = MULTIPLY(z3, FIX(1.175875602));
520 tmp0 = MULTIPLY(d7, - FIX2(0.601344887));
521 tmp2 = MULTIPLY(d3, FIX(0.509795579));
522 z1 = MULTIPLY(d7, - FIX(0.899976223));
523 z2 = MULTIPLY(d3, - FIX(2.562915447));
524 z3 = MULTIPLY(z3, - FIX2(0.785694958));
536 /* d1 != 0, d3 == 0, d5 == 0, d7 != 0 */
538 z5 = MULTIPLY(z1, FIX(1.175875602));
540 tmp0 = MULTIPLY(d7, - FIX2(1.662939224));
541 tmp3 = MULTIPLY(d1, FIX2(1.111140466));
542 z1 = MULTIPLY(z1, FIX2(0.275899379));
543 z3 = MULTIPLY(d7, - FIX(1.961570560));
544 z4 = MULTIPLY(d1, - FIX(0.390180644));
553 /* d1 == 0, d3 == 0, d5 == 0, d7 != 0 */
554 tmp0 = MULTIPLY(d7, - FIX2(1.387039845));
555 tmp1 = MULTIPLY(d7, FIX(1.175875602));
556 tmp2 = MULTIPLY(d7, - FIX2(0.785694958));
557 tmp3 = MULTIPLY(d7, FIX2(0.275899379));
570 /* d1 != 0, d3 != 0, d5 != 0, d7 == 0 */
573 z5 = MULTIPLY(d3 + z4, FIX(1.175875602));
575 tmp1 = MULTIPLY(d5, FIX(2.053119869));
576 tmp2 = MULTIPLY(d3, FIX(3.072711026));
577 tmp3 = MULTIPLY(d1, FIX(1.501321110));
578 z1 = MULTIPLY(d1, - FIX(0.899976223));
579 z2 = MULTIPLY(z2, - FIX(2.562915447));
580 z3 = MULTIPLY(d3, - FIX(1.961570560));
581 z4 = MULTIPLY(z4, - FIX(0.390180644));
593 /* d1 == 0, d3 != 0, d5 != 0, d7 == 0 */
595 z5 = MULTIPLY(z2, FIX(1.175875602));
597 tmp1 = MULTIPLY(d5, FIX2(1.662939225));
598 tmp2 = MULTIPLY(d3, FIX2(1.111140466));
599 z2 = MULTIPLY(z2, - FIX2(1.387039845));
600 z3 = MULTIPLY(d3, - FIX(1.961570560));
601 z4 = MULTIPLY(d5, - FIX(0.390180644));
613 /* d1 != 0, d3 == 0, d5 != 0, d7 == 0 */
615 z5 = MULTIPLY(z4, FIX(1.175875602));
617 tmp1 = MULTIPLY(d5, - FIX2(0.509795578));
618 tmp3 = MULTIPLY(d1, FIX2(0.601344887));
619 z1 = MULTIPLY(d1, - FIX(0.899976223));
620 z2 = MULTIPLY(d5, - FIX(2.562915447));
621 z4 = MULTIPLY(z4, FIX2(0.785694958));
630 /* d1 == 0, d3 == 0, d5 != 0, d7 == 0 */
631 tmp0 = MULTIPLY(d5, FIX(1.175875602));
632 tmp1 = MULTIPLY(d5, FIX2(0.275899380));
633 tmp2 = MULTIPLY(d5, - FIX2(1.387039845));
634 tmp3 = MULTIPLY(d5, FIX2(0.785694958));
644 /* d1 != 0, d3 != 0, d5 == 0, d7 == 0 */
647 tmp2 = MULTIPLY(d3, - FIX(1.451774981));
648 tmp3 = MULTIPLY(d1, (FIX(0.211164243) - 1));
649 z1 = MULTIPLY(d1, FIX(1.061594337));
650 z2 = MULTIPLY(d3, - FIX(2.172734803));
651 z4 = MULTIPLY(z5, FIX(0.785694958));
652 z5 = MULTIPLY(z5, FIX(1.175875602));
661 /* d1 == 0, d3 != 0, d5 == 0, d7 == 0 */
662 tmp0 = MULTIPLY(d3, - FIX2(0.785694958));
663 tmp1 = MULTIPLY(d3, - FIX2(1.387039845));
664 tmp2 = MULTIPLY(d3, - FIX2(0.275899379));
665 tmp3 = MULTIPLY(d3, FIX(1.175875602));
672 /* d1 != 0, d3 == 0, d5 == 0, d7 == 0 */
673 tmp0 = MULTIPLY(d1, FIX2(0.275899379));
674 tmp1 = MULTIPLY(d1, FIX2(0.785694958));
675 tmp2 = MULTIPLY(d1, FIX(1.175875602));
676 tmp3 = MULTIPLY(d1, FIX2(1.387039845));
680 /* d1 == 0, d3 == 0, d5 == 0, d7 == 0 */
681 tmp0 = tmp1 = tmp2 = tmp3 = 0;
687 /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
689 dataptr[0] = (dctelem_t) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
690 dataptr[7] = (dctelem_t) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
691 dataptr[1] = (dctelem_t) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
692 dataptr[6] = (dctelem_t) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
693 dataptr[2] = (dctelem_t) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
694 dataptr[5] = (dctelem_t) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
695 dataptr[3] = (dctelem_t) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
696 dataptr[4] = (dctelem_t) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
698 dataptr += DCTSIZE; /* advance pointer to next row */
701 /* Pass 2: process columns. */
702 /* Note that we must descale the results by a factor of 8 == 2**3, */
703 /* and also undo the PASS1_BITS scaling. */
706 for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--)
708 /* Columns of zeroes can be exploited in the same way as we did with rows.
709 * However, the row calculation has created many nonzero AC terms, so the
710 * simplification applies less often (typically 5% to 10% of the time).
711 * On machines with very fast multiplication, it's possible that the
712 * test takes more time than it's worth. In that case this section
713 * may be commented out.
716 d0 = dataptr[DCTSIZE*0];
717 d1 = dataptr[DCTSIZE*1];
718 d2 = dataptr[DCTSIZE*2];
719 d3 = dataptr[DCTSIZE*3];
720 d4 = dataptr[DCTSIZE*4];
721 d5 = dataptr[DCTSIZE*5];
722 d6 = dataptr[DCTSIZE*6];
723 d7 = dataptr[DCTSIZE*7];
725 /* Even part: reverse the even part of the forward DCT. */
726 /* The rotator is sqrt(2)*c(-6). */
735 /* d0 != 0, d2 != 0, d4 != 0, d6 != 0 */
736 z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
737 tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
738 tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
740 tmp0 = (d0 + d4) << CONST_BITS;
741 tmp1 = (d0 - d4) << CONST_BITS;
750 /* d0 == 0, d2 != 0, d4 != 0, d6 != 0 */
751 z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
752 tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
753 tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
755 tmp0 = d4 << CONST_BITS;
760 tmp12 = -(tmp0 + tmp2);
767 /* d0 != 0, d2 == 0, d4 != 0, d6 != 0 */
768 tmp2 = MULTIPLY(d6, - FIX2(1.306562965));
769 tmp3 = MULTIPLY(d6, FIX(0.541196100));
771 tmp0 = (d0 + d4) << CONST_BITS;
772 tmp1 = (d0 - d4) << CONST_BITS;
781 /* d0 == 0, d2 == 0, d4 != 0, d6 != 0 */
782 tmp2 = MULTIPLY(d6, -FIX2(1.306562965));
783 tmp3 = MULTIPLY(d6, FIX(0.541196100));
785 tmp0 = d4 << CONST_BITS;
790 tmp12 = -(tmp0 + tmp2);
800 /* d0 != 0, d2 != 0, d4 == 0, d6 != 0 */
801 z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
802 tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
803 tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
805 tmp0 = d0 << CONST_BITS;
814 /* d0 == 0, d2 != 0, d4 == 0, d6 != 0 */
815 z1 = MULTIPLY(d2 + d6, FIX(0.541196100));
816 tmp2 = z1 + MULTIPLY(d6, - FIX(1.847759065));
817 tmp3 = z1 + MULTIPLY(d2, FIX(0.765366865));
829 /* d0 != 0, d2 == 0, d4 == 0, d6 != 0 */
830 tmp2 = MULTIPLY(d6, - FIX2(1.306562965));
831 tmp3 = MULTIPLY(d6, FIX(0.541196100));
833 tmp0 = d0 << CONST_BITS;
842 /* d0 == 0, d2 == 0, d4 == 0, d6 != 0 */
843 tmp2 = MULTIPLY(d6, - FIX2(1.306562965));
844 tmp3 = MULTIPLY(d6, FIX(0.541196100));
861 /* d0 != 0, d2 != 0, d4 != 0, d6 == 0 */
862 tmp2 = MULTIPLY(d2, FIX(0.541196100));
863 tmp3 = MULTIPLY(d2, (FIX(1.306562965) + .5));
865 tmp0 = (d0 + d4) << CONST_BITS;
866 tmp1 = (d0 - d4) << CONST_BITS;
875 /* d0 == 0, d2 != 0, d4 != 0, d6 == 0 */
876 tmp2 = MULTIPLY(d2, FIX(0.541196100));
877 tmp3 = MULTIPLY(d2, (FIX(1.306562965) + .5));
879 tmp0 = d4 << CONST_BITS;
884 tmp12 = -(tmp0 + tmp2);
891 /* d0 != 0, d2 == 0, d4 != 0, d6 == 0 */
892 tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
893 tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
897 /* d0 == 0, d2 == 0, d4 != 0, d6 == 0 */
898 tmp10 = tmp13 = d4 << CONST_BITS;
899 tmp11 = tmp12 = -tmp10;
909 /* d0 != 0, d2 != 0, d4 == 0, d6 == 0 */
910 tmp2 = MULTIPLY(d2, FIX(0.541196100));
911 tmp3 = MULTIPLY(d2, (FIX(1.306562965) + .5));
913 tmp0 = d0 << CONST_BITS;
922 /* d0 == 0, d2 != 0, d4 == 0, d6 == 0 */
923 tmp2 = MULTIPLY(d2, FIX(0.541196100));
924 tmp3 = MULTIPLY(d2, (FIX(1.306562965) + .5));
936 /* d0 != 0, d2 == 0, d4 == 0, d6 == 0 */
937 tmp10 = tmp13 = tmp11 = tmp12 = d0 << CONST_BITS;
941 /* d0 == 0, d2 == 0, d4 == 0, d6 == 0 */
942 tmp10 = tmp13 = tmp11 = tmp12 = 0;
948 /* Odd part per figure 8; the matrix is unitary and hence its
949 * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
959 /* d1 != 0, d3 != 0, d5 != 0, d7 != 0 */
964 z5 = MULTIPLY(z3 + z4, FIX(1.175875602));
966 tmp0 = MULTIPLY(d7, FIX(0.298631336));
967 tmp1 = MULTIPLY(d5, FIX(2.053119869));
968 tmp2 = MULTIPLY(d3, FIX(3.072711026));
969 tmp3 = MULTIPLY(d1, FIX(1.501321110));
970 z1 = MULTIPLY(z1, - FIX(0.899976223));
971 z2 = MULTIPLY(z2, - FIX(2.562915447));
972 z3 = MULTIPLY(z3, - FIX(1.961570560));
973 z4 = MULTIPLY(z4, - FIX(0.390180644));
985 /* d1 == 0, d3 != 0, d5 != 0, d7 != 0 */
988 z5 = MULTIPLY(z3 + d5, FIX(1.175875602));
990 tmp0 = MULTIPLY(d7, FIX(0.298631336));
991 tmp1 = MULTIPLY(d5, FIX(2.053119869));
992 tmp2 = MULTIPLY(d3, FIX(3.072711026));
993 z1 = MULTIPLY(d7, - FIX(0.899976223));
994 z2 = MULTIPLY(z2, - FIX(2.562915447));
995 z3 = MULTIPLY(z3, - FIX(1.961570560));
996 z4 = MULTIPLY(d5, - FIX(0.390180644));
1011 /* d1 != 0, d3 == 0, d5 != 0, d7 != 0 */
1014 z5 = MULTIPLY(d7 + z4, FIX(1.175875602));
1016 tmp0 = MULTIPLY(d7, FIX(0.298631336));
1017 tmp1 = MULTIPLY(d5, FIX(2.053119869));
1018 tmp3 = MULTIPLY(d1, FIX(1.501321110));
1019 z1 = MULTIPLY(z1, - FIX(0.899976223));
1020 z2 = MULTIPLY(d5, - FIX(2.562915447));
1021 z3 = MULTIPLY(d7, - FIX(1.961570560));
1022 z4 = MULTIPLY(z4, - FIX(0.390180644));
1034 /* d1 == 0, d3 == 0, d5 != 0, d7 != 0 */
1035 z5 = MULTIPLY(d5 + d7, FIX(1.175875602));
1037 tmp0 = MULTIPLY(d7, - FIX2(0.601344887));
1038 tmp1 = MULTIPLY(d5, - FIX2(0.509795578));
1039 z1 = MULTIPLY(d7, - FIX(0.899976223));
1040 z3 = MULTIPLY(d7, - FIX(1.961570560));
1041 z2 = MULTIPLY(d5, - FIX(2.562915447));
1042 z4 = MULTIPLY(d5, - FIX(0.390180644));
1060 /* d1 != 0, d3 != 0, d5 == 0, d7 != 0 */
1063 z5 = MULTIPLY(z3 + d1, FIX(1.175875602));
1065 tmp0 = MULTIPLY(d7, FIX(0.298631336));
1066 tmp2 = MULTIPLY(d3, FIX(3.072711026));
1067 tmp3 = MULTIPLY(d1, FIX(1.501321110));
1068 z1 = MULTIPLY(z1, - FIX(0.899976223));
1069 z2 = MULTIPLY(d3, - FIX(2.562915447));
1070 z3 = MULTIPLY(z3, - FIX(1.961570560));
1071 z4 = MULTIPLY(d1, - FIX(0.390180644));
1083 /* d1 == 0, d3 != 0, d5 == 0, d7 != 0 */
1085 z5 = MULTIPLY(z3, FIX(1.175875602));
1087 tmp0 = MULTIPLY(d7, - FIX2(0.601344887));
1088 z1 = MULTIPLY(d7, - FIX(0.899976223));
1089 tmp2 = MULTIPLY(d3, FIX(0.509795579));
1090 z2 = MULTIPLY(d3, - FIX(2.562915447));
1091 z3 = MULTIPLY(z3, - FIX2(0.785694958));
1103 /* d1 != 0, d3 == 0, d5 == 0, d7 != 0 */
1105 z5 = MULTIPLY(z1, FIX(1.175875602));
1107 tmp0 = MULTIPLY(d7, - FIX2(1.662939224));
1108 tmp3 = MULTIPLY(d1, FIX2(1.111140466));
1109 z1 = MULTIPLY(z1, FIX2(0.275899379));
1110 z3 = MULTIPLY(d7, - FIX(1.961570560));
1111 z4 = MULTIPLY(d1, - FIX(0.390180644));
1120 /* d1 == 0, d3 == 0, d5 == 0, d7 != 0 */
1121 tmp0 = MULTIPLY(d7, - FIX2(1.387039845));
1122 tmp1 = MULTIPLY(d7, FIX(1.175875602));
1123 tmp2 = MULTIPLY(d7, - FIX2(0.785694958));
1124 tmp3 = MULTIPLY(d7, FIX2(0.275899379));
1137 /* d1 != 0, d3 != 0, d5 != 0, d7 == 0 */
1140 z5 = MULTIPLY(d3 + z4, FIX(1.175875602));
1142 tmp1 = MULTIPLY(d5, FIX(2.053119869));
1143 tmp2 = MULTIPLY(d3, FIX(3.072711026));
1144 tmp3 = MULTIPLY(d1, FIX(1.501321110));
1145 z1 = MULTIPLY(d1, - FIX(0.899976223));
1146 z2 = MULTIPLY(z2, - FIX(2.562915447));
1147 z3 = MULTIPLY(d3, - FIX(1.961570560));
1148 z4 = MULTIPLY(z4, - FIX(0.390180644));
1160 /* d1 == 0, d3 != 0, d5 != 0, d7 == 0 */
1162 z5 = MULTIPLY(z2, FIX(1.175875602));
1164 tmp1 = MULTIPLY(d5, FIX2(1.662939225));
1165 tmp2 = MULTIPLY(d3, FIX2(1.111140466));
1166 z2 = MULTIPLY(z2, - FIX2(1.387039845));
1167 z3 = MULTIPLY(d3, - FIX(1.961570560));
1168 z4 = MULTIPLY(d5, - FIX(0.390180644));
1180 /* d1 != 0, d3 == 0, d5 != 0, d7 == 0 */
1182 z5 = MULTIPLY(z4, FIX(1.175875602));
1184 tmp1 = MULTIPLY(d5, - FIX2(0.509795578));
1185 tmp3 = MULTIPLY(d1, FIX2(0.601344887));
1186 z1 = MULTIPLY(d1, - FIX(0.899976223));
1187 z2 = MULTIPLY(d5, - FIX(2.562915447));
1188 z4 = MULTIPLY(z4, FIX2(0.785694958));
1197 /* d1 == 0, d3 == 0, d5 != 0, d7 == 0 */
1198 tmp0 = MULTIPLY(d5, FIX(1.175875602));
1199 tmp1 = MULTIPLY(d5, FIX2(0.275899380));
1200 tmp2 = MULTIPLY(d5, - FIX2(1.387039845));
1201 tmp3 = MULTIPLY(d5, FIX2(0.785694958));
1211 /* d1 != 0, d3 != 0, d5 == 0, d7 == 0 */
1214 tmp2 = MULTIPLY(d3, - FIX(1.451774981));
1215 tmp3 = MULTIPLY(d1, (FIX(0.211164243) - 1));
1216 z1 = MULTIPLY(d1, FIX(1.061594337));
1217 z2 = MULTIPLY(d3, - FIX(2.172734803));
1218 z4 = MULTIPLY(z5, FIX(0.785694958));
1219 z5 = MULTIPLY(z5, FIX(1.175875602));
1228 /* d1 == 0, d3 != 0, d5 == 0, d7 == 0 */
1229 tmp0 = MULTIPLY(d3, - FIX2(0.785694958));
1230 tmp1 = MULTIPLY(d3, - FIX2(1.387039845));
1231 tmp2 = MULTIPLY(d3, - FIX2(0.275899379));
1232 tmp3 = MULTIPLY(d3, FIX(1.175875602));
1239 /* d1 != 0, d3 == 0, d5 == 0, d7 == 0 */
1240 tmp0 = MULTIPLY(d1, FIX2(0.275899379));
1241 tmp1 = MULTIPLY(d1, FIX2(0.785694958));
1242 tmp2 = MULTIPLY(d1, FIX(1.175875602));
1243 tmp3 = MULTIPLY(d1, FIX2(1.387039845));
1247 /* d1 == 0, d3 == 0, d5 == 0, d7 == 0 */
1248 tmp0 = tmp1 = tmp2 = tmp3 = 0;
1254 /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
1256 dataptr[DCTSIZE*0] = (dctelem_t) DESCALE(tmp10 + tmp3,
1257 CONST_BITS+PASS1_BITS+3);
1258 dataptr[DCTSIZE*7] = (dctelem_t) DESCALE(tmp10 - tmp3,
1259 CONST_BITS+PASS1_BITS+3);
1260 dataptr[DCTSIZE*1] = (dctelem_t) DESCALE(tmp11 + tmp2,
1261 CONST_BITS+PASS1_BITS+3);
1262 dataptr[DCTSIZE*6] = (dctelem_t) DESCALE(tmp11 - tmp2,
1263 CONST_BITS+PASS1_BITS+3);
1264 dataptr[DCTSIZE*2] = (dctelem_t) DESCALE(tmp12 + tmp1,
1265 CONST_BITS+PASS1_BITS+3);
1266 dataptr[DCTSIZE*5] = (dctelem_t) DESCALE(tmp12 - tmp1,
1267 CONST_BITS+PASS1_BITS+3);
1268 dataptr[DCTSIZE*3] = (dctelem_t) DESCALE(tmp13 + tmp0,
1269 CONST_BITS+PASS1_BITS+3);
1270 dataptr[DCTSIZE*4] = (dctelem_t) DESCALE(tmp13 - tmp0,
1271 CONST_BITS+PASS1_BITS+3);
1273 dataptr++; /* advance pointer to next column */
1277 #include "idct_sparse.h"
1278 #include "idct_decl.h"