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