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

📄 layer3.c

📁 音频编码
💻 C
📖 第 1 页 / 共 4 页
字号:
    int i,max = -1;    int cb = 0;    int *m = map[sfreq][2];    real v = 0.0;    int mc = 0;	/*     * long hash table values     */    for(i=0;i<3;i++) {      int lp = l[i];      struct newhuff *h = (struct newhuff *)(ht+gr_infos->table_select[i]);      for(;lp;lp--,mc--) {        int x,y;        if(!mc) {          mc = *m++;          v = gr_infos->pow2gain[((*scf++) + (*pretab++)) << shift];          cb = *m++;        }        {          short *val = (short *)h->table;          while((y=*val++)<0) {            if (get1bit(mp))              val -= y;            part2remain--;          }          x = y >> 4;          y &= 0xf;        }        if (x == 15) {          max = cb;          part2remain -= h->linbits+1;          x += getbits(mp,(int)h->linbits);          if(get1bit(mp))            *xrpnt++ = -ispow[x] * v;          else            *xrpnt++ =  ispow[x] * v;        }        else if(x) {          max = cb;          if(get1bit(mp))            *xrpnt++ = -ispow[x] * v;          else            *xrpnt++ =  ispow[x] * v;          part2remain--;        }        else          *xrpnt++ = 0.0;        if (y == 15) {          max = cb;          part2remain -= h->linbits+1;          y += getbits(mp,(int)h->linbits);          if(get1bit(mp))            *xrpnt++ = -ispow[y] * v;          else            *xrpnt++ =  ispow[y] * v;        }        else if(y) {          max = cb;          if(get1bit(mp))            *xrpnt++ = -ispow[y] * v;          else            *xrpnt++ =  ispow[y] * v;          part2remain--;        }        else          *xrpnt++ = 0.0;      }    }	/*     * short (count1table) values     */    for(;l3 && (part2remain > 0);l3--) {      struct newhuff *h = (struct newhuff *)(htc+gr_infos->count1table_select);      short *val = (short *)h->table,a;      while((a=*val++)<0) {        part2remain--;        if(part2remain < 0) {          part2remain++;          a = 0;          break;        }        if (get1bit(mp))          val -= a;      }      for(i=0;i<4;i++) {        if(!(i & 1)) {          if(!mc) {            mc = *m++;            cb = *m++;            v = gr_infos->pow2gain[((*scf++) + (*pretab++)) << shift];          }          mc--;        }        if ( (a & (0x8>>i)) ) {          max = cb;          part2remain--;          if(part2remain < 0) {            part2remain++;            break;          }          if(get1bit(mp))            *xrpnt++ = -v;          else            *xrpnt++ = v;        }        else          *xrpnt++ = 0.0;      }    }	/*      * zero part     */    for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) {      *xrpnt++ = 0.0;      *xrpnt++ = 0.0;    }    gr_infos->maxbandl = max+1;    gr_infos->maxb = longLimit[sfreq][gr_infos->maxbandl];  }  while( part2remain > 16 ) {    getbits(mp,16); /* Dismiss stuffing Bits */    part2remain -= 16;  }  if(part2remain > 0)    getbits(mp,part2remain);  else if(part2remain < 0) {    fprintf(stderr,"mpg123: Can't rewind stream by %d bits!\n",-part2remain);    return 1; /* -> error */  }  return 0;}/*  * III_stereo: calculate real channel values for Joint-I-Stereo-mode */static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,   struct gr_info_s *gr_infos,int sfreq,int ms_stereo,int lsf){      real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf;      struct bandInfoStruct *bi = (struct bandInfoStruct *)&bandInfo[sfreq];      real *tabl1,*tabl2;      if(lsf) {        int p = gr_infos->scalefac_compress & 0x1;	    if(ms_stereo) {          tabl1 = pow1_2[p]; tabl2 = pow2_2[p];        }        else {          tabl1 = pow1_1[p]; tabl2 = pow2_1[p];        }      }      else {        if(ms_stereo) {          tabl1 = tan1_2; tabl2 = tan2_2;        }        else {          tabl1 = tan1_1; tabl2 = tan2_1;        }      }      if (gr_infos->block_type == 2)      {         int lwin,do_l = 0;         if( gr_infos->mixed_block_flag )           do_l = 1;         for (lwin=0;lwin<3;lwin++) /* process each window */         {             /* get first band with zero values */           int is_p,sb,idx,sfb = gr_infos->maxband[lwin];  /* sfb is minimal 3 for mixed mode */           if(sfb > 3)             do_l = 0;           for(;sfb<12;sfb++)           {             is_p = scalefac[sfb*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */              if(is_p != 7) {               real t1,t2;               sb = bi->shortDiff[sfb];               idx = bi->shortIdx[sfb] + lwin;               t1 = tabl1[is_p]; t2 = tabl2[is_p];               for (; sb > 0; sb--,idx+=3)               {                 real v = xr[0][idx];                 xr[0][idx] = v * t1;                 xr[1][idx] = v * t2;               }             }           }#if 1/* in the original: copy 10 to 11 , here: copy 11 to 12 maybe still wrong??? (copy 12 to 13?) */           is_p = scalefac[11*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */           sb = bi->shortDiff[12];           idx = bi->shortIdx[12] + lwin;#else           is_p = scalefac[10*3+lwin-gr_infos->mixed_block_flag]; /* scale: 0-15 */           sb = bi->shortDiff[11];           idx = bi->shortIdx[11] + lwin;#endif           if(is_p != 7)           {             real t1,t2;             t1 = tabl1[is_p]; t2 = tabl2[is_p];             for ( ; sb > 0; sb--,idx+=3 )             {                 real v = xr[0][idx];               xr[0][idx] = v * t1;               xr[1][idx] = v * t2;             }           }         } /* end for(lwin; .. ; . ) */         if (do_l)         {/* also check l-part, if ALL bands in the three windows are 'empty' * and mode = mixed_mode  */           int sfb = gr_infos->maxbandl;           int idx = bi->longIdx[sfb];           for ( ; sfb<8; sfb++ )           {             int sb = bi->longDiff[sfb];             int is_p = scalefac[sfb]; /* scale: 0-15 */             if(is_p != 7) {               real t1,t2;               t1 = tabl1[is_p]; t2 = tabl2[is_p];               for ( ; sb > 0; sb--,idx++)               {                 real v = xr[0][idx];                 xr[0][idx] = v * t1;                 xr[1][idx] = v * t2;               }             }             else                idx += sb;           }         }           }       else /* ((gr_infos->block_type != 2)) */      {        int sfb = gr_infos->maxbandl;        int is_p,idx = bi->longIdx[sfb];        for ( ; sfb<21; sfb++)        {          int sb = bi->longDiff[sfb];          is_p = scalefac[sfb]; /* scale: 0-15 */          if(is_p != 7) {            real t1,t2;            t1 = tabl1[is_p]; t2 = tabl2[is_p];            for ( ; sb > 0; sb--,idx++)            {               real v = xr[0][idx];               xr[0][idx] = v * t1;               xr[1][idx] = v * t2;            }          }          else            idx += sb;        }        is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */        if(is_p != 7)        {          int sb;          real t1 = tabl1[is_p],t2 = tabl2[is_p];           for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ )          {            real v = xr[0][idx];            xr[0][idx] = v * t1;            xr[1][idx] = v * t2;          }        }      } /* ... */}static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_infos){   int sblim;   if(gr_infos->block_type == 2)   {      if(!gr_infos->mixed_block_flag)         return;      sblim = 1;    }   else {     sblim = gr_infos->maxb-1;   }   /* 31 alias-reduction operations between each pair of sub-bands */   /* with 8 butterflies between each pair                         */   {     int sb;     real *xr1=(real *) xr[1];     for(sb=sblim;sb;sb--,xr1+=10)     {       int ss;       real *cs=aa_cs,*ca=aa_ca;       real *xr2 = xr1;       for(ss=7;ss>=0;ss--)       {       /* upper and lower butterfly inputs */         real bu = *--xr2,bd = *xr1;         *xr2   = (bu * (*cs)   ) - (bd * (*ca)   );         *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) );       }     }  }}/* DCT insipired by Jeff Tsay's DCT from the maplay package this is an optimized version with manual unroll. References: [1] S. Winograd: "On Computing the Discrete Fourier Transform",     Mathematics of Computation, Volume 32, Number 141, January 1978,     Pages 175-199*/static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf){  {    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];  {#define MACRO0(v) { \    real tmp; \    out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \    out2[8-(v)] = tmp * w[26-(v)];  } \    sum0 -= sum1; \    ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \    ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; #define MACRO1(v) { \	real sum0,sum1; \    sum0 = tmp1a + tmp2a; \	sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \	MACRO0(v); }#define MACRO2(v) { \    real sum0,sum1; \    sum0 = tmp2a - tmp1a; \    sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \	MACRO0(v); }    const real *c = COS9;    real *out2 = o2;	real *w = wintab;	real *out1 = o1;	real *ts = tsbuf;    real ta33,ta66,tb33,tb66;    ta33 = in[2*3+0] * c[3];    ta66 = in[2*6+0] * c[6];    tb33 = in[2*3+1] * c[3];    tb66 = in[2*6+1] * c[6];    {       real tmp1a,tmp2a,tmp1b,tmp2b;      tmp1a =             in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7];      tmp1b =             in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7];      tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8];      tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8];      MACRO1(0);      MACRO2(8);    }    {      real tmp1a,tmp2a,tmp1b,tmp2b;      tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3];      tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3];      tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0];      tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1];      MACRO1(1);      MACRO2(7);    }    {      real tmp1a,tmp2a,tmp1b,tmp2b;      tmp1a =             in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1];      tmp1b =             in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1];      tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4];      tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4];      MACRO1(2);      MACRO2(6);    }    {      real tmp1a,tmp2a,tmp1b,tmp2b;      tmp1a =             in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5];      tmp1b =             in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5];      tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2];      tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2];      MACRO1(3);      MACRO2(5);    }	{		real sum0,sum1;    	sum0 =  in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0];    	sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4];		MACRO0(4);	}  }  }}/* * new DCT12 */static void dct12(real *in,real *rawout1,real *rawout2,real *wi,real *ts){#define DCT12_PART1 \             in5 = in[5*3];  \     in5 += (in4 = in[4*3]); \     in4 += (in3 = in[3*3]); \     in3 += (in2 = in[2*3]); \

⌨️ 快捷键说明

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