1.  
  2. <!-- saved from url=(0057)http://www.prettyprinter.de/module.php?name=PrettyPrinter -->
  3. <HTML><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"></HEAD><BODY>extern void mdct_backward(int n, int *in, int *out);
  4. extern int ff_mdct_init(MDCTContext *s, int nbits, int inverse);
  5. extern void ff_imdct_calc(MDCTContext *s, int *output, int *input);
  6. extern int mdct_init_global(void);
  7. # 85 "/home/mike/rockbox/mdct/apps/codecs/lib/codeclib.h"
  8. extern const unsigned char bs_log2_tab[256] ;
  9. extern const unsigned char bs_clz_tab[256] ;
  10. # 96 "/home/mike/rockbox/mdct/apps/codecs/lib/codeclib.h"
  11. static inline unsigned int bs_generic(unsigned int v, int mode)
  12. {
  13.     # 111 "/home/mike/rockbox/mdct/apps/codecs/lib/codeclib.h"
  14.     const unsigned char *bs_tab;
  15.     unsigned int r;
  16.     unsigned int n = v;
  17.     int inc;
  18.     if (mode &amp; 1)
  19.     {
  20.         bs_tab = bs_clz_tab;
  21.         r = 24;
  22.         inc = -16;
  23.     }
  24.     else {
  25.         bs_tab = bs_log2_tab;
  26.         r = 0;
  27.         inc = 16;
  28.     }
  29.     if (!(mode &amp; 2) &amp;&amp; n &gt;
  30.     = 0x10000) {
  31.         n &gt;
  32.         &gt;
  33.         = 16;
  34.         r += inc;
  35.     }
  36.     if (n &gt;
  37.     0xff) {
  38.         n &gt;
  39.         &gt;
  40.         = 8;
  41.         r += inc / 2;
  42.     }
  43.     # 145 "/home/mike/rockbox/mdct/apps/codecs/lib/codeclib.h"
  44.     n = bs_tab[n];
  45.     r += n;
  46.     if (mode &amp; 1 &amp;&amp; mode &amp; 4 &amp;&amp; v == 0)
  47.     r = 0;
  48.     return r;
  49. }
  50. int codec_init(void);
  51. void codec_set_replaygain(struct mp3entry* id3);
  52. # 36 "/home/mike/rockbox/mdct/apps/codecs/lib/fft-ffmpeg.c" 2
  53. # 44 "/home/mike/rockbox/mdct/apps/codecs/lib/fft-ffmpeg.c"
  54. static void ff_fft_permute_c(FFTContext *s, FFTComplex *z);
  55. # 55 "/home/mike/rockbox/mdct/apps/codecs/lib/fft-ffmpeg.c"
  56. int flattabs[8+16+32+64+128+256+512+1024+2048];
  57. int * tabstabstabs[] = {
  58.     flattabs, flattabs+8, flattabs+8+16,flattabs+8+16+32, flattabs+8+16+32+64,
  59.     flattabs+8+16+32+64+128, flattabs+8+16+32+64+128+256,
  60.     flattabs+8+16+32+64+128+256+512, flattabs+8+16+32+64+128+256+512+1024
  61. }
  62. ;
  63. int muls, adds;
  64. # 84 "/home/mike/rockbox/mdct/apps/codecs/lib/fft-ffmpeg.c"
  65. static FFTSample * ff_cos_16 = ((void *)0);
  66. static FFTSample * ff_cos_32 = ((void *)0);
  67. static FFTSample * ff_cos_64 = ((void *)0);
  68. static FFTSample * ff_cos_128 = ((void *)0);
  69. static FFTSample * ff_cos_256 = ((void *)0);
  70. static FFTSample * ff_cos_512 = ((void *)0);
  71. static FFTSample * ff_cos_1024 = ((void *)0);
  72. static FFTSample * ff_cos_2048 = ((void *)0);
  73. static FFTSample * ff_cos_4096 = ((void *)0);
  74. # 101 "/home/mike/rockbox/mdct/apps/codecs/lib/fft-ffmpeg.c"
  75. static FFTSample ** const ff_cos_tabs[] = {
  76.     &amp;ff_cos_16, &amp;ff_cos_32, &amp;ff_cos_64, &amp;ff_cos_128, &amp;ff_cos_256, &amp;ff_cos_512, &amp;ff_cos_1024,
  77.     &amp;ff_cos_2048, &amp;ff_cos_4096
  78. }
  79. ;
  80. unsigned short revtab[1&lt;
  81. &lt;
  82. 12];
  83. FFTComplex exptab[1&lt;
  84. &lt;
  85. 11], tmp_buf[1&lt;
  86. &lt;
  87. 12];
  88. static int split_radix_permutation(int i, int n, int inverse)
  89. {
  90.     int m;
  91.     if(n &lt;
  92.     = 2) return i&amp;1;
  93.     m = n &gt;
  94.     &gt;
  95.     1;
  96.     if(!(i&amp;m)) return split_radix_permutation(i, m, inverse)*2;
  97.     m &gt;
  98.     &gt;
  99.     = 1;
  100.     if(inverse == !(i&amp;m)) return split_radix_permutation(i, m, inverse)*4 + 1;
  101.     else return split_radix_permutation(i, m, inverse)*4 - 1;
  102. }
  103. int ff_fft_init(void *arg_s, int nbits, int inverse)
  104. {
  105.     int i, j, n;
  106.     FFTContext *s = (FFTContext *)(arg_s);
  107.     fixed32 temp, phase;
  108.     if (nbits &lt;
  109.     2 || nbits &gt;
  110.     12)
  111.     return -1;
  112.     s-&gt;
  113.     nbits = nbits;
  114.     n = 1 &lt;
  115.     &lt;
  116.     nbits;
  117.     s-&gt;
  118.     tmp_buf = ((void *)0);
  119.     s-&gt;
  120.     exptab = exptab;
  121.     s-&gt;
  122.     revtab = revtab;
  123.     s-&gt;
  124.     inverse = inverse;
  125.     s-&gt;
  126.     fft_permute = ff_fft_permute_c;
  127.     s-&gt;
  128.     fft_calc = ff_fft_calc_c;
  129.     s-&gt;
  130.     split_radix = 1;
  131.     # 152 "/home/mike/rockbox/mdct/apps/codecs/lib/fft-ffmpeg.c"
  132.     for(j=4; j&lt;=nbits; j++) {
  133.         int m = 1&lt;
  134.         &lt;
  135.         j;
  136.         FFTSample *tab = *(ff_cos_tabs[j-4]);
  137.         if(((void *)0)==tab)
  138.         {
  139.             tab = tabstabstabs[j-4];
  140.             *(ff_cos_tabs[j-4]) = tab;
  141.             for(i=0; i&lt;=m/4; i++) {
  142.                 phase = ((i&lt;
  143.                 &lt;
  144.                 16) / m)&lt;
  145.                 &lt;
  146.                 16;
  147.                 fsincos(phase, &amp;temp);
  148.                 tab[i] = temp&gt;
  149.                 &gt;
  150.                 15;
  151.             }
  152.             for(i=1; i&lt;m/4; i++)
  153.             tab[m/2-i] = tab[i];
  154.         }
  155.     }
  156.     for(i=0; i&lt;n; i++)
  157.     s-&gt;
  158.     revtab[-split_radix_permutation(i, n, s-&gt;
  159.     inverse) &amp; (n-1)] = i;
  160.     s-&gt;
  161.     tmp_buf = tmp_buf;
  162.     return 0;
  163. }
  164. static void ff_fft_permute_c(FFTContext *s, FFTComplex *z)
  165. {
  166.     int j, k, np;
  167.     FFTComplex tmp;
  168.     const unsigned short *revtab = s-&gt;
  169.     revtab;
  170.     np = 1 &lt;
  171.     &lt;
  172.     s-&gt;
  173.     nbits;
  174.     if (s-&gt;
  175.     tmp_buf) {
  176.         for(j=0;j&lt;np;j++) s-&gt;tmp_buf[revtab[j]] = z[j];
  177.         memcpy(z, s-&gt;
  178.         tmp_buf, np * sizeof(FFTComplex));
  179.         return;
  180.     }
  181.     for(j=0;j&lt;np;j++) {
  182.         k = revtab[j];
  183.         if (k &lt;
  184.         j) {
  185.             tmp = z[k];
  186.             z[k] = z[j];
  187.             z[j] = tmp;
  188.         }
  189.     }
  190. }
  191. # 292 "/home/mike/rockbox/mdct/apps/codecs/lib/fft-ffmpeg.c"
  192. static void pass(FFTComplex *z, const FFTSample *wre, unsigned int n){
  193.     FFTSample t1, t2, t3, t4, t5, t6;
  194.     int o1 = 2*n;
  195.     int o2 = 4*n;
  196.     int o3 = 6*n;
  197.     muls += 3;
  198.     const FFTSample *wim = wre+o1;
  199.     n--;
  200.     adds += 2;
  201.     {
  202.         t1 = z[o2].re;
  203.         t2 = z[o2].im;
  204.         t5 = z[o3].re;
  205.         t6 = z[o3].im;
  206.         {
  207.             {
  208.                 t3 = t5 - t1;
  209.                 t5 = t5 + t1;
  210.                 adds += 2;
  211.             }
  212.             ;
  213.             {
  214.                 z[o2].re = z[0].re - t5;
  215.                 z[0].re = z[0].re + t5;
  216.                 adds += 2;
  217.             }
  218.             ;
  219.             {
  220.                 z[o3].im = z[o1].im - t3;
  221.                 z[o1].im = z[o1].im + t3;
  222.                 adds += 2;
  223.             }
  224.             ;
  225.             {
  226.                 t4 = t2 - t6;
  227.                 t6 = t2 + t6;
  228.                 adds += 2;
  229.             }
  230.             ;
  231.             {
  232.                 z[o3].re = z[o1].re - t4;
  233.                 z[o1].re = z[o1].re + t4;
  234.                 adds += 2;
  235.             }
  236.             ;
  237.             {
  238.                 z[o2].im = z[0].im - t6;
  239.                 z[0].im = z[0].im + t6;
  240.                 adds += 2;
  241.             }
  242.             ;
  243.         }
  244.     }
  245.     ;
  246.     {
  247.         t1 = fixmul32(z[o2+1].re, wre[1]) + fixmul32(z[o2+1].im, wim[-1]);
  248.         t2 = fixmul32(z[o2+1].im, wre[1]) - fixmul32(z[o2+1].re, wim[-1]);
  249.         t5 = fixmul32(z[o3+1].re, wre[1]) - fixmul32(z[o3+1].im, wim[-1]);
  250.         t6 = fixmul32(z[o3+1].im, wre[1]) + fixmul32(z[o3+1].re, wim[-1]);
  251.         muls += 8;
  252.         {
  253.             {
  254.                 t3 = t5 - t1;
  255.                 t5 = t5 + t1;
  256.                 adds += 2;
  257.             }
  258.             ;
  259.             {
  260.                 z[o2+1].re = z[1].re - t5;
  261.                 z[1].re = z[1].re + t5;
  262.                 adds += 2;
  263.             }
  264.             ;
  265.             {
  266.                 z[o3+1].im = z[o1+1].im - t3;
  267.                 z[o1+1].im = z[o1+1].im + t3;
  268.                 adds += 2;
  269.             }
  270.             ;
  271.             {
  272.                 t4 = t2 - t6;
  273.                 t6 = t2 + t6;
  274.                 adds += 2;
  275.             }
  276.             ;
  277.             {
  278.                 z[o3+1].re = z[o1+1].re - t4;
  279.                 z[o1+1].re = z[o1+1].re + t4;
  280.                 adds += 2;
  281.             }
  282.             ;
  283.             {
  284.                 z[o2+1].im = z[1].im - t6;
  285.                 z[1].im = z[1].im + t6;
  286.                 adds += 2;
  287.             }
  288.             ;
  289.         }
  290.     }
  291.     ;
  292.     do {
  293.         z += 2;
  294.         wre += 2;
  295.         wim -= 2;
  296.         {
  297.             t1 = fixmul32(z[o2].re, wre[0]) + fixmul32(z[o2].im, wim[0]);
  298.             t2 = fixmul32(z[o2].im, wre[0]) - fixmul32(z[o2].re, wim[0]);
  299.             t5 = fixmul32(z[o3].re, wre[0]) - fixmul32(z[o3].im, wim[0]);
  300.             t6 = fixmul32(z[o3].im, wre[0]) + fixmul32(z[o3].re, wim[0]);
  301.             muls += 8;
  302.             {
  303.                 {
  304.                     t3 = t5 - t1;
  305.                     t5 = t5 + t1;
  306.                     adds += 2;
  307.                 }
  308.                 ;
  309.                 {
  310.                     z[o2].re = z[0].re - t5;
  311.                     z[0].re = z[0].re + t5;
  312.                     adds += 2;
  313.                 }
  314.                 ;
  315.                 {
  316.                     z[o3].im = z[o1].im - t3;
  317.                     z[o1].im = z[o1].im + t3;
  318.                     adds += 2;
  319.                 }
  320.                 ;
  321.                 {
  322.                     t4 = t2 - t6;
  323.                     t6 = t2 + t6;
  324.                     adds += 2;
  325.                 }
  326.                 ;
  327.                 {
  328.                     z[o3].re = z[o1].re - t4;
  329.                     z[o1].re = z[o1].re + t4;
  330.                     adds += 2;
  331.                 }
  332.                 ;
  333.                 {
  334.                     z[o2].im = z[0].im - t6;
  335.                     z[0].im = z[0].im + t6;
  336.                     adds += 2;
  337.                 }
  338.                 ;
  339.             }
  340.         }
  341.         ;
  342.         {
  343.             t1 = fixmul32(z[o2+1].re, wre[1]) + fixmul32(z[o2+1].im, wim[-1]);
  344.             t2 = fixmul32(z[o2+1].im, wre[1]) - fixmul32(z[o2+1].re, wim[-1]);
  345.             t5 = fixmul32(z[o3+1].re, wre[1]) - fixmul32(z[o3+1].im, wim[-1]);
  346.             t6 = fixmul32(z[o3+1].im, wre[1]) + fixmul32(z[o3+1].re, wim[-1]);
  347.             muls += 8;
  348.             {
  349.                 {
  350.                     t3 = t5 - t1;
  351.                     t5 = t5 + t1;
  352.                     adds += 2;
  353.                 }
  354.                 ;
  355.                 {
  356.                     z[o2+1].re = z[1].re - t5;
  357.                     z[1].re = z[1].re + t5;
  358.                     adds += 2;
  359.                 }
  360.                 ;
  361.                 {
  362.                     z[o3+1].im = z[o1+1].im - t3;
  363.                     z[o1+1].im = z[o1+1].im + t3;
  364.                     adds += 2;
  365.                 }
  366.                 ;
  367.                 {
  368.                     t4 = t2 - t6;
  369.                     t6 = t2 + t6;
  370.                     adds += 2;
  371.                 }
  372.                 ;
  373.                 {
  374.                     z[o3+1].re = z[o1+1].re - t4;
  375.                     z[o1+1].re = z[o1+1].re + t4;
  376.                     adds += 2;
  377.                 }
  378.                 ;
  379.                 {
  380.                     z[o2+1].im = z[1].im - t6;
  381.                     z[1].im = z[1].im + t6;
  382.                     adds += 2;
  383.                 }
  384.                 ;
  385.             }
  386.         }
  387.         ;
  388.         adds += 4;
  389.     }
  390.     while(--n);
  391. }
  392. static void pass_big(FFTComplex *z, const FFTSample *wre, unsigned int n){
  393.     FFTSample t1, t2, t3, t4, t5, t6;
  394.     int o1 = 2*n;
  395.     int o2 = 4*n;
  396.     int o3 = 6*n;
  397.     muls += 3;
  398.     const FFTSample *wim = wre+o1;
  399.     n--;
  400.     adds += 2;
  401.     {
  402.         t1 = z[o2].re;
  403.         t2 = z[o2].im;
  404.         t5 = z[o3].re;
  405.         t6 = z[o3].im;
  406.         {
  407.             FFTSample r0=z[0].re, i0=z[0].im, r1=z[o1].re, i1=z[o1].im;
  408.             {
  409.                 t3 = t5 - t1;
  410.                 t5 = t5 + t1;
  411.                 adds += 2;
  412.             }
  413.             ;
  414.             {
  415.                 z[o2].re = r0 - t5;
  416.                 z[0].re = r0 + t5;
  417.                 adds += 2;
  418.             }
  419.             ;
  420.             {
  421.                 z[o3].im = i1 - t3;
  422.                 z[o1].im = i1 + t3;
  423.                 adds += 2;
  424.             }
  425.             ;
  426.             {
  427.                 t4 = t2 - t6;
  428.                 t6 = t2 + t6;
  429.                 adds += 2;
  430.             }
  431.             ;
  432.             {
  433.                 z[o3].re = r1 - t4;
  434.                 z[o1].re = r1 + t4;
  435.                 adds += 2;
  436.             }
  437.             ;
  438.             {
  439.                 z[o2].im = i0 - t6;
  440.                 z[0].im = i0 + t6;
  441.                 adds += 2;
  442.             }
  443.             ;
  444.         }
  445.     }
  446.     ;
  447.     {
  448.         t1 = fixmul32(z[o2+1].re, wre[1]) + fixmul32(z[o2+1].im, wim[-1]);
  449.         t2 = fixmul32(z[o2+1].im, wre[1]) - fixmul32(z[o2+1].re, wim[-1]);
  450.         t5 = fixmul32(z[o3+1].re, wre[1]) - fixmul32(z[o3+1].im, wim[-1]);
  451.         t6 = fixmul32(z[o3+1].im, wre[1]) + fixmul32(z[o3+1].re, wim[-1]);
  452.         muls += 8;
  453.         {
  454.             FFTSample r0=z[1].re, i0=z[1].im, r1=z[o1+1].re, i1=z[o1+1].im;
  455.             {
  456.                 t3 = t5 - t1;
  457.                 t5 = t5 + t1;
  458.                 adds += 2;
  459.             }
  460.             ;
  461.             {
  462.                 z[o2+1].re = r0 - t5;
  463.                 z[1].re = r0 + t5;
  464.                 adds += 2;
  465.             }
  466.             ;
  467.             {
  468.                 z[o3+1].im = i1 - t3;
  469.                 z[o1+1].im = i1 + t3;
  470.                 adds += 2;
  471.             }
  472.             ;
  473.             {
  474.                 t4 = t2 - t6;
  475.                 t6 = t2 + t6;
  476.                 adds += 2;
  477.             }
  478.             ;
  479.             {
  480.                 z[o3+1].re = r1 - t4;
  481.                 z[o1+1].re = r1 + t4;
  482.                 adds += 2;
  483.             }
  484.             ;
  485.             {
  486.                 z[o2+1].im = i0 - t6;
  487.                 z[1].im = i0 + t6;
  488.                 adds += 2;
  489.             }
  490.             ;
  491.         }
  492.     }
  493.     ;
  494.     do {
  495.         z += 2;
  496.         wre += 2;
  497.         wim -= 2;
  498.         {
  499.             t1 = fixmul32(z[o2].re, wre[0]) + fixmul32(z[o2].im, wim[0]);
  500.             t2 = fixmul32(z[o2].im, wre[0]) - fixmul32(z[o2].re, wim[0]);
  501.             t5 = fixmul32(z[o3].re, wre[0]) - fixmul32(z[o3].im, wim[0]);
  502.             t6 = fixmul32(z[o3].im, wre[0]) + fixmul32(z[o3].re, wim[0]);
  503.             muls += 8;
  504.             {
  505.                 FFTSample r0=z[0].re, i0=z[0].im, r1=z[o1].re, i1=z[o1].im;
  506.                 {
  507.                     t3 = t5 - t1;
  508.                     t5 = t5 + t1;
  509.                     adds += 2;
  510.                 }
  511.                 ;
  512.                 {
  513.                     z[o2].re = r0 - t5;
  514.                     z[0].re = r0 + t5;
  515.                     adds += 2;
  516.                 }
  517.                 ;
  518.                 {
  519.                     z[o3].im = i1 - t3;
  520.                     z[o1].im = i1 + t3;
  521.                     adds += 2;
  522.                 }
  523.                 ;
  524.                 {
  525.                     t4 = t2 - t6;
  526.                     t6 = t2 + t6;
  527.                     adds += 2;
  528.                 }
  529.                 ;
  530.                 {
  531.                     z[o3].re = r1 - t4;
  532.                     z[o1].re = r1 + t4;
  533.                     adds += 2;
  534.                 }
  535.                 ;
  536.                 {
  537.                     z[o2].im = i0 - t6;
  538.                     z[0].im = i0 + t6;
  539.                     adds += 2;
  540.                 }
  541.                 ;
  542.             }
  543.         }
  544.         ;
  545.         {
  546.             t1 = fixmul32(z[o2+1].re, wre[1]) + fixmul32(z[o2+1].im, wim[-1]);
  547.             t2 = fixmul32(z[o2+1].im, wre[1]) - fixmul32(z[o2+1].re, wim[-1]);
  548.             t5 = fixmul32(z[o3+1].re, wre[1]) - fixmul32(z[o3+1].im, wim[-1]);
  549.             t6 = fixmul32(z[o3+1].im, wre[1]) + fixmul32(z[o3+1].re, wim[-1]);
  550.             muls += 8;
  551.             {
  552.                 FFTSample r0=z[1].re, i0=z[1].im, r1=z[o1+1].re, i1=z[o1+1].im;
  553.                 {
  554.                     t3 = t5 - t1;
  555.                     t5 = t5 + t1;
  556.                     adds += 2;
  557.                 }
  558.                 ;
  559.                 {
  560.                     z[o2+1].re = r0 - t5;
  561.                     z[1].re = r0 + t5;
  562.                     adds += 2;
  563.                 }
  564.                 ;
  565.                 {
  566.                     z[o3+1].im = i1 - t3;
  567.                     z[o1+1].im = i1 + t3;
  568.                     adds += 2;
  569.                 }
  570.                 ;
  571.                 {
  572.                     t4 = t2 - t6;
  573.                     t6 = t2 + t6;
  574.                     adds += 2;
  575.                 }
  576.                 ;
  577.                 {
  578.                     z[o3+1].re = r1 - t4;
  579.                     z[o1+1].re = r1 + t4;
  580.                     adds += 2;
  581.                 }
  582.                 ;
  583.                 {
  584.                     z[o2+1].im = i0 - t6;
  585.                     z[1].im = i0 + t6;
  586.                     adds += 2;
  587.                 }
  588.                 ;
  589.             }
  590.         }
  591.         ;
  592.         adds += 4;
  593.     }
  594.     while(--n);
  595. }
  596. # 306 "/home/mike/rockbox/mdct/apps/codecs/lib/fft-ffmpeg.c"
  597. static void fft4(FFTComplex *z)
  598. {
  599.     FFTSample t1, t2, t3, t4, t5, t6, t7, t8;
  600.     {
  601.         t3 = z[0].re - z[1].re;
  602.         t1 = z[0].re + z[1].re;
  603.         adds += 2;
  604.     }
  605.     ;
  606.     {
  607.         t8 = z[3].re - z[2].re;
  608.         t6 = z[3].re + z[2].re;
  609.         adds += 2;
  610.     }
  611.     ;
  612.     {
  613.         z[2].re = t1 - t6;
  614.         z[0].re = t1 + t6;
  615.         adds += 2;
  616.     }
  617.     ;
  618.     {
  619.         t4 = z[0].im - z[1].im;
  620.         t2 = z[0].im + z[1].im;
  621.         adds += 2;
  622.     }
  623.     ;
  624.     {
  625.         t7 = z[2].im - z[3].im;
  626.         t5 = z[2].im + z[3].im;
  627.         adds += 2;
  628.     }
  629.     ;
  630.     {
  631.         z[3].im = t4 - t8;
  632.         z[1].im = t4 + t8;
  633.         adds += 2;
  634.     }
  635.     ;
  636.     {
  637.         z[3].re = t3 - t7;
  638.         z[1].re = t3 + t7;
  639.         adds += 2;
  640.     }
  641.     ;
  642.     {
  643.         z[2].im = t2 - t5;
  644.         z[0].im = t2 + t5;
  645.         adds += 2;
  646.     }
  647.     ;
  648. }
  649. static void fft8(FFTComplex *z)
  650. {
  651.     FFTSample t1, t2, t3, t4, t5, t6, t7, t8;
  652.     fft4(z);
  653.     {
  654.         t1 = z[4].re - -z[5].re;
  655.         z[5].re = z[4].re + -z[5].re;
  656.         adds += 2;
  657.     }
  658.     ;
  659.     {
  660.         t2 = z[4].im - -z[5].im;
  661.         z[5].im = z[4].im + -z[5].im;
  662.         adds += 2;
  663.     }
  664.     ;
  665.     {
  666.         t3 = z[6].re - -z[7].re;
  667.         z[7].re = z[6].re + -z[7].re;
  668.         adds += 2;
  669.     }
  670.     ;
  671.     {
  672.         t4 = z[6].im - -z[7].im;
  673.         z[7].im = z[6].im + -z[7].im;
  674.         adds += 2;
  675.     }
  676.     ;
  677.     {
  678.         t8 = t3 - t1;
  679.         t1 = t3 + t1;
  680.         adds += 2;
  681.     }
  682.     ;
  683.     {
  684.         t7 = t2 - t4;
  685.         t2 = t2 + t4;
  686.         adds += 2;
  687.     }
  688.     ;
  689.     {
  690.         z[4].re = z[0].re - t1;
  691.         z[0].re = z[0].re + t1;
  692.         adds += 2;
  693.     }
  694.     ;
  695.     {
  696.         z[4].im = z[0].im - t2;
  697.         z[0].im = z[0].im + t2;
  698.         adds += 2;
  699.     }
  700.     ;
  701.     {
  702.         z[6].re = z[2].re - t7;
  703.         z[2].re = z[2].re + t7;
  704.         adds += 2;
  705.     }
  706.     ;
  707.     {
  708.         z[6].im = z[2].im - t8;
  709.         z[2].im = z[2].im + t8;
  710.         adds += 2;
  711.     }
  712.     ;
  713.     {
  714.         t3 = fixmul32(z[5].re, 0x0000b505);
  715.         t4 = fixmul32(z[5].im, 0x0000b505);
  716.         t7 = fixmul32(z[7].re, 0x0000b505);
  717.         t8 = fixmul32(z[7].im, 0x0000b505);
  718.         t1 = t3 + t4;
  719.         t2 = t4 - t3;
  720.         t5 = t7 - t8;
  721.         t6 = t8 + t7;
  722.         {
  723.             FFTSample r0=z[1].re, i0=z[1].im, r1=z[3].re, i1=z[3].im;
  724.             {
  725.                 t3 = t5 - t1;
  726.                 t5 = t5 + t1;
  727.                 adds += 2;
  728.             }
  729.             ;
  730.             {
  731.                 z[5].re = r0 - t5;
  732.                 z[1].re = r0 + t5;
  733.                 adds += 2;
  734.             }
  735.             ;
  736.             {
  737.                 z[7].im = i1 - t3;
  738.                 z[3].im = i1 + t3;
  739.                 adds += 2;
  740.             }
  741.             ;
  742.             {
  743.                 t4 = t2 - t6;
  744.                 t6 = t2 + t6;
  745.                 adds += 2;
  746.             }
  747.             ;
  748.             {
  749.                 z[7].re = r1 - t4;
  750.                 z[3].re = r1 + t4;
  751.                 adds += 2;
  752.             }
  753.             ;
  754.             {
  755.                 z[5].im = i0 - t6;
  756.                 z[1].im = i0 + t6;
  757.                 adds += 2;
  758.             }
  759.             ;
  760.         }
  761.     }
  762. }
  763. static void fft16(FFTComplex *z)
  764. {
  765.     FFTSample t1, t2, t3, t4, t5, t6, t7, t8;
  766.     fft8(z);
  767.     fft4(z+8);
  768.     fft4(z+12);
  769.     {
  770.         t1 = z[8].re;
  771.         t2 = z[8].im;
  772.         t5 = z[12].re;
  773.         t6 = z[12].im;
  774.         {
  775.             FFTSample r0=z[0].re, i0=z[0].im, r1=z[4].re, i1=z[4].im;
  776.             {
  777.                 t3 = t5 - t1;
  778.                 t5 = t5 + t1;
  779.                 adds += 2;
  780.             }
  781.             ;
  782.             {
  783.                 z[8].re = r0 - t5;
  784.                 z[0].re = r0 + t5;
  785.                 adds += 2;
  786.             }
  787.             ;
  788.             {
  789.                 z[12].im = i1 - t3;
  790.                 z[4].im = i1 + t3;
  791.                 adds += 2;
  792.             }
  793.             ;
  794.             {
  795.                 t4 = t2 - t6;
  796.                 t6 = t2 + t6;
  797.                 adds += 2;
  798.             }
  799.             ;
  800.             {
  801.                 z[12].re = r1 - t4;
  802.                 z[4].re = r1 + t4;
  803.                 adds += 2;
  804.             }
  805.             ;
  806.             {
  807.                 z[8].im = i0 - t6;
  808.                 z[0].im = i0 + t6;
  809.                 adds += 2;
  810.             }
  811.             ;
  812.         }
  813.     }
  814.     ;
  815.     {
  816.         t3 = fixmul32(z[10].re, 0x0000b505);
  817.         t4 = fixmul32(z[10].im, 0x0000b505);
  818.         t7 = fixmul32(z[14].re, 0x0000b505);
  819.         t8 = fixmul32(z[14].im, 0x0000b505);
  820.         t1 = t3 + t4;
  821.         t2 = t4 - t3;
  822.         t5 = t7 - t8;
  823.         t6 = t8 + t7;
  824.         {
  825.             FFTSample r0=z[2].re, i0=z[2].im, r1=z[6].re, i1=z[6].im;
  826.             {
  827.                 t3 = t5 - t1;
  828.                 t5 = t5 + t1;
  829.                 adds += 2;
  830.             }
  831.             ;
  832.             {
  833.                 z[10].re = r0 - t5;
  834.                 z[2].re = r0 + t5;
  835.                 adds += 2;
  836.             }
  837.             ;
  838.             {
  839.                 z[14].im = i1 - t3;
  840.                 z[6].im = i1 + t3;
  841.                 adds += 2;
  842.             }
  843.             ;
  844.             {
  845.                 t4 = t2 - t6;
  846.                 t6 = t2 + t6;
  847.                 adds += 2;
  848.             }
  849.             ;
  850.             {
  851.                 z[14].re = r1 - t4;
  852.                 z[6].re = r1 + t4;
  853.                 adds += 2;
  854.             }
  855.             ;
  856.             {
  857.                 z[10].im = i0 - t6;
  858.                 z[2].im = i0 + t6;
  859.                 adds += 2;
  860.             }
  861.             ;
  862.         }
  863.     }
  864.     ;
  865.     {
  866.         t1 = fixmul32(z[9].re, ff_cos_16[1]) + fixmul32(z[9].im, ff_cos_16[3]);
  867.         t2 = fixmul32(z[9].im, ff_cos_16[1]) - fixmul32(z[9].re, ff_cos_16[3]);
  868.         t5 = fixmul32(z[13].re, ff_cos_16[1]) - fixmul32(z[13].im, ff_cos_16[3]);
  869.         t6 = fixmul32(z[13].im, ff_cos_16[1]) + fixmul32(z[13].re, ff_cos_16[3]);
  870.         muls += 8;
  871.         {
  872.             FFTSample r0=z[1].re, i0=z[1].im, r1=z[5].re, i1=z[5].im;
  873.             {
  874.                 t3 = t5 - t1;
  875.                 t5 = t5 + t1;
  876.                 adds += 2;
  877.             }
  878.             ;
  879.             {
  880.                 z[9].re = r0 - t5;
  881.                 z[1].re = r0 + t5;
  882.                 adds += 2;
  883.             }
  884.             ;
  885.             {
  886.                 z[13].im = i1 - t3;
  887.                 z[5].im = i1 + t3;
  888.                 adds += 2;
  889.             }
  890.             ;
  891.             {
  892.                 t4 = t2 - t6;
  893.                 t6 = t2 + t6;
  894.                 adds += 2;
  895.             }
  896.             ;
  897.             {
  898.                 z[13].re = r1 - t4;
  899.                 z[5].re = r1 + t4;
  900.                 adds += 2;
  901.             }
  902.             ;
  903.             {
  904.                 z[9].im = i0 - t6;
  905.                 z[1].im = i0 + t6;
  906.                 adds += 2;
  907.             }
  908.             ;
  909.         }
  910.     }
  911.     ;
  912.     {
  913.         t1 = fixmul32(z[11].re, ff_cos_16[3]) + fixmul32(z[11].im, ff_cos_16[1]);
  914.         t2 = fixmul32(z[11].im, ff_cos_16[3]) - fixmul32(z[11].re, ff_cos_16[1]);
  915.         t5 = fixmul32(z[15].re, ff_cos_16[3]) - fixmul32(z[15].im, ff_cos_16[1]);
  916.         t6 = fixmul32(z[15].im, ff_cos_16[3]) + fixmul32(z[15].re, ff_cos_16[1]);
  917.         muls += 8;
  918.         {
  919.             FFTSample r0=z[3].re, i0=z[3].im, r1=z[7].re, i1=z[7].im;
  920.             {
  921.                 t3 = t5 - t1;
  922.                 t5 = t5 + t1;
  923.                 adds += 2;
  924.             }
  925.             ;
  926.             {
  927.                 z[11].re = r0 - t5;
  928.                 z[3].re = r0 + t5;
  929.                 adds += 2;
  930.             }
  931.             ;
  932.             {
  933.                 z[15].im = i1 - t3;
  934.                 z[7].im = i1 + t3;
  935.                 adds += 2;
  936.             }
  937.             ;
  938.             {
  939.                 t4 = t2 - t6;
  940.                 t6 = t2 + t6;
  941.                 adds += 2;
  942.             }
  943.             ;
  944.             {
  945.                 z[15].re = r1 - t4;
  946.                 z[7].re = r1 + t4;
  947.                 adds += 2;
  948.             }
  949.             ;
  950.             {
  951.                 z[11].im = i0 - t6;
  952.                 z[3].im = i0 + t6;
  953.                 adds += 2;
  954.             }
  955.             ;
  956.         }
  957.     }
  958.     ;
  959. }
  960. static void fft32(FFTComplex *z){
  961.     fft16(z);
  962.     fft8(z+8*2);
  963.     fft8(z+8*3);
  964.     pass(z,ff_cos_32,8/2);
  965. }
  966. static void fft64(FFTComplex *z){
  967.     fft32(z);
  968.     fft16(z+16*2);
  969.     fft16(z+16*3);
  970.     pass(z,ff_cos_64,16/2);
  971. }
  972. static void fft128(FFTComplex *z){
  973.     fft64(z);
  974.     fft32(z+32*2);
  975.     fft32(z+32*3);
  976.     pass(z,ff_cos_128,32/2);
  977. }
  978. static void fft256(FFTComplex *z){
  979.     fft128(z);
  980.     fft64(z+64*2);
  981.     fft64(z+64*3);
  982.     pass(z,ff_cos_256,64/2);
  983. }
  984. static void fft512(FFTComplex *z){
  985.     fft256(z);
  986.     fft128(z+128*2);
  987.     fft128(z+128*3);
  988.     pass(z,ff_cos_512,128/2);
  989. }
  990. static void fft1024(FFTComplex *z){
  991.     fft512(z);
  992.     fft256(z+256*2);
  993.     fft256(z+256*3);
  994.     pass_big(z,ff_cos_1024,256/2);
  995. }
  996. static void fft2048(FFTComplex *z){
  997.     fft1024(z);
  998.     fft512(z+512*2);
  999.     fft512(z+512*3);
  1000.     pass_big(z,ff_cos_2048,512/2);
  1001. }
  1002. static void fft4096(FFTComplex *z){
  1003.     fft2048(z);
  1004.     fft1024(z+1024*2);
  1005.     fft1024(z+1024*3);
  1006.     pass_big(z,ff_cos_4096,1024/2);
  1007. }
  1008. static void (*fft_dispatch[])(FFTComplex*) = {
  1009.     fft4, fft8, fft16, fft32, fft64, fft128, fft256, fft512, fft1024,
  1010.     fft2048, fft4096
  1011. }
  1012. ;
  1013. void ff_fft_calc_c(FFTContext *s, FFTComplex *z)
  1014. {
  1015.     fft_dispatch[s-&gt;
  1016.     nbits-2](z);
  1017. }</BODY></HTML>