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

📄 decode.c

📁 mepg 1 layer3软解码源代码,实现了对MP3文件的软件解码
💻 C
📖 第 1 页 / 共 4 页
字号:
III_side_info_t *si;{   int ch, gr, i;   int stereo = fr_ps->stereo;    putbits(bs, si->main_data_begin,9);   if (stereo == 1)      putbits(bs, si->private_bits, 5);      else putbits(bs, si->private_bits, 3);   for (ch=0; ch<stereo; ch++)      for (i=0; i<4; i++)         put1bit(bs, si->ch[ch].scfsi[i]);   for (gr=0; gr<2; gr++) {      for (ch=0; ch<stereo; ch++) {         putbits(bs, si->ch[ch].gr[gr].part2_3_length, 12);         putbits(bs, si->ch[ch].gr[gr].big_values, 9);         putbits(bs, si->ch[ch].gr[gr].global_gain, 8);         putbits(bs, si->ch[ch].gr[gr].scalefac_compress, 4);         put1bit(bs, si->ch[ch].gr[gr].window_switching_flag);         if (si->ch[ch].gr[gr].window_switching_flag) {            putbits(bs, si->ch[ch].gr[gr].block_type, 2);            put1bit(bs, si->ch[ch].gr[gr].mixed_block_flag);            for (i=0; i<2; i++)               putbits(bs, si->ch[ch].gr[gr].table_select[i], 5);            for (i=0; i<3; i++)               putbits(bs, si->ch[ch].gr[gr].subblock_gain[i], 3);            }         else {            for (i=0; i<3; i++)            putbits(bs, si->ch[ch].gr[gr].table_select[i], 5);            putbits(bs, si->ch[ch].gr[gr].region0_count, 4);            putbits(bs, si->ch[ch].gr[gr].region1_count, 3);            }               put1bit(bs, si->ch[ch].gr[gr].preflag);         put1bit(bs, si->ch[ch].gr[gr].scalefac_scale);         put1bit(bs, si->ch[ch].gr[gr].count1table_select);         }      }}struct {   int l[5];   int s[3];} sfbtable = {{0, 6, 11, 16, 21},                          {0, 6, 12}};                         int slen[2][16] = {{0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},                   {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}};struct  {   int l[23];   int s[14];} sfBandIndex[3] =      {{{0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},     {0,4,8,12,16,22,30,40,52,66,84,106,136,192}},    {{0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},     {0,4,8,12,16,22,28,38,50,64,80,100,126,192}},    {{0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},     {0,4,8,12,16,22,30,42,58,78,104,138,180,192}}};void III_get_scale_factors(scalefac, si, gr, ch, fr_ps)III_scalefac_t *scalefac;III_side_info_t *si;int gr, ch;frame_params *fr_ps;{int sfb, i, window;struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);    if (gr_info->window_switching_flag && (gr_info->block_type == 2)) {       if (gr_info->mixed_block_flag) { /* MIXED */ /* NEW - ag 11/25 */         for (sfb = 0; sfb < 8; sfb++)            (*scalefac)[ch].l[sfb] = hgetbits(                  slen[0][gr_info->scalefac_compress]);         for (sfb = 3; sfb < 6; sfb++)            for (window=0; window<3; window++)               (*scalefac)[ch].s[window][sfb] = hgetbits(                 slen[0][gr_info->scalefac_compress]);         for (sfb = 6; sfb < 12; sfb++)            for (window=0; window<3; window++)               (*scalefac)[ch].s[window][sfb] = hgetbits(                 slen[1][gr_info->scalefac_compress]);         for (sfb=12,window=0; window<3; window++)            (*scalefac)[ch].s[window][sfb] = 0;      }      else {  /* SHORT*/         for (i=0; i<2; i++)             for (sfb = sfbtable.s[i]; sfb < sfbtable.s[i+1]; sfb++)               for (window=0; window<3; window++)                  (*scalefac)[ch].s[window][sfb] = hgetbits(                     slen[i][gr_info->scalefac_compress]);         for (sfb=12,window=0; window<3; window++)            (*scalefac)[ch].s[window][sfb] = 0;      }    }              else {   /* LONG types 0,1,3 */        for (i=0; i<4; i++) {           if ((si->ch[ch].scfsi[i] == 0) || (gr == 0))              for (sfb = sfbtable.l[i]; sfb < sfbtable.l[i+1]; sfb++)                  (*scalefac)[ch].l[sfb] = hgetbits(                 slen[(i<2)?0:1][gr_info->scalefac_compress]);        }        (*scalefac)[ch].l[22] = 0;     }}/* Already declared in huffman.cstruct huffcodetab ht[HTN];*/int huffman_initialized = FALSE;void initialize_huffman() {   FILE *fi;     if (huffman_initialized) return;   if (!(fi = OpenTableFile("huffdec") )) {      printf("Please check huffman table 'huffdec'\n");      exit(1);   }   if (fi==NULL) {      fprintf(stderr,"decoder table open error\n");      exit(3);      }   if (read_decoder_table(fi) != HTN) {      fprintf(stderr,"decoder table read error\n");      exit(4);      }huffman_initialized = TRUE;}III_hufman_decode(is, si, ch, gr, part2_start, fr_ps)long int is[SBLIMIT][SSLIMIT];III_side_info_t *si;int gr, ch, part2_start;frame_params *fr_ps;{   int i, x, y;   int v, w;   struct huffcodetab *h;   int region1Start;   int region2Start;   int bt = (*si).ch[ch].gr[gr].window_switching_flag && ((*si).ch[ch].gr[gr].block_type == 2);   initialize_huffman();   /* Find region boundary for short block case. */      if ( ((*si).ch[ch].gr[gr].window_switching_flag) &&         ((*si).ch[ch].gr[gr].block_type == 2) ) {          /* Region2. */      region1Start = 36;  /* sfb[9/3]*3=36 */      region2Start = 576; /* No Region2 for short block case. */   }   else {          /* Find region boundary for long block case. */      region1Start = sfBandIndex[fr_ps->header->sampling_frequency]                           .l[(*si).ch[ch].gr[gr].region0_count + 1]; /* MI */      region2Start = sfBandIndex[fr_ps->header->sampling_frequency]                              .l[(*si).ch[ch].gr[gr].region0_count +                              (*si).ch[ch].gr[gr].region1_count + 2]; /* MI */      }   /* Read bigvalues area. */   for (i=0; i<(*si).ch[ch].gr[gr].big_values*2; i+=2) {      if      (i<region1Start) h = &ht[(*si).ch[ch].gr[gr].table_select[0]];      else if (i<region2Start) h = &ht[(*si).ch[ch].gr[gr].table_select[1]];           else                h = &ht[(*si).ch[ch].gr[gr].table_select[2]];      huffman_decoder(h, &x, &y, &v, &w);      is[i/SSLIMIT][i%SSLIMIT] = x;      is[(i+1)/SSLIMIT][(i+1)%SSLIMIT] = y;      }   /* Read count1 area. */   h = &ht[(*si).ch[ch].gr[gr].count1table_select+32];   while ((hsstell() < part2_start + (*si).ch[ch].gr[gr].part2_3_length ) &&     ( i < SSLIMIT*SBLIMIT )) {      huffman_decoder(h, &x, &y, &v, &w);      is[i/SSLIMIT][i%SSLIMIT] = v;      is[(i+1)/SSLIMIT][(i+1)%SSLIMIT] = w;      is[(i+2)/SSLIMIT][(i+2)%SSLIMIT] = x;      is[(i+3)/SSLIMIT][(i+3)%SSLIMIT] = y;      i += 4;      }   if (hsstell() > part2_start + (*si).ch[ch].gr[gr].part2_3_length)   {  i -=4;      rewindNbits(hsstell()-part2_start - (*si).ch[ch].gr[gr].part2_3_length);   }   /* Dismiss stuffing Bits */   if ( hsstell() < part2_start + (*si).ch[ch].gr[gr].part2_3_length )      hgetbits( part2_start + (*si).ch[ch].gr[gr].part2_3_length - hsstell());   /* Zero out rest. */   for (; i<SSLIMIT*SBLIMIT; i++)      is[i/SSLIMIT][i%SSLIMIT] = 0;}int pretab[22] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};void III_dequantize_sample(is,xr,scalefac,gr_info, ch,fr_ps)long int is[SBLIMIT][SSLIMIT];double xr[SBLIMIT][SSLIMIT];struct gr_info_s *gr_info;III_scalefac_t *scalefac;frame_params *fr_ps;int ch;{   int ss,sb,cb=0,sfreq=fr_ps->header->sampling_frequency;   int stereo = fr_ps->stereo;   int next_cb_boundary, cb_begin, cb_width, sign;   /* choose correct scalefactor band per block type, initalize boundary */   if (gr_info->window_switching_flag && (gr_info->block_type == 2) )      if (gr_info->mixed_block_flag)          next_cb_boundary=sfBandIndex[sfreq].l[1];  /* LONG blocks: 0,1,3 */      else {         next_cb_boundary=sfBandIndex[sfreq].s[1]*3; /* pure SHORT block */    cb_width = sfBandIndex[sfreq].s[1];    cb_begin = 0;      }     else       next_cb_boundary=sfBandIndex[sfreq].l[1];  /* LONG blocks: 0,1,3 */   /* apply formula per block type */   for (sb=0 ; sb < SBLIMIT ; sb++)      for (ss=0 ; ss < SSLIMIT ; ss++) {         if ( (sb*18)+ss == next_cb_boundary)  { /* Adjust critical band boundary */            if (gr_info->window_switching_flag && (gr_info->block_type == 2)) {               if (gr_info->mixed_block_flag)  {                  if (((sb*18)+ss) == sfBandIndex[sfreq].l[8])  {                     next_cb_boundary=sfBandIndex[sfreq].s[4]*3;                      cb = 3;                     cb_width = sfBandIndex[sfreq].s[cb+1] -                                 sfBandIndex[sfreq].s[cb];                     cb_begin = sfBandIndex[sfreq].s[cb]*3;                        }                  else if (((sb*18)+ss) < sfBandIndex[sfreq].l[8])                      next_cb_boundary = sfBandIndex[sfreq].l[(++cb)+1];                  else {                     next_cb_boundary = sfBandIndex[sfreq].s[(++cb)+1]*3;                     cb_width = sfBandIndex[sfreq].s[cb+1] -                                     sfBandIndex[sfreq].s[cb];                     cb_begin = sfBandIndex[sfreq].s[cb]*3;                        }                  }               else  {                  next_cb_boundary = sfBandIndex[sfreq].s[(++cb)+1]*3;                  cb_width = sfBandIndex[sfreq].s[cb+1] -                                sfBandIndex[sfreq].s[cb];                cb_begin = sfBandIndex[sfreq].s[cb]*3;                     }             }            else /* long blocks */               next_cb_boundary = sfBandIndex[sfreq].l[(++cb)+1];         }         /* Compute overall (global) scaling. */         xr[sb][ss] = pow( 2.0 , (0.25 * (gr_info->global_gain - 210.0)));         /* Do long/short dependent scaling operations. */                 if (gr_info->window_switching_flag && (            ((gr_info->block_type == 2) && (gr_info->mixed_block_flag == 0)) ||            ((gr_info->block_type == 2) && gr_info->mixed_block_flag && (sb >= 2)) )) {            xr[sb][ss] *= pow(2.0, 0.25 * -8.0 *                     gr_info->subblock_gain[(((sb*18)+ss) - cb_begin)/cb_width]);            xr[sb][ss] *= pow(2.0, 0.25 * -2.0 * (1.0+gr_info->scalefac_scale)              * (*scalefac)[ch].s[(((sb*18)+ss) - cb_begin)/cb_width][cb]);         }         else {   /* LONG block types 0,1,3 & 1st 2 subbands of switched blocks */            xr[sb][ss] *= pow(2.0, -0.5 * (1.0+gr_info->scalefac_scale)                                        * ((*scalefac)[ch].l[cb]                                        + gr_info->preflag * pretab[cb]));         }         /* Scale quantized value. */                 sign = (is[sb][ss]<0) ? 1 : 0;          xr[sb][ss] *= pow( (double) abs(is[sb][ss]), ((double)4.0/3.0) );         if (sign) xr[sb][ss] = -xr[sb][ss];      }}III_reorder (xr, ro, gr_info, fr_ps) double xr[SBLIMIT][SSLIMIT]; double ro[SBLIMIT][SSLIMIT]; struct gr_info_s *gr_info;frame_params *fr_ps;{   int sfreq=fr_ps->header->sampling_frequency;   int sfb, sfb_start, sfb_lines;   int sb, ss, window, freq, src_line, des_line;   for(sb=0;sb<SBLIMIT;sb++)      for(ss=0;ss<SSLIMIT;ss++)          ro[sb][ss] = 0;   if (gr_info->window_switching_flag && (gr_info->block_type == 2)) {      if (gr_info->mixed_block_flag) {         /* NO REORDER FOR LOW 2 SUBBANDS */         for (sb=0 ; sb < 2 ; sb++)            for (ss=0 ; ss < SSLIMIT ; ss++) {               ro[sb][ss] = xr[sb][ss];            }         /* REORDERING FOR REST SWITCHED SHORT */         for(sfb=3,sfb_start=sfBandIndex[sfreq].s[3],            sfb_lines=sfBandIndex[sfreq].s[4] - sfb_start;             sfb < 13; sfb++,sfb_start=sfBandIndex[sfreq].s[sfb],            (sfb_lines=sfBandIndex[sfreq].s[sfb+1] - sfb_start))               for(window=0; window<3; window++)                  for(freq=0;freq<sfb_lines;freq++) {                     src_line = sfb_start*3 + window*sfb_lines + freq;                      des_line = (sfb_start*3) + window + (freq*3);                     ro[des_line/SSLIMIT][des_line%SSLIMIT] =                                     xr[src_line/SSLIMIT][src_line%SSLIMIT];               }      }       else {  /* pure short */         for(sfb=0,sfb_start=0,sfb_lines=sfBandIndex[sfreq].s[1];             sfb < 13; sfb++,sfb_start=sfBandIndex[sfreq].s[sfb],            (sfb_lines=sfBandIndex[sfreq].s[sfb+1] - sfb_start))               for(window=0; window<3; window++)                  for(freq=0;freq<sfb_lines;freq++) {                     src_line = sfb_start*3 + window*sfb_lines + freq;                      des_line = (sfb_start*3) + window + (freq*3);                     ro[des_line/SSLIMIT][des_line%SSLIMIT] =                                     xr[src_line/SSLIMIT][src_line%SSLIMIT];               }      }   }   else {   /*long blocks */      for (sb=0 ; sb < SBLIMIT ; sb++)         for (ss=0 ; ss < SSLIMIT ; ss++)             ro[sb][ss] = xr[sb][ss];   }}void III_stereo(xr, lr, scalefac, gr_info, fr_ps)double xr[2][SBLIMIT][SSLIMIT];double lr[2][SBLIMIT][SSLIMIT];III_scalefac_t *scalefac;struct gr_info_s *gr_info;frame_params *fr_ps;{   int sfreq = fr_ps->header->sampling_frequency;   int stereo = fr_ps->stereo;   int ms_stereo = (fr_ps->header->mode == MPG_MD_JOINT_STEREO) &&                   (fr_ps->header->mode_ext & 0x2);    int i_stereo = (fr_ps->header->mode == MPG_MD_JOINT_STEREO) &&                  (fr_ps->header->mode_ext & 0x1);   int js_bound;  /* frequency line that marks the beggining of the zero part */     int sfb,next_sfb_boundary;   int i,j,sb,ss,ch,is_pos[576];    double is_ratio[576];     /* intialization */   for ( i=0; i<576; i++ )      is_pos[i] = 7;   if ((stereo == 2) && i_stereo )   {  if (gr_info->window_switching_flag && (gr_info->block_type == 2))

⌨️ 快捷键说明

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