dct36.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:8k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /*
  2.  * Modified for use with MPlayer, for details see the changelog at
  3.  * http://svn.mplayerhq.hu/mplayer/trunk/
  4.  * $Id: dct36.c 18786 2006-06-22 13:34:00Z diego $
  5.  */
  6. /* 
  7. // This is an optimized DCT from Jeff Tsay's maplay 1.2+ package.
  8. // Saved one multiplication by doing the 'twiddle factor' stuff
  9. // together with the window mul. (MH)
  10. //
  11. // This uses Byeong Gi Lee's Fast Cosine Transform algorithm, but the
  12. // 9 point IDCT needs to be reduced further. Unfortunately, I don't
  13. // know how to do that, because 9 is not an even number. - Jeff.
  14. //
  15. //////////////////////////////////////////////////////////////////
  16. //
  17. // 9 Point Inverse Discrete Cosine Transform
  18. //
  19. // This piece of code is Copyright 1997 Mikko Tommila and is freely usable
  20. // by anybody. The algorithm itself is of course in the public domain.
  21. //
  22. // Again derived heuristically from the 9-point WFTA.
  23. //
  24. // The algorithm is optimized (?) for speed, not for small rounding errors or
  25. // good readability.
  26. //
  27. // 36 additions, 11 multiplications
  28. //
  29. // Again this is very likely sub-optimal.
  30. //
  31. // The code is optimized to use a minimum number of temporary variables,
  32. // so it should compile quite well even on 8-register Intel x86 processors.
  33. // This makes the code quite obfuscated and very difficult to understand.
  34. //
  35. // References:
  36. // [1] S. Winograd: "On Computing the Discrete Fourier Transform",
  37. //     Mathematics of Computation, Volume 32, Number 141, January 1978,
  38. //     Pages 175-199
  39. */
  40. /*------------------------------------------------------------------*/
  41. /*                                                                  */
  42. /*    Function: Calculation of the inverse MDCT                     */
  43. /*                                                                  */
  44. /*------------------------------------------------------------------*/
  45. static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf)
  46. {
  47. #ifdef NEW_DCT9
  48.   real tmp[18];
  49. #endif
  50.   {
  51.     register real *in = inbuf;
  52.     in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14];
  53.     in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11];
  54.     in[11]+=in[10]; in[10]+=in[9];  in[9] +=in[8];
  55.     in[8] +=in[7];  in[7] +=in[6];  in[6] +=in[5];
  56.     in[5] +=in[4];  in[4] +=in[3];  in[3] +=in[2];
  57.     in[2] +=in[1];  in[1] +=in[0];
  58.     in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
  59.     in[9] +=in[7];  in[7] +=in[5];  in[5] +=in[3];  in[3] +=in[1];
  60. #ifdef NEW_DCT9
  61.     {
  62.       real t0, t1, t2, t3, t4, t5, t6, t7;
  63.       t1 = COS6_2 * in[12];
  64.       t2 = COS6_2 * (in[8] + in[16] - in[4]);
  65.       t3 = in[0] + t1;
  66.       t4 = in[0] - t1 - t1;
  67.       t5 = t4 - t2;
  68.       t0 = cos9[0] * (in[4] + in[8]);
  69.       t1 = cos9[1] * (in[8] - in[16]);
  70.       tmp[4] = t4 + t2 + t2;
  71.       t2 = cos9[2] * (in[4] + in[16]);
  72.       t6 = t3 - t0 - t2;
  73.       t0 += t3 + t1;
  74.       t3 += t2 - t1;
  75.       t2 = cos18[0] * (in[2]  + in[10]);
  76.       t4 = cos18[1] * (in[10] - in[14]);
  77.       t7 = COS6_1 * in[6];
  78.       t1 = t2 + t4 + t7;
  79.       tmp[0] = t0 + t1;
  80.       tmp[8] = t0 - t1;
  81.       t1 = cos18[2] * (in[2] + in[14]);
  82.       t2 += t1 - t7;
  83.       tmp[3] = t3 + t2;
  84.       t0 = COS6_1 * (in[10] + in[14] - in[2]);
  85.       tmp[5] = t3 - t2;
  86.       t4 -= t1 + t7;
  87.       tmp[1] = t5 - t0;
  88.       tmp[7] = t5 + t0;
  89.       tmp[2] = t6 + t4;
  90.       tmp[6] = t6 - t4;
  91.     }
  92.     {
  93.       real t0, t1, t2, t3, t4, t5, t6, t7;
  94.       t1 = COS6_2 * in[13];
  95.       t2 = COS6_2 * (in[9] + in[17] - in[5]);
  96.       t3 = in[1] + t1;
  97.       t4 = in[1] - t1 - t1;
  98.       t5 = t4 - t2;
  99.       t0 = cos9[0] * (in[5] + in[9]);
  100.       t1 = cos9[1] * (in[9] - in[17]);
  101.       tmp[13] = (t4 + t2 + t2) * tfcos36[17-13];
  102.       t2 = cos9[2] * (in[5] + in[17]);
  103.       t6 = t3 - t0 - t2;
  104.       t0 += t3 + t1;
  105.       t3 += t2 - t1;
  106.       t2 = cos18[0] * (in[3]  + in[11]);
  107.       t4 = cos18[1] * (in[11] - in[15]);
  108.       t7 = COS6_1 * in[7];
  109.       t1 = t2 + t4 + t7;
  110.       tmp[17] = (t0 + t1) * tfcos36[17-17];
  111.       tmp[9]  = (t0 - t1) * tfcos36[17-9];
  112.       t1 = cos18[2] * (in[3] + in[15]);
  113.       t2 += t1 - t7;
  114.       tmp[14] = (t3 + t2) * tfcos36[17-14];
  115.       t0 = COS6_1 * (in[11] + in[15] - in[3]);
  116.       tmp[12] = (t3 - t2) * tfcos36[17-12];
  117.       t4 -= t1 + t7;
  118.       tmp[16] = (t5 - t0) * tfcos36[17-16];
  119.       tmp[10] = (t5 + t0) * tfcos36[17-10];
  120.       tmp[15] = (t6 + t4) * tfcos36[17-15];
  121.       tmp[11] = (t6 - t4) * tfcos36[17-11];
  122.    }
  123. #define MACRO(v) { 
  124.     real tmpval; 
  125.     real sum0 = tmp[(v)]; 
  126.     real sum1 = tmp[17-(v)]; 
  127.     out2[9+(v)] = (tmpval = sum0 + sum1) * w[27+(v)]; 
  128.     out2[8-(v)] = tmpval * w[26-(v)]; 
  129.     sum0 -= sum1; 
  130.     ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; 
  131.     ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; }
  132. {
  133.    register real *out2 = o2;
  134.    register real *w = wintab;
  135.    register real *out1 = o1;
  136.    register real *ts = tsbuf;
  137.    MACRO(0);
  138.    MACRO(1);
  139.    MACRO(2);
  140.    MACRO(3);
  141.    MACRO(4);
  142.    MACRO(5);
  143.    MACRO(6);
  144.    MACRO(7);
  145.    MACRO(8);
  146. }
  147. #else
  148.   {
  149. #define MACRO0(v) { 
  150.     real tmp; 
  151.     out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; 
  152.     out2[8-(v)] = tmp * w[26-(v)];  } 
  153.     sum0 -= sum1; 
  154.     ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; 
  155.     ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; 
  156. #define MACRO1(v) { 
  157. real sum0,sum1; 
  158.     sum0 = tmp1a + tmp2a; 
  159. sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; 
  160. MACRO0(v); }
  161. #define MACRO2(v) { 
  162.     real sum0,sum1; 
  163.     sum0 = tmp2a - tmp1a; 
  164.     sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; 
  165. MACRO0(v); }
  166.     register const real *c = COS9;
  167.     register real *out2 = o2;
  168. register real *w = wintab;
  169. register real *out1 = o1;
  170. register real *ts = tsbuf;
  171.     real ta33,ta66,tb33,tb66;
  172.     ta33 = in[2*3+0] * c[3];
  173.     ta66 = in[2*6+0] * c[6];
  174.     tb33 = in[2*3+1] * c[3];
  175.     tb66 = in[2*6+1] * c[6];
  176.     { 
  177.       real tmp1a,tmp2a,tmp1b,tmp2b;
  178.       tmp1a =             in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7];
  179.       tmp1b =             in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7];
  180.       tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8];
  181.       tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8];
  182.       MACRO1(0);
  183.       MACRO2(8);
  184.     }
  185.     {
  186.       real tmp1a,tmp2a,tmp1b,tmp2b;
  187.       tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3];
  188.       tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3];
  189.       tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0];
  190.       tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1];
  191.       MACRO1(1);
  192.       MACRO2(7);
  193.     }
  194.     {
  195.       real tmp1a,tmp2a,tmp1b,tmp2b;
  196.       tmp1a =             in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1];
  197.       tmp1b =             in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1];
  198.       tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4];
  199.       tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4];
  200.       MACRO1(2);
  201.       MACRO2(6);
  202.     }
  203.     {
  204.       real tmp1a,tmp2a,tmp1b,tmp2b;
  205.       tmp1a =             in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5];
  206.       tmp1b =             in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5];
  207.       tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2];
  208.       tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2];
  209.       MACRO1(3);
  210.       MACRO2(5);
  211.     }
  212. {
  213. real sum0,sum1;
  214.      sum0 =  in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0];
  215.      sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4];
  216. MACRO0(4);
  217. }
  218.   }
  219. #endif
  220.   }
  221. }