filter_2.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:11k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* MPEG/WAVE Sound library
  2.    (C) 1997 by Jung woo-jae */
  3. // Filter.cc
  4. // Subbandsynthesis routines from maplay 1.2 for Linux
  5. // I've modified some macros for reducing source code.
  6. #ifdef HAVE_CONFIG_H
  7. #include "config.h"
  8. #endif
  9. #include "MPEGaudio.h"
  10. void MPEGaudio::computebuffer_2(REAL *fraction,REAL buffer[2][CALCBUFFERSIZE])
  11. {
  12.   REAL p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,pa,pb,pc,pd,pe,pf;
  13.   REAL q0,q1,q2,q3,q4,q5,q6,q7,q8,q9,qa,qb,qc,qd,qe,qf;
  14.   REAL *out1,*out2;
  15.   out1=buffer[currentcalcbuffer]+calcbufferoffset;
  16.   out2=buffer[currentcalcbuffer^1]+calcbufferoffset;
  17. #define OUT1(v,t) out1[(32-(v))*16]   =(-(out1[(v)*16]=t))
  18. #define OUT2(v)   out2[(96-(v)-32)*16]=out2[((v)-32)*16]
  19.   // compute new values via a fast cosine transform:
  20.   /*  {
  21.     register REAL *x=fraction;
  22.     p0=x[ 0]+x[31];p1=x[ 1]+x[30];p2=x[ 2]+x[29];p3=x[ 3]+x[28];
  23.     p4=x[ 4]+x[27];p5=x[ 5]+x[26];p6=x[ 6]+x[25];p7=x[ 7]+x[24];
  24.     p8=x[ 8]+x[23];p9=x[ 9]+x[22];pa=x[10]+x[21];pb=x[11]+x[20];
  25.     pc=x[12]+x[19];pd=x[13]+x[18];pe=x[14]+x[17];pf=x[15]+x[16];
  26.   }
  27.   q0=p0+pf;q1=p1+pe;q2=p2+pd;q3=p3+pc;
  28.   q4=p4+pb;q5=p5+pa;q6=p6+p9;q7=p7+p8;
  29.   q8=hcos_32[0]*(p0-pf);q9=hcos_32[1]*(p1-pe);
  30.   qa=hcos_32[2]*(p2-pd);qb=hcos_32[3]*(p3-pc);
  31.   qc=hcos_32[4]*(p4-pb);qd=hcos_32[5]*(p5-pa);
  32.   qe=hcos_32[6]*(p6-p9);qf=hcos_32[7]*(p7-p8); */
  33.   {
  34.     register REAL *x=fraction;
  35.     q0=x[ 0]+x[15];q1=x[ 1]+x[14];q2=x[ 2]+x[13];q3=x[ 3]+x[12];
  36.     q4=x[ 4]+x[11];q5=x[ 5]+x[10];q6=x[ 6]+x[ 9];q7=x[ 7]+x[ 8];
  37.     q8=hcos_32[0]*(x[ 0]-x[15]);q9=hcos_32[1]*(x[ 1]-x[14]);
  38.     qa=hcos_32[2]*(x[ 2]-x[13]);qb=hcos_32[3]*(x[ 3]-x[12]);
  39.     qc=hcos_32[4]*(x[ 4]-x[11]);qd=hcos_32[5]*(x[ 5]-x[10]);
  40.     qe=hcos_32[6]*(x[ 6]-x[ 9]);qf=hcos_32[7]*(x[ 7]-x[ 8]);
  41.   }
  42.   p0=q0+q7;p1=q1+q6;p2=q2+q5;p3=q3+q4;
  43.   p4=hcos_16[0]*(q0-q7);p5=hcos_16[1]*(q1-q6);
  44.   p6=hcos_16[2]*(q2-q5);p7=hcos_16[3]*(q3-q4);
  45.   p8=q8+qf;p9=q9+qe;pa=qa+qd;pb=qb+qc;
  46.   pc=hcos_16[0]*(q8-qf);pd=hcos_16[1]*(q9-qe);
  47.   pe=hcos_16[2]*(qa-qd);pf=hcos_16[3]*(qb-qc);
  48.   q0=p0+p3;q1=p1+p2;q2=hcos_8[0]*(p0-p3);q3=hcos_8[1]*(p1-p2);
  49.   q4=p4+p7;q5=p5+p6;q6=hcos_8[0]*(p4-p7);q7=hcos_8[1]*(p5-p6);
  50.   q8=p8+pb;q9=p9+pa;qa=hcos_8[0]*(p8-pb);qb=hcos_8[1]*(p9-pa);
  51.   qc=pc+pf;qd=pd+pe;qe=hcos_8[0]*(pc-pf);qf=hcos_8[1]*(pd-pe);
  52.   p0=q0+q1;p1=hcos_4*(q0-q1);p2=q2+q3;p3=hcos_4*(q2-q3);
  53.   p4=q4+q5;p5=hcos_4*(q4-q5);p6=q6+q7;p7=hcos_4*(q6-q7);
  54.   p8=q8+q9;p9=hcos_4*(q8-q9);pa=qa+qb;pb=hcos_4*(qa-qb);
  55.   pc=qc+qd;pd=hcos_4*(qc-qd);pe=qe+qf;pf=hcos_4*(qe-qf);
  56.   {
  57.     register REAL tmp;
  58.     tmp=p6+p7;
  59.     OUT2(36)=-(p5+tmp);
  60.     OUT2(44)=-(p4+tmp);
  61.     tmp=pb+pf;
  62.     OUT1(10,tmp);
  63.     OUT1(6,pd+tmp);
  64.     tmp=pe+pf;
  65.     OUT2(46)=-(p8+pc+tmp);
  66.     OUT2(34)=-(p9+pd+tmp);
  67.     tmp+=pa+pb;
  68.     OUT2(38)=-(pd+tmp);
  69.     OUT2(42)=-(pc+tmp);
  70.     OUT1(2,p9+pd+pf);
  71.     OUT1(4,p5+p7);
  72.     OUT2(48)=-p0;
  73.     out2[0]=-(out1[0]=p1);
  74.     OUT1( 8,p3);
  75.     OUT1(12,p7);
  76.     OUT1(14,pf);
  77.     OUT2(40)=-(p2+p3);
  78.   }
  79.   {
  80.     register REAL *x=fraction;
  81.     /*    p0=hcos_64[ 0]*(x[ 0]-x[31]);p1=hcos_64[ 1]*(x[ 1]-x[30]);
  82.     p2=hcos_64[ 2]*(x[ 2]-x[29]);p3=hcos_64[ 3]*(x[ 3]-x[28]);
  83.     p4=hcos_64[ 4]*(x[ 4]-x[27]);p5=hcos_64[ 5]*(x[ 5]-x[26]);
  84.     p6=hcos_64[ 6]*(x[ 6]-x[25]);p7=hcos_64[ 7]*(x[ 7]-x[24]);
  85.     p8=hcos_64[ 8]*(x[ 8]-x[23]);p9=hcos_64[ 9]*(x[ 9]-x[22]);
  86.     pa=hcos_64[10]*(x[10]-x[21]);pb=hcos_64[11]*(x[11]-x[20]);
  87.     pc=hcos_64[12]*(x[12]-x[19]);pd=hcos_64[13]*(x[13]-x[18]);
  88.     pe=hcos_64[14]*(x[14]-x[17]);pf=hcos_64[15]*(x[15]-x[16]); */
  89.     p0=hcos_64[ 0]*x[ 0];p1=hcos_64[ 1]*x[ 1];
  90.     p2=hcos_64[ 2]*x[ 2];p3=hcos_64[ 3]*x[ 3];
  91.     p4=hcos_64[ 4]*x[ 4];p5=hcos_64[ 5]*x[ 5];
  92.     p6=hcos_64[ 6]*x[ 6];p7=hcos_64[ 7]*x[ 7];
  93.     p8=hcos_64[ 8]*x[ 8];p9=hcos_64[ 9]*x[ 9];
  94.     pa=hcos_64[10]*x[10];pb=hcos_64[11]*x[11];
  95.     pc=hcos_64[12]*x[12];pd=hcos_64[13]*x[13];
  96.     pe=hcos_64[14]*x[14];pf=hcos_64[15]*x[15];
  97.   }
  98.   q0=p0+pf;q1=p1+pe;q2=p2+pd;q3=p3+pc;
  99.   q4=p4+pb;q5=p5+pa;q6=p6+p9;q7=p7+p8;
  100.   q8=hcos_32[0]*(p0-pf);q9=hcos_32[1]*(p1-pe);
  101.   qa=hcos_32[2]*(p2-pd);qb=hcos_32[3]*(p3-pc);
  102.   qc=hcos_32[4]*(p4-pb);qd=hcos_32[5]*(p5-pa);
  103.   qe=hcos_32[6]*(p6-p9);qf=hcos_32[7]*(p7-p8);
  104.   p0=q0+q7;p1=q1+q6;p2=q2+q5;p3=q3+q4;
  105.   p4=hcos_16[0]*(q0-q7);p5=hcos_16[1]*(q1-q6);
  106.   p6=hcos_16[2]*(q2-q5);p7=hcos_16[3]*(q3-q4);
  107.   p8=q8+qf;p9=q9+qe;pa=qa+qd;pb=qb+qc;
  108.   pc=hcos_16[0]*(q8-qf);pd=hcos_16[1]*(q9-qe);
  109.   pe=hcos_16[2]*(qa-qd);pf=hcos_16[3]*(qb-qc);
  110.   q0=p0+p3;q1=p1+p2;q2=hcos_8[0]*(p0-p3);q3=hcos_8[1]*(p1-p2);
  111.   q4=p4+p7;q5=p5+p6;q6=hcos_8[0]*(p4-p7);q7=hcos_8[1]*(p5-p6);
  112.   q8=p8+pb;q9=p9+pa;qa=hcos_8[0]*(p8-pb);qb=hcos_8[1]*(p9-pa);
  113.   qc=pc+pf;qd=pd+pe;qe=hcos_8[0]*(pc-pf);qf=hcos_8[1]*(pd-pe);
  114.   p0=q0+q1;p1=hcos_4*(q0-q1);
  115.   p2=q2+q3;p3=hcos_4*(q2-q3);
  116.   p4=q4+q5;p5=hcos_4*(q4-q5);
  117.   p6=q6+q7;p7=hcos_4*(q6-q7);
  118.   p8=q8+q9;p9=hcos_4*(q8-q9);
  119.   pa=qa+qb;pb=hcos_4*(qa-qb);
  120.   pc=qc+qd;pd=hcos_4*(qc-qd);
  121.   pe=qe+qf;pf=hcos_4*(qe-qf);
  122.   {
  123.     REAL tmp;
  124.     tmp=pd+pf;
  125.     OUT1(5,p5+p7+pb+tmp);
  126.     tmp+=p9;
  127.     OUT1(1,p1+tmp);
  128.     OUT2(33)=-(p1+pe+tmp);
  129.     tmp+=p5+p7;
  130.     OUT1(3,tmp);
  131.     OUT2(35)=-(p6+pe+tmp);
  132.     tmp=pa+pb+pc+pd+pe+pf;
  133.     OUT2(39)=-(p2+p3+tmp-pc);
  134.     OUT2(43)=-(p4+p6+p7+tmp-pd);
  135.     OUT2(37)=-(p5+p6+p7+tmp-pc);
  136.     OUT2(41)=-(p2+p3+tmp-pd);
  137.     tmp=p8+pc+pe+pf;
  138.     OUT2(47)=-(p0+tmp);
  139.     OUT2(45)=-(p4+p6+p7+tmp);
  140.     tmp=pb+pf;
  141.     OUT1(11,p7+tmp);
  142.     tmp+=p3;
  143.     OUT1( 9,tmp);
  144.     OUT1( 7,pd+tmp);
  145.     OUT1(13,p7+pf);
  146.     OUT1(15,pf);
  147.   }
  148. }
  149. #define SAVE 
  150.         raw=(int)(r*scalefactor); 
  151.         if(raw>MAXSCALE)raw=MAXSCALE;else if(raw<MINSCALE)raw=MINSCALE; 
  152. putraw(raw); 
  153.         dp+=16;vp+=15+(15-14)
  154. #define OS   r=*vp * *dp++
  155. #define XX   vp+=15;r+=*vp * *dp++
  156. #define OP   r+=*--vp * *dp++
  157. void MPEGaudio::generatesingle_2(void)
  158. {
  159.   int i;
  160.   register REAL r, *vp;
  161.   register const REAL *dp;
  162.   int raw;
  163.   i=32/2;
  164.   dp=filter;
  165.   vp=calcbufferL[currentcalcbuffer]+calcbufferoffset; 
  166. // actual_v+actual_write_pos;
  167.   switch (calcbufferoffset)
  168.   {
  169.     case  0:for(;i;i--,vp+=15){
  170.               OS;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  171.       SAVE;}break;
  172.     case  1:for(;i;i--,vp+=15){
  173.       OS;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  174.       SAVE;}break;
  175.     case  2:for(;i;i--,vp+=15){
  176.               OS;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  177.       SAVE;}break;
  178.     case  3:for(;i;i--,vp+=15){
  179.       OS;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  180.       SAVE;}break;
  181.     case  4:for(;i;i--,vp+=15){
  182.               OS;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  183.       SAVE;}break;
  184.     case  5:for(;i;i--,vp+=15){
  185.       OS;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  186.       SAVE;}break;
  187.     case  6:for(;i;i--,vp+=15){
  188.       OS;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;
  189.       SAVE;}break;
  190.     case  7:for(;i;i--,vp+=15){
  191.       OS;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;
  192.       SAVE;}break;
  193.     case  8:for(;i;i--,vp+=15){
  194.               OS;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;
  195.       SAVE;}break;
  196.     case  9:for(;i;i--,vp+=15){
  197.       OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;
  198.       SAVE;}break;
  199.     case 10:for(;i;i--,vp+=15){
  200.               OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;
  201.       SAVE;}break;
  202.     case 11:for(;i;i--,vp+=15){
  203.               OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;
  204.       SAVE;}break;
  205.     case 12:for(;i;i--,vp+=15){
  206.       OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;
  207.       SAVE;}break;
  208.     case 13:for(;i;i--,vp+=15){
  209.       OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;
  210.       SAVE;}break;
  211.     case 14:for(;i;i--,vp+=15){
  212.       OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;
  213.       SAVE;}break;
  214.     case 15:for(;i;i--,vp+=31){
  215.               OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  216.       SAVE;}break;
  217.   }
  218. }
  219. #undef OS
  220. #undef XX
  221. #undef OP
  222. #undef SAVE
  223. #define SAVE 
  224.         raw=(int)(r1*scalefactor);  
  225.         if(raw>MAXSCALE)raw=MAXSCALE;else if(raw<MINSCALE)raw=MINSCALE; 
  226. putraw(raw);  
  227.         raw=(int)(r2*scalefactor);  
  228.         if(raw>MAXSCALE)raw=MAXSCALE;else if(raw<MINSCALE)raw=MINSCALE; 
  229. putraw(raw); 
  230.         dp+=16;vp1+=15+(15-14);vp2+=15+(15-14)
  231. #define OS r1=*vp1 * *dp; 
  232.            r2=*vp2 * *dp++ 
  233. #define XX vp1+=15;r1+=*vp1 * *dp; 
  234.    vp2+=15;r2+=*vp2 * *dp++
  235. #define OP r1+=*--vp1 * *dp; 
  236.    r2+=*--vp2 * *dp++
  237. void MPEGaudio::generate_2(void)
  238. {
  239.   int i;
  240.   REAL r1,r2;
  241.   register REAL *vp1,*vp2;
  242.   register const REAL *dp;
  243.   int raw;
  244.   dp=filter;
  245.   vp1=calcbufferL[currentcalcbuffer]+calcbufferoffset;
  246.   vp2=calcbufferR[currentcalcbuffer]+calcbufferoffset;
  247. // actual_v+actual_write_pos;
  248.   i=32/2;
  249.   switch (calcbufferoffset)
  250.   {
  251.     case  0:for(;i;i--,vp1+=15,vp2+=15){
  252.               OS;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  253.       SAVE;}break;
  254.     case  1:for(;i;i--,vp1+=15,vp2+=15){
  255.       OS;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  256.       SAVE;}break;
  257.     case  2:for(;i;i--,vp1+=15,vp2+=15){
  258.               OS;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  259.       SAVE;}break;
  260.     case  3:for(;i;i--,vp1+=15,vp2+=15){
  261.       OS;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  262.       SAVE;}break;
  263.     case  4:for(;i;i--,vp1+=15,vp2+=15){
  264.               OS;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  265.       SAVE;}break;
  266.     case  5:for(;i;i--,vp1+=15,vp2+=15){
  267.       OS;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  268.       SAVE;}break;
  269.     case  6:for(;i;i--,vp1+=15,vp2+=15){
  270.       OS;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;OP;
  271.       SAVE;}break;
  272.     case  7:for(;i;i--,vp1+=15,vp2+=15){
  273.       OS;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;OP;
  274.       SAVE;}break;
  275.     case  8:for(;i;i--,vp1+=15,vp2+=15){
  276.               OS;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;OP;
  277.       SAVE;}break;
  278.     case  9:for(;i;i--,vp1+=15,vp2+=15){
  279.       OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;OP;
  280.       SAVE;}break;
  281.     case 10:for(;i;i--,vp1+=15,vp2+=15){
  282.               OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;OP;
  283.       SAVE;}break;
  284.     case 11:for(;i;i--,vp1+=15,vp2+=15){
  285.               OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;OP;
  286.       SAVE;}break;
  287.     case 12:for(;i;i--,vp1+=15,vp2+=15){
  288.       OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;OP;
  289.       SAVE;}break;
  290.     case 13:for(;i;i--,vp1+=15,vp2+=15){
  291.       OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;OP;
  292.       SAVE;}break;
  293.     case 14:for(;i;i--,vp1+=15,vp2+=15){
  294.       OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;XX;
  295.       SAVE;}break;
  296.     case 15:for(;i;i--,vp1+=31,vp2+=31){
  297.               OS;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;OP;
  298.       SAVE;}break;
  299.   }
  300. }
  301. void MPEGaudio::subbandsynthesis_2(REAL *fractionL,REAL *fractionR)
  302. {
  303.   computebuffer_2(fractionL,calcbufferL);
  304.   if(!outputstereo)generatesingle_2();
  305.   else
  306.   {
  307.     computebuffer_2(fractionR,calcbufferR);
  308.     generate_2();
  309.   }
  310.   if(calcbufferoffset<15)calcbufferoffset++;
  311.   else calcbufferoffset=0;
  312.   currentcalcbuffer^=1;
  313. }