private void stereo(int gr)
{
int sb, ss;
if (channels == 1)
{
// mono , bypass xr[0][][] to lr[0][][]
for (sb = 0; sb < SBLIMIT; sb++)
for (ss = 0; ss < SSLIMIT; ss += 3)
{
lr[0][sb][ss] = ro[0][sb][ss];
lr[0][sb][ss + 1] = ro[0][sb][ss + 1];
lr[0][sb][ss + 2] = ro[0][sb][ss + 2];
}
}
else
{
gr_info_s gr_info = (si.ch[0].gr[gr]);
int mode_ext = header.mode_extension();
int sfb;
int i;
int lines, temp, temp2;
bool ms_stereo = ((header.mode() == Header.JOINT_STEREO) && ((mode_ext & 0x2) != 0));
bool i_stereo = ((header.mode() == Header.JOINT_STEREO) && ((mode_ext & 0x1) != 0));
bool lsf = ((header.version() == Header.MPEG2_LSF || header.version() == Header.MPEG25_LSF)); // SZD
int io_type = (gr_info.scalefac_compress & 1);
// initialization
for (i = 0; i < 576; i++)
{
is_pos[i] = 7;
is_ratio[i] = 0.0f;
}
if (i_stereo)
{
if ((gr_info.window_switching_flag != 0) && (gr_info.block_type == 2))
{
if (gr_info.mixed_block_flag != 0)
{
int max_sfb = 0;
for (int j = 0; j < 3; j++)
{
int sfbcnt;
sfbcnt = 2;
for (sfb = 12; sfb >= 3; sfb--)
{
i = sfBandIndex[sfreq].s[sfb];
lines = sfBandIndex[sfreq].s[sfb + 1] - i;
i = (i << 2) - i + (j + 1) * lines - 1;
while (lines > 0)
{
if (ro[1][i / 18][i % 18] != 0.0f)
{
// MDM: in java, array access is very slow.
// Is quicker to compute div and mod values.
//if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) {
sfbcnt = sfb;
sfb = - 10;
lines = - 10;
}
lines--;
i--;
} // while (lines > 0)
}
// for (sfb=12 ...
sfb = sfbcnt + 1;
if (sfb > max_sfb)
max_sfb = sfb;
while (sfb < 12)
{
temp = sfBandIndex[sfreq].s[sfb];
sb = sfBandIndex[sfreq].s[sfb + 1] - temp;
i = (temp << 2) - temp + j * sb;
for (; sb > 0; sb--)
{
is_pos[i] = scalefac[1].s[j][sfb];
if (is_pos[i] != 7)
if (lsf)
i_stereo_k_values(is_pos[i], io_type, i);
else
is_ratio[i] = TAN12[is_pos[i]];
i++;
}
// for (; sb>0...
sfb++;
} // while (sfb < 12)
sfb = sfBandIndex[sfreq].s[10];
sb = sfBandIndex[sfreq].s[11] - sfb;
sfb = (sfb << 2) - sfb + j * sb;
temp = sfBandIndex[sfreq].s[11];
sb = sfBandIndex[sfreq].s[12] - temp;
i = (temp << 2) - temp + j * sb;
for (; sb > 0; sb--)
{
is_pos[i] = is_pos[sfb];
if (lsf)
{
k[0][i] = k[0][sfb];
k[1][i] = k[1][sfb];
}
else
{
is_ratio[i] = is_ratio[sfb];
}
i++;
}
// for (; sb > 0 ...
}
if (max_sfb <= 3)
{
i = 2;
ss = 17;
sb = - 1;
while (i >= 0)
{
if (ro[1][i][ss] != 0.0f)
{
sb = (i << 4) + (i << 1) + ss;
i = - 1;
}
else
{
ss--;
if (ss < 0)
{
i--;
ss = 17;
}
}
// if (ro ...
} // while (i>=0)
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)
i_stereo_k_values(is_pos[i], io_type, i);
else
is_ratio[i] = TAN12[is_pos[i]];
i++;
}
// for (; sb>0 ...
}
// for (; sfb<8 ...
}
// for (j=0 ...
}
else
{
// if (gr_info.mixed_block_flag)
for (int j = 0; j < 3; j++)
{
int sfbcnt;
sfbcnt = - 1;
for (sfb = 12; sfb >= 0; sfb--)
{
temp = sfBandIndex[sfreq].s[sfb];
lines = sfBandIndex[sfreq].s[sfb + 1] - temp;
i = (temp << 2) - temp + (j + 1) * lines - 1;
while (lines > 0)
{
if (ro[1][i / 18][i % 18] != 0.0f)
{
// MDM: in java, array access is very slow.
// Is quicker to compute div and mod values.
//if (ro[1][ss_div[i]][ss_mod[i]] != 0.0f) {
sfbcnt = sfb;
sfb = - 10;
lines = - 10;
}
lines--;
i--;
} // while (lines > 0) */
}
// for (sfb=12 ...
sfb = sfbcnt + 1;
while (sfb < 12)
{
temp = sfBandIndex[sfreq].s[sfb];
sb = sfBandIndex[sfreq].s[sfb + 1] - temp;
i = (temp << 2) - temp + j * sb;
for (; sb > 0; sb--)
{
is_pos[i] = scalefac[1].s[j][sfb];
if (is_pos[i] != 7)
if (lsf)
i_stereo_k_values(is_pos[i], io_type, i);
else
is_ratio[i] = TAN12[is_pos[i]];
i++;
}
// for (; sb>0 ...
sfb++;
} // while (sfb<12)
temp = sfBandIndex[sfreq].s[10];
temp2 = sfBandIndex[sfreq].s[11];
sb = temp2 - temp;
sfb = (temp << 2) - temp + j * sb;
sb = sfBandIndex[sfreq].s[12] - temp2;
i = (temp2 << 2) - temp2 + j * sb;
for (; sb > 0; sb--)
{
is_pos[i] = is_pos[sfb];
if (lsf)
{
k[0][i] = k[0][sfb];
k[1][i] = k[1][sfb];
}
else
{
is_ratio[i] = is_ratio[sfb];
}
i++;
}
// for (; sb>0 ...
}
// for (sfb=12
}
// for (j=0 ...
}
else
{
// if (gr_info.window_switching_flag ...
i = 31;
ss = 17;
sb = 0;
while (i >= 0)
{
if (ro[1][i][ss] != 0.0f)
{
sb = (i << 4) + (i << 1) + 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)
i_stereo_k_values(is_pos[i], io_type, i);
else
is_ratio[i] = TAN12[is_pos[i]];
i++;
}
}
sfb = sfBandIndex[sfreq].l[20];
for (sb = 576 - sfBandIndex[sfreq].l[21]; (sb > 0) && (i < 576); sb--)
{
is_pos[i] = is_pos[sfb]; // error here : i >=576
if (lsf)
{
k[0][i] = k[0][sfb];
k[1][i] = k[1][sfb];
}
else
{
is_ratio[i] = is_ratio[sfb];
}
i++;
}
// if (gr_info.mixed_block_flag)
}
// if (gr_info.window_switching_flag ...
}
// if (i_stereo)
i = 0;
for (sb = 0; sb < SBLIMIT; sb++)
for (ss = 0; ss < SSLIMIT; ss++)
{
if (is_pos[i] == 7)
{
if (ms_stereo)
{
lr[0][sb][ss] = (ro[0][sb][ss] + ro[1][sb][ss]) * 0.707106781f;
lr[1][sb][ss] = (ro[0][sb][ss] - ro[1][sb][ss]) * 0.707106781f;
}
else
{
lr[0][sb][ss] = ro[0][sb][ss];
lr[1][sb][ss] = ro[1][sb][ss];
}
}
else if (i_stereo)
{
if (lsf)
{
lr[0][sb][ss] = ro[0][sb][ss] * k[0][i];
lr[1][sb][ss] = ro[0][sb][ss] * k[1][i];
}
else
{
lr[1][sb][ss] = ro[0][sb][ss] / (float) (1 + is_ratio[i]);
lr[0][sb][ss] = lr[1][sb][ss] * is_ratio[i];
}
}
/* else {
System.out.println("Error in stereo processing\n");
} */
i++;
}
}
// channels == 2
}