📄 decode.c
字号:
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 + -