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

📄 decode.c

📁 mepg 1 layer3软解码源代码,实现了对MP3文件的软件解码
💻 C
📖 第 1 页 / 共 4 页
字号:
      {  if( gr_info->mixed_block_flag )         {  int max_sfb = 0;            for ( j=0; j<3; j++ )            {  int sfbcnt;               sfbcnt = 2;               for( sfb=12; sfb >=3; sfb-- )               {  int lines;                  lines = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];                  i = 3*sfBandIndex[sfreq].s[sfb] + (j+1) * lines - 1;                  while ( lines > 0 )                  {  if ( xr[1][i/SSLIMIT][i%SSLIMIT] != 0.0 )                     {  sfbcnt = sfb;                        sfb = -10;                        lines = -10;                     }                     lines--;                     i--;                  }               }               sfb = sfbcnt + 1;               if ( sfb > max_sfb )                  max_sfb = sfb;               while( sfb<12 )               {  sb = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];                  i = 3*sfBandIndex[sfreq].s[sfb] + j * sb;                  for ( ; sb > 0; sb--)                  {  is_pos[i] = (*scalefac)[1].s[j][sfb];                     if ( is_pos[i] != 7 )                        is_ratio[i] = tan( is_pos[i] * (PI / 12));                     i++;                  }                  sfb++;               }               sb = sfBandIndex[sfreq].s[11]-sfBandIndex[sfreq].s[10];               sfb = 3*sfBandIndex[sfreq].s[10] + j * sb;               sb = sfBandIndex[sfreq].s[12]-sfBandIndex[sfreq].s[11];               i = 3*sfBandIndex[sfreq].s[11] + j * sb;               for ( ; sb > 0; sb-- )               {  is_pos[i] = is_pos[sfb];                  is_ratio[i] = is_ratio[sfb];                  i++;               }             }             if ( max_sfb <= 3 )             {  i = 2;                ss = 17;                sb = -1;                while ( i >= 0 )                {  if ( xr[1][i][ss] != 0.0 )                   {  sb = i*18+ss;                      i = -1;                   } else                   {  ss--;                      if ( ss < 0 )                      {  i--;                         ss = 17;                      }                   }                }                i = 0;                while ( sfBandIndex[sfreq].l[i] <= sb )                   i++;                sfb = i;                i = sfBandIndex[sfreq].l[i];                for ( ; sfb<8; sfb++ )                {  sb = sfBandIndex[sfreq].l[sfb+1]-sfBandIndex[sfreq].l[sfb];                   for ( ; sb > 0; sb--)                   {  is_pos[i] = (*scalefac)[1].l[sfb];                      if ( is_pos[i] != 7 )                         is_ratio[i] = tan( is_pos[i] * (PI / 12));                      i++;                   }                }            }         } else         {  for ( j=0; j<3; j++ )            {  int sfbcnt;               sfbcnt = -1;               for( sfb=12; sfb >=0; sfb-- )               {  int lines;                  lines = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];                  i = 3*sfBandIndex[sfreq].s[sfb] + (j+1) * lines - 1;                  while ( lines > 0 )                  {  if ( xr[1][i/SSLIMIT][i%SSLIMIT] != 0.0 )                     {  sfbcnt = sfb;                        sfb = -10;                        lines = -10;                     }                     lines--;                     i--;                  }               }               sfb = sfbcnt + 1;               while( sfb<12 )               {  sb = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];                  i = 3*sfBandIndex[sfreq].s[sfb] + j * sb;                  for ( ; sb > 0; sb--)                  {  is_pos[i] = (*scalefac)[1].s[j][sfb];                     if ( is_pos[i] != 7 )                        is_ratio[i] = tan( is_pos[i] * (PI / 12));                     i++;                  }                  sfb++;               }               sb = sfBandIndex[sfreq].s[11]-sfBandIndex[sfreq].s[10];               sfb = 3*sfBandIndex[sfreq].s[10] + j * sb;               sb = sfBandIndex[sfreq].s[12]-sfBandIndex[sfreq].s[11];               i = 3*sfBandIndex[sfreq].s[11] + j * sb;               for ( ; sb > 0; sb-- )               {  is_pos[i] = is_pos[sfb];                  is_ratio[i] = is_ratio[sfb];                  i++;               }            }         }      } else      {  i = 31;         ss = 17;         sb = 0;         while ( i >= 0 )         {  if ( xr[1][i][ss] != 0.0 )            {  sb = i*18+ss;               i = -1;            } else            {  ss--;               if ( ss < 0 )               {  i--;                  ss = 17;               }            }         }         i = 0;         while ( sfBandIndex[sfreq].l[i] <= sb )            i++;         sfb = i;         i = sfBandIndex[sfreq].l[i];         for ( ; sfb<21; sfb++ )         {  sb = sfBandIndex[sfreq].l[sfb+1] - sfBandIndex[sfreq].l[sfb];            for ( ; sb > 0; sb--)            {  is_pos[i] = (*scalefac)[1].l[sfb];               if ( is_pos[i] != 7 )                  is_ratio[i] = tan( is_pos[i] * (PI / 12));               i++;            }         }         sfb = sfBandIndex[sfreq].l[20];         for ( sb = 576 - sfBandIndex[sfreq].l[21]; sb > 0; sb-- )         {  is_pos[i] = is_pos[sfb];            is_ratio[i] = is_ratio[sfb];            i++;         }      }   }   for(ch=0;ch<2;ch++)      for(sb=0;sb<SBLIMIT;sb++)         for(ss=0;ss<SSLIMIT;ss++)             lr[ch][sb][ss] = 0;   if (stereo==2)       for(sb=0;sb<SBLIMIT;sb++)         for(ss=0;ss<SSLIMIT;ss++) {            i = (sb*18)+ss;            if ( is_pos[i] == 7 ) {               if ( ms_stereo ) {                  lr[0][sb][ss] = (xr[0][sb][ss]+xr[1][sb][ss])/1.41421356;                  lr[1][sb][ss] = (xr[0][sb][ss]-xr[1][sb][ss])/1.41421356;               }               else {                  lr[0][sb][ss] = xr[0][sb][ss];                  lr[1][sb][ss] = xr[1][sb][ss];               }            }            else if (i_stereo ) {               lr[0][sb][ss] = xr[0][sb][ss] * (is_ratio[i]/(1+is_ratio[i]));               lr[1][sb][ss] = xr[0][sb][ss] * (1/(1+is_ratio[i]));             }            else {               printf("Error in streo processing\n");            }         }   else  /* mono , bypass xr[0][][] to lr[0][][]*/      for(sb=0;sb<SBLIMIT;sb++)         for(ss=0;ss<SSLIMIT;ss++)            lr[0][sb][ss] = xr[0][sb][ss];}double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};void III_antialias(xr, hybridIn, gr_info, fr_ps)double xr[SBLIMIT][SSLIMIT];    double hybridIn[SBLIMIT][SSLIMIT];struct gr_info_s *gr_info;             frame_params *fr_ps;            {   static int    init = 1;   static double ca[8],cs[8];   double        bu,bd;  /* upper and lower butterfly inputs */   int           ss,sb,sblim;   if (init) {      int i;      double    sq;      for (i=0;i<8;i++) {         sq=sqrt(1.0+Ci[i]*Ci[i]);         cs[i] = 1.0/sq;         ca[i] = Ci[i]/sq;      }      init = 0;   }      /* clear all inputs */            for(sb=0;sb<SBLIMIT;sb++)       for(ss=0;ss<SSLIMIT;ss++)          hybridIn[sb][ss] = xr[sb][ss];   if  (gr_info->window_switching_flag && (gr_info->block_type == 2) &&       !gr_info->mixed_block_flag ) return;   if ( gr_info->window_switching_flag && gr_info->mixed_block_flag &&     (gr_info->block_type == 2))      sblim = 1;   else      sblim = SBLIMIT-1;   /* 31 alias-reduction operations between each pair of sub-bands */   /* with 8 butterflies between each pair                         */   for(sb=0;sb<sblim;sb++)         for(ss=0;ss<8;ss++) {               bu = xr[sb][17-ss];         bd = xr[sb+1][ss];         hybridIn[sb][17-ss] = (bu * cs[ss]) - (bd * ca[ss]);         hybridIn[sb+1][ss] = (bd * cs[ss]) + (bu * ca[ss]);         }  }void inv_mdct(in, out, block_type)double in[18];double out[36];int block_type;{/*------------------------------------------------------------------*//*                                                                  *//*    Function: Calculation of the inverse MDCT                     *//*    In the case of short blocks the 3 output vectors are already  *//*    overlapped and added in this modul.                           *//*                                                                  *//*    New layer3                                                    *//*                                                                  *//*------------------------------------------------------------------*/int     k,i,m,N,p;double  tmp[12],sum;static  double  win[4][36];static  int init=0;static  double COS[4*36];    if(init==0){    /* type 0 */      for(i=0;i<36;i++)         win[0][i] = sin( PI/36 *(i+0.5) );    /* type 1*/      for(i=0;i<18;i++)         win[1][i] = sin( PI/36 *(i+0.5) );      for(i=18;i<24;i++)         win[1][i] = 1.0;      for(i=24;i<30;i++)         win[1][i] = sin( PI/12 *(i+0.5-18) );      for(i=30;i<36;i++)         win[1][i] = 0.0;    /* type 3*/      for(i=0;i<6;i++)         win[3][i] = 0.0;      for(i=6;i<12;i++)         win[3][i] = sin( PI/12 *(i+0.5-6) );      for(i=12;i<18;i++)         win[3][i] =1.0;      for(i=18;i<36;i++)         win[3][i] = sin( PI/36*(i+0.5) );    /* type 2*/      for(i=0;i<12;i++)         win[2][i] = sin( PI/12*(i+0.5) ) ;      for(i=12;i<36;i++)         win[2][i] = 0.0 ;      for (i=0; i<4*36; i++)         COS[i] = cos(PI/(2*36) * i);      init++;    }    for(i=0;i<36;i++)       out[i]=0;    if(block_type == 2){       N=12;       for(i=0;i<3;i++){          for(p= 0;p<N;p++){             sum = 0.0;             for(m=0;m<N/2;m++)                sum += in[i+3*m] * cos( PI/(2*N)*(2*p+1+N/2)*(2*m+1) );             tmp[p] = sum * win[block_type][p] ;          }          for(p=0;p<N;p++)             out[6*i+p+6] += tmp[p];       }    }    else{      N=36;      for(p= 0;p<N;p++){         sum = 0.0;         for(m=0;m<N/2;m++)           sum += in[m] * COS[((2*p+1+N/2)*(2*m+1))%(4*36)];         out[p] = sum * win[block_type][p];      }    }}void III_hybrid(fsIn, tsOut ,sb, ch, gr_info, fr_ps)double fsIn[SSLIMIT];   /* freq samples per subband in */double tsOut[SSLIMIT];  /* time samples per subband out */int sb, ch;struct gr_info_s *gr_info;             frame_params *fr_ps;            {   int ss;   double rawout[36];   static double prevblck[2][SBLIMIT][SSLIMIT];   static int init = 1;   int bt;   if (init) {      int i,j,k;            for(i=0;i<2;i++)         for(j=0;j<SBLIMIT;j++)            for(k=0;k<SSLIMIT;k++)               prevblck[i][j][k]=0.0;      init = 0;   }   bt = (gr_info->window_switching_flag && gr_info->mixed_block_flag &&          (sb < 2)) ? 0 : gr_info->block_type;    inv_mdct( fsIn, rawout, bt);   /* overlap addition */   for(ss=0; ss<SSLIMIT; ss++) {      tsOut[ss] = rawout[ss] + prevblck[ch][sb][ss];      prevblck[ch][sb][ss] = rawout[ss+18];   }}/* Return the number of slots for main data of current frame, */int main_data_slots(fr_ps)frame_params fr_ps;{int nSlots;   nSlots = (144 * bitrate[2][fr_ps.header->bitrate_index])	    / s_freq[fr_ps.header->sampling_frequency];  if (fr_ps.header->padding) nSlots++;  nSlots -= 4;  if (fr_ps.header->error_protection) nSlots -= 2;  if (fr_ps.stereo == 1) nSlots -= 17; else nSlots -=32;  return(nSlots);}

⌨️ 快捷键说明

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