📄 decode.c
字号:
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];
}
}
static void III_i_stereo_k_values(is_pos,io,i,k)
double io;
int is_pos,i;
double FAR k[2][576];
{
if(is_pos == 0)
{
k[0][i] = 1;
k[1][i] = 1;
}
else if ((is_pos % 2) == 1)
{
k[0][i] = pow(io,(double)((is_pos + 1)/2));
k[1][i] = 1;
}
else
{
k[0][i] = 1;
k[1][i] = pow(io,(double)(is_pos/2));
}
}
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;
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;
short is_pos[SBLIMIT*SSLIMIT];
double is_ratio[SBLIMIT*SSLIMIT];
double io;
double FAR k[2][SBLIMIT*SSLIMIT];
int lsf = (fr_ps->header->version == MPEG_PHASE2_LSF);
if( (gr_info->scalefac_compress % 2) == 1)
{
io = (double)0.707106781188;
}
else
{
io = (double)0.840896415256;
}
sfreq=fr_ps->header->sampling_frequency + (fr_ps->header->version * 3);
/* intialization */
for ( i=0; i<SBLIMIT*SSLIMIT; i++ )
is_pos[i] = 7;
if ((stereo == 2) && i_stereo )
{ if (gr_info->window_switching_flag && (gr_info->block_type == 2))
{ 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 )
if( lsf )
{
III_i_stereo_k_values(is_pos[i],io,i,k);
}
else
{
is_ratio[i] = tan((double)is_pos[i] * (PI / 12));
}
i++;
}
sfb++;
}
sb = sfBandIndex[sfreq].s[12]-sfBandIndex[sfreq].s[11];
sfb = 3*sfBandIndex[sfreq].s[11] + j * sb;
sb = sfBandIndex[sfreq].s[13]-sfBandIndex[sfreq].s[12];
i = 3*sfBandIndex[sfreq].s[11] + j * sb;
for ( ; sb > 0; sb-- )
{ is_pos[i] = is_pos[sfb];
is_ratio[i] = is_ratio[sfb];
k[0][i] = k[0][sfb];
k[1][i] = k[1][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 )
if ( lsf )
{
III_i_stereo_k_values(is_pos[i],io,i,k);
}
else
{
is_ratio[i] = tan((double)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 )
if( lsf )
{
III_i_stereo_k_values(is_pos[i],io,i,k);
}
else
{
is_ratio[i] = tan( (double)is_pos[i] * (PI / 12));
}
i++;
}
sfb++;
}
sb = sfBandIndex[sfreq].s[12]-sfBandIndex[sfreq].s[11];
sfb = 3*sfBandIndex[sfreq].s[11] + j * sb;
sb = sfBandIndex[sfreq].s[13]-sfBandIndex[sfreq].s[12];
i = 3*sfBandIndex[sfreq].s[11] + j * sb;
for ( ; sb > 0; sb-- )
{ is_pos[i] = is_pos[sfb];
is_ratio[i] = is_ratio[sfb];
k[0][i] = k[0][sfb];
k[1][i] = k[1][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 )
if( lsf )
{
III_i_stereo_k_values(is_pos[i],io,i,k);
}
else
{
is_ratio[i] = tan((double)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];
k[0][i] = k[0][sfb];
k[1][i] = k[1][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])/(double)1.41421356;
lr[1][sb][ss] = (xr[0][sb][ss]-xr[1][sb][ss])/(double)1.41421356;
}
else {
lr[0][sb][ss] = xr[0][sb][ss];
lr[1][sb][ss] = xr[1][sb][ss];
}
}
else if (i_stereo ) {
if ( lsf )
{
lr[0][sb][ss] = xr[0][sb][ss] * k[0][i];
lr[1][sb][ss] = xr[0][sb][ss] * k[1][i];
}
else
{
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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -