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

📄 mpeglayer3.cpp

📁 JPEG-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]);
  }
}

inline
void 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;
      register REAL *ts = out;

⌨️ 快捷键说明

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