⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpeglayer3.cpp

📁 This code is based on mpeg_play, available from: http://bmrc.berkeley.edu/frame/research/mpeg/
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	  cb_width=sfBandIndex->s[cb+1]-cb_begin;	  cb_begin=MUL3(cb_begin);	}      }      {	int t_index=(index-cb_begin)/cb_width;	out[0][index]*=layer3twopow2_1(gi->subblock_gain[t_index],				       gi->scalefac_scale,				       scalefactors[ch].s[t_index][cb]);      }    }  }}void MPEGaudio::layer3fixtostereo(int gr,REAL in[2][SBLIMIT][SSLIMIT]){  layer3grinfo *gi=&(sideinfo.ch[0].gr[gr]);  SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]);    int ms_stereo=(mode==joint) && (extendedmode & 0x2);  int i_stereo =(mode==joint) && (extendedmode & 0x1);  if(!inputstereo)  { /* mono , bypass xr[0][][] to lr[0][][]*/    // memcpy(out[0][0],in[0][0],ARRAYSIZE*REALSIZE);    return;  }       if(i_stereo)  {    int i;    int    is_pos[ARRAYSIZE];    RATIOS is_ratio[ARRAYSIZE];    RATIOS *ratios;    if(version)ratios=rat_2[gi->scalefac_compress%2];    else ratios=rat_1;    /* initialization */    for(i=0;i<ARRAYSIZE;i+=2)is_pos[i]=is_pos[i+1]=7;    if(gi->generalflag)    {      if(gi->mixed_block_flag)           // Part I      {	int max_sfb=0;	for(int j=0;j<3;j++)	{	  int sfb,sfbcnt=2;	  for(sfb=12;sfb>=3;sfb--)	  {	    int lines;	    i=sfBandIndex->s[sfb];	    lines=sfBandIndex->s[sfb+1]-i;	    i=MUL3(i)+(j+1)*lines-1;	    for(;lines>0;lines--,i--)	      if(in[1][0][i]!=0.0f)	      {		sfbcnt=sfb;		sfb=0;break;        // quit loop	      }	  }	  sfb=sfbcnt+1;	    	  if(sfb>max_sfb)max_sfb=sfb;	    	  for(;sfb<12;sfb++)	  {	    int k,t;	    t=sfBandIndex->s[sfb];	    k=sfBandIndex->s[sfb+1]-t;	    i=MUL3(t)+j*k;	    t=scalefactors[1].s[j][sfb];	    if(t!=7)	    {	      RATIOS r=ratios[t];	      for(;k>0;k--,i++){		is_pos[i]=t;is_ratio[i]=r;}	    }	    else	      for(;k>0;k--,i++)is_pos[i]=t;	  }	  sfb=sfBandIndex->s[10];	  sfb=MUL3(sfb)+j*(sfBandIndex->s[11]-sfb);	  {	    int k,t;	    t=sfBandIndex->s[11];	    k=sfBandIndex->s[12]-t;	    i=MUL3(t)+j*k;	    t=is_pos[sfb];	    if(t!=7)	    {	      RATIOS r=is_ratio[sfb];	      for(;k>0;k--,i++){		is_pos[i]=t;is_ratio[i]=r;}	    }	    else	      for(;k>0;k--,i++)is_pos[i]=t;	  }	}	if(max_sfb<=3)	{	  {	    REAL temp;	    int k;	    temp=in[1][0][0];in[1][0][0]=1.0;	    for(k=3*SSLIMIT-1;in[1][0][k]==0.0;k--);	    in[1][0][0]=temp;	    for(i=0;sfBandIndex->l[i]<=k;i++);	  }	  {	    int sfb=i;	    i=sfBandIndex->l[i];	    for(;sfb<8;sfb++)	    {	      int t=scalefactors[1].l[sfb];	      int k=sfBandIndex->l[sfb+1]-sfBandIndex->l[sfb];	      if(t!=7)	      {		RATIOS r=ratios[t];		for(;k>0;k--,i++){		  is_pos[i]=t;is_ratio[i]=r;}	      }	      else for(;k>0;k--,i++)is_pos[i]=t;	    }	  }	}      }      else                                // Part II      {	for(int j=0;j<3;j++)	{	  int sfb;      int sfbcnt=-1;	  for(sfb=12;sfb>=0;sfb--)	  {	    int lines;	    {	      int t;	      t=sfBandIndex->s[sfb];	      lines=sfBandIndex->s[sfb+1]-t;	      i=MUL3(t)+(j+1)*lines-1;	    }		  	    for(;lines>0;lines--,i--)	      if(in[1][0][i]!=0.0f)	      {		sfbcnt=sfb;		sfb=0;break;       // quit loop	      }	  }	  for(sfb=sfbcnt+1;sfb<12;sfb++)	  {	    int k,t;	    t=sfBandIndex->s[sfb];	    k=sfBandIndex->s[sfb+1]-t;	    i=MUL3(t)+j*k;	    t=scalefactors[1].s[j][sfb];	    if(t!=7)	    {	      RATIOS r=ratios[t];	      for(;k>0;k--,i++){		is_pos[i]=t;is_ratio[i]=r;}	    }	    else for(;k>0;k--,i++)is_pos[i]=t;	  }	  {	    int t1=sfBandIndex->s[10],	        t2=sfBandIndex->s[11];	    int k,tt;	    tt=MUL3(t1)+j*(t2-t1);	    k =sfBandIndex->s[12]-t2;	    if(is_pos[tt]!=7)	    {	      RATIOS r=is_ratio[tt];	      int  t=is_pos[tt];	      i   =MUL3(t1)+j*k;	      for(;k>0;k--,i++){		is_pos[i]=t;is_ratio[i]=r;}	    }	    else	      for(;k>0;k--,i++)is_pos[i]=7;	  }	}      }    }    else // ms-stereo (Part III)    {      {	REAL temp;	int k;	temp=in[1][0][0];in[1][0][0]=1.0;	for(k=ARRAYSIZE-1;in[1][0][k]==0.0;k--);	in[1][0][0]=temp;	for(i=0;sfBandIndex->l[i]<=k;i++);      }      {	int sfb;	sfb=i;	i=sfBandIndex->l[i];	for(;sfb<21;sfb++)        {	  int k,t;	  k=sfBandIndex->l[sfb+1]-sfBandIndex->l[sfb];	  t=scalefactors[1].l[sfb];	  if(t!=7)	  {	    RATIOS r=ratios[t];	    for(;k>0;k--,i++){	      is_pos[i]=t;is_ratio[i]=r;}	  }	  else	    for(;k>0;k--,i++)is_pos[i]=t;	}      }      if (i <= sfBandIndex->l[21]) {	int k,t,tt;	tt=sfBandIndex->l[20];	k=576-sfBandIndex->l[21];	t=is_pos[tt];	if(t!=7)	{	  RATIOS r=is_ratio[tt];	  for(;k>0;k--,i++){	    is_pos[i]=t;is_ratio[i]=r;}	}	else	  for(;k>0;k--,i++)is_pos[i]=t;      }    }    if(ms_stereo)    {      i=ARRAYSIZE-1;      do{	if(is_pos[i]==7)	{	  register REAL t=in[LS][0][i];	  in[LS][0][i]=(t+in[RS][0][i])*0.7071068f;	  in[RS][0][i]=(t-in[RS][0][i])*0.7071068f;	}	else	{	  in[RS][0][i]=in[LS][0][i]*is_ratio[i].r;	  in[LS][0][i]*=is_ratio[i].l;	}      }while(i--);    }    else    {      i=ARRAYSIZE-1;      do{	if(is_pos[i]!=7)	{	  in[RS][0][i]=in[LS][0][i]*is_ratio[i].r;	  in[LS][0][i]*=is_ratio[i].l;	}      }while(i--);    }  }  else  {    if(ms_stereo)    {      int i=ARRAYSIZE-1;      do{	register REAL t=in[LS][0][i];	in[LS][0][i]=(t+in[RS][0][i])*0.7071068f;	in[RS][0][i]=(t-in[RS][0][i])*0.7071068f;      }while(i--);    }  }  // channels==2}inline void layer3reorder_1(int version,int frequency,			    REAL  in[SBLIMIT][SSLIMIT],			    REAL out[SBLIMIT][SSLIMIT]){  SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]);  int sfb,sfb_start,sfb_lines;    /* NO REORDER FOR LOW 2 SUBBANDS */  out[0][ 0]=in[0][ 0];out[0][ 1]=in[0][ 1];out[0][ 2]=in[0][ 2];  out[0][ 3]=in[0][ 3];out[0][ 4]=in[0][ 4];out[0][ 5]=in[0][ 5];  out[0][ 6]=in[0][ 6];out[0][ 7]=in[0][ 7];out[0][ 8]=in[0][ 8];  out[0][ 9]=in[0][ 9];out[0][10]=in[0][10];out[0][11]=in[0][11];  out[0][12]=in[0][12];out[0][13]=in[0][13];out[0][14]=in[0][14];  out[0][15]=in[0][15];out[0][16]=in[0][16];out[0][17]=in[0][17];  out[1][ 0]=in[1][ 0];out[1][ 1]=in[1][ 1];out[1][ 2]=in[1][ 2];  out[1][ 3]=in[1][ 3];out[1][ 4]=in[1][ 4];out[1][ 5]=in[1][ 5];  out[1][ 6]=in[1][ 6];out[1][ 7]=in[1][ 7];out[1][ 8]=in[1][ 8];  out[1][ 9]=in[1][ 9];out[1][10]=in[1][10];out[1][11]=in[1][11];  out[1][12]=in[1][12];out[1][13]=in[1][13];out[1][14]=in[1][14];  out[1][15]=in[1][15];out[1][16]=in[1][16];out[1][17]=in[1][17];  /* REORDERING FOR REST SWITCHED SHORT */  for(sfb=3,sfb_start=sfBandIndex->s[3],	sfb_lines=sfBandIndex->s[4]-sfb_start;      sfb<13;      sfb++,sfb_start=sfBandIndex->s[sfb],	(sfb_lines=sfBandIndex->s[sfb+1]-sfb_start))  {    for(int freq=0;freq<sfb_lines;freq++)    {      int src_line=sfb_start+(sfb_start<<1)+freq;      int des_line=src_line+(freq<<1);      out[0][des_line  ]=in[0][src_line               ];      out[0][des_line+1]=in[0][src_line+sfb_lines     ];      out[0][des_line+2]=in[0][src_line+(sfb_lines<<1)];    }  }}inline void layer3reorder_2(int version,int frequency,REAL  in[SBLIMIT][SSLIMIT],			    REAL out[SBLIMIT][SSLIMIT]){  SFBANDINDEX *sfBandIndex=&(sfBandIndextable[version][frequency]);  int sfb,sfb_start,sfb_lines;    for(sfb=0,sfb_start=0,sfb_lines=sfBandIndex->s[1];      sfb<13;      sfb++,sfb_start=sfBandIndex->s[sfb],	(sfb_lines=sfBandIndex->s[sfb+1]-sfb_start))  {    for(int freq=0;freq<sfb_lines;freq++)    {      int src_line=sfb_start+(sfb_start<<1)+freq;      int des_line=src_line+(freq<<1);      out[0][des_line  ]=in[0][src_line               ];      out[0][des_line+1]=in[0][src_line+sfb_lines     ];      out[0][des_line+2]=in[0][src_line+(sfb_lines<<1)];    }  }}inline void layer3antialias_1(REAL  in[SBLIMIT][SSLIMIT]){  for(int ss=0;ss<8;ss++)  {    REAL bu,bd; /* upper and lower butterfly inputs */        bu=in[0][17-ss];bd=in[1][ss];    in[0][17-ss]=(bu*cs[ss])-(bd*ca[ss]);    in[1][ss]   =(bd*cs[ss])+(bu*ca[ss]);  }}inlinevoid layer3antialias_2(REAL  in[SBLIMIT][SSLIMIT],		       REAL out[SBLIMIT][SSLIMIT]){  out[0][0]=in[0][0];out[0][1]=in[0][1];  out[0][2]=in[0][2];out[0][3]=in[0][3];  out[0][4]=in[0][4];out[0][5]=in[0][5];  out[0][6]=in[0][6];out[0][7]=in[0][7];  for(int index=SSLIMIT;index<=(SBLIMIT-1)*SSLIMIT;index+=SSLIMIT)  {    for(int n=0;n<8;n++)    {      REAL bu,bd;      bu=in[0][index-n-1];bd=in[0][index+n];      out[0][index-n-1]=(bu*cs[n])-(bd*ca[n]);      out[0][index+n  ]=(bd*cs[n])+(bu*ca[n]);    }    out[0][index-SSLIMIT+8]=in[0][index-SSLIMIT+8];    out[0][index-SSLIMIT+9]=in[0][index-SSLIMIT+9];  }  out[31][ 8]=in[31][ 8];out[31][ 9]=in[31][ 9];  out[31][10]=in[31][10];out[31][11]=in[31][11];  out[31][12]=in[31][12];out[31][13]=in[31][13];  out[31][14]=in[31][14];out[31][15]=in[31][15];  out[31][16]=in[31][16];out[31][17]=in[31][17];}void MPEGaudio::layer3reorderandantialias(int ch,int gr,					  REAL  in[SBLIMIT][SSLIMIT],					  REAL out[SBLIMIT][SSLIMIT]){  register layer3grinfo *gi=&(sideinfo.ch[ch].gr[gr]);  if(gi->generalflag)  {    if(gi->mixed_block_flag)    {      fprintf(stderr,"Notchecked!");      layer3reorder_1  (version,frequency,in,out);    // Not checked...      layer3antialias_1(out);    }    else      layer3reorder_2(version,frequency,in,out);  }  else    layer3antialias_2(in,out);}static void dct36(REAL *inbuf,REAL *prevblk1,REAL *prevblk2,REAL *wi,REAL *out){#define MACRO0(v) {                                 \    REAL tmp;                                       \    out2[9+(v)]=(tmp=sum0+sum1)*wi[27+(v)];         \    out2[8-(v)]=tmp * wi[26-(v)];  }                \    sum0-=sum1;                                     \    ts[SBLIMIT*(8-(v))]=out1[8-(v)]+sum0*wi[8-(v)]; \    ts[SBLIMIT*(9+(v))]=out1[9+(v)]+sum0*wi[9+(v)]; #define MACRO1(v) { \    REAL sum0,sum1; \    sum0=tmp1a+tmp2a; \    sum1=(tmp1b+tmp2b)*hsec_36[(v)]; \    MACRO0(v); }#define MACRO2(v) {                    \    REAL sum0,sum1;                    \    sum0=tmp2a-tmp1a;                  \    sum1=(tmp2b-tmp1b) * hsec_36[(v)]; \    MACRO0(v); }  {    register REAL *in = inbuf;       in[17]+=in[16];in[16]+=in[15];in[15]+=in[14];in[14]+=in[13];     in[13]+=in[12];in[12]+=in[11];in[11]+=in[10];in[10]+=in[ 9];    in[ 9]+=in[ 8];in[ 8]+=in[ 7];in[ 7]+=in[ 6];in[ 6]+=in[ 5];    in[ 5]+=in[ 4];in[ 4]+=in[ 3];in[ 3]+=in[ 2];in[ 2]+=in[ 1];    in[ 1]+=in[ 0];    in[17]+=in[15];in[15]+=in[13];in[13]+=in[11];in[11]+=in[ 9];    in[ 9]+=in[ 7];in[7] +=in[ 5];in[ 5]+=in[ 3];in[ 3]+=in[ 1];    {      register REAL *c = cos_18;      register REAL *out2 = prevblk2;      register REAL *out1 = prevblk1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -