📄 layer3.cpp
字号:
}
else {
/*
* decoding with 'long' BandIndex table (block_type != 2)
*/
//MessageBox(NULL, "DEQUANTIZE7", "", MB_OK);
int *pretab = gr_info->preflag ? pretab1 : pretab2;
int i,max = -1;
int cb = 0;
register int *m = map[sfreq][2];
register real v = 0.0;
register int mc = 0;
#if 0
me = mapend[sfreq][2];
#endif
/*
* long hash table values
*/
//MessageBox(NULL, "DEQUANTIZE8", "", MB_OK);
for(i=0;i<3;i++) {
int lp = l[i];
struct newhuff *h = ht+gr_info->table_select[i];
for(;lp;lp--,mc--) {
int x,y;
if(!mc) {
mc = *m++;
v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
cb = *m++;
}
{
register short *val = h->table;
while((y=*val++)<0) {
if (get1bit())
val -= y;
part2remain--;
}
x = y >> 4;
y &= 0xf;
}
if (x == 15) {
max = cb;
part2remain -= h->linbits+1;
x += getbits(h->linbits);
if(get1bit())
*xrpnt++ = -ispow[x] * v;
else
*xrpnt++ = ispow[x] * v;
}
else if(x) {
max = cb;
if(get1bit())
*xrpnt++ = -ispow[x] * v;
else
*xrpnt++ = ispow[x] * v;
part2remain--;
}
else
*xrpnt++ = 0.0;
if (y == 15) {
max = cb;
part2remain -= h->linbits+1;
y += getbits(h->linbits);
if(get1bit())
*xrpnt++ = -ispow[y] * v;
else
*xrpnt++ = ispow[y] * v;
}
else if(y) {
max = cb;
if(get1bit())
*xrpnt++ = -ispow[y] * v;
else
*xrpnt++ = ispow[y] * v;
part2remain--;
}
else
*xrpnt++ = 0.0;
}
}
//MessageBox(NULL, "DEQUANTIZE9", "", MB_OK);
/*
* short (count1table) values
*/
for(;l3 && (part2remain > 0);l3--) {
struct newhuff *h = htc+gr_info->count1table_select;
register short *val = h->table,a;
//MessageBox(NULL, "DEQUANTIZE91", "", MB_OK);
while((a=*val++)<0) {
part2remain--;
if(part2remain < 0) {
part2remain++;
a = 0;
break;
}
if (get1bit())
val -= a;
}
//MessageBox(NULL, "DEQUANTIZE92", "", MB_OK);
for(i=0;i<4;i++) {
if(!(i & 1)) {
if(!mc) {
//MessageBox(NULL, "DEQUANTIZE BEFORE BEFORE", "", MB_OK);
mc = *m++;
cb = *m++;
//MessageBox(NULL, "DEQUANTIZE BEFORE", "", MB_OK);
v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
//MessageBox(NULL, "DEQUANTIZE AFTER", "", MB_OK);
}
mc--;
}
//MessageBox(NULL, "DEQUANTIZE93", "", MB_OK);
if ( (a & (0x8>>i)) ) {
max = cb;
part2remain--;
if(part2remain < 0) {
part2remain++;
break;
}
if(get1bit())
*xrpnt++ = -v;
else
*xrpnt++ = v;
}
else
*xrpnt++ = 0.0;
}
}
//MessageBox(NULL, "DEQUANTIZE10", "", MB_OK);
/*
* zero part
*/
for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) {
*xrpnt++ = 0.0;
*xrpnt++ = 0.0;
}
gr_info->maxbandl = max+1;
gr_info->maxb = longLimit[sfreq][gr_info->maxbandl];
}
while( part2remain > 16 ) {
getbits(16); /* Dismiss stuffing Bits */
part2remain -= 16;
}
///MessageBox(NULL, "DEQUANTIZE11", "", MB_OK);
if(part2remain > 0)
getbits(part2remain);
else if(part2remain < 0) {
return 1;
}
return 0;
}
/*
* III_stereo: calculate real channel values for Joint-I-Stereo-mode
*/
static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,
struct gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf)
{
real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf;
struct bandInfoStruct *bi = &bandInfo[sfreq];
real *tab1,*tab2;
if(lsf) {
int p = gr_info->scalefac_compress & 0x1;
if(ms_stereo) {
tab1 = pow1_2[p]; tab2 = pow2_2[p];
}
else {
tab1 = pow1_1[p]; tab2 = pow2_1[p];
}
}
else {
if(ms_stereo) {
tab1 = tan1_2; tab2 = tan2_2;
}
else {
tab1 = tan1_1; tab2 = tan2_1;
}
}
if (gr_info->block_type == 2)
{
int lwin,do_l = 0;
if( gr_info->mixed_block_flag )
do_l = 1;
for (lwin=0;lwin<3;lwin++) /* process each window */
{
/* get first band with zero values */
int is_p,sb,idx,sfb = gr_info->maxband[lwin]; /* sfb is minimal 3 for mixed mode */
if(sfb > 3)
do_l = 0;
for(;sfb<12;sfb++)
{
is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
if(is_p != 7) {
real t1,t2;
sb = bi->shortDiff[sfb];
idx = bi->shortIdx[sfb] + lwin;
t1 = tab1[is_p]; t2 = tab2[is_p];
for (; sb > 0; sb--,idx+=3)
{
real v = xr[0][idx];
xr[0][idx] = v * t1;
xr[1][idx] = v * t2;
}
}
}
#if 1
/* in the original: copy 10 to 11 , here: copy 11 to 12
maybe still wrong??? (copy 12 to 13?) */
is_p = scalefac[11*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
sb = bi->shortDiff[12];
idx = bi->shortIdx[12] + lwin;
#else
is_p = scalefac[10*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
sb = bi->shortDiff[11];
idx = bi->shortIdx[11] + lwin;
#endif
if(is_p != 7)
{
real t1,t2;
t1 = tab1[is_p]; t2 = tab2[is_p];
for ( ; sb > 0; sb--,idx+=3 )
{
real v = xr[0][idx];
xr[0][idx] = v * t1;
xr[1][idx] = v * t2;
}
}
} /* end for(lwin; .. ; . ) */
if (do_l)
{
/* also check l-part, if ALL bands in the three windows are 'empty'
* and mode = mixed_mode
*/
int sfb = gr_info->maxbandl;
int idx = bi->longIdx[sfb];
for ( ; sfb<8; sfb++ )
{
int sb = bi->longDiff[sfb];
int is_p = scalefac[sfb]; /* scale: 0-15 */
if(is_p != 7) {
real t1,t2;
t1 = tab1[is_p]; t2 = tab2[is_p];
for ( ; sb > 0; sb--,idx++)
{
real v = xr[0][idx];
xr[0][idx] = v * t1;
xr[1][idx] = v * t2;
}
}
else
idx += sb;
}
}
}
else /* ((gr_info->block_type != 2)) */
{
int sfb = gr_info->maxbandl;
int is_p,idx = bi->longIdx[sfb];
for ( ; sfb<21; sfb++)
{
int sb = bi->longDiff[sfb];
is_p = scalefac[sfb]; /* scale: 0-15 */
if(is_p != 7) {
real t1,t2;
t1 = tab1[is_p]; t2 = tab2[is_p];
for ( ; sb > 0; sb--,idx++)
{
real v = xr[0][idx];
xr[0][idx] = v * t1;
xr[1][idx] = v * t2;
}
}
else
idx += sb;
}
is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */
if(is_p != 7)
{
int sb;
real t1 = tab1[is_p],t2 = tab2[is_p];
for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ )
{
real v = xr[0][idx];
xr[0][idx] = v * t1;
xr[1][idx] = v * t2;
}
}
} /* ... */
}
static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_info)
{
int sblim;
if(gr_info->block_type == 2)
{
if(!gr_info->mixed_block_flag)
return;
sblim = 1;
}
else {
sblim = gr_info->maxb-1;
}
/* 31 alias-reduction operations between each pair of sub-bands */
/* with 8 butterflies between each pair */
{
int sb;
real *xr1=(real *) xr[1];
for(sb=sblim;sb;sb--,xr1+=10)
{
int ss;
real *cs=aa_cs,*ca=aa_ca;
real *xr2 = xr1;
for(ss=7;ss>=0;ss--)
{ /* upper and lower butterfly inputs */
register real bu = *--xr2,bd = *xr1;
*xr2 = (bu * (*cs) ) - (bd * (*ca) );
*xr1++ = (bd * (*cs++) ) + (bu * (*ca++) );
}
}
}
}
/*
DCT insipired by Jeff Tsay's DCT from the maplay package
this is an optimized version with manual unroll.
References:
[1] S. Winograd: "On Computing the Discrete Fourier Transform",
Mathematics of Computation, Volume 32, Number 141, January 1978,
Pages 175-199
*/
static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf)
{
{
register real *in = inbuf;
in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14];
in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11];
in[11]+=in[10]; in[10]+=in[9]; in[9] +=in[8];
in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5];
in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2];
in[2] +=in[1]; in[1] +=in[0];
in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1];
{
#define MACRO0(v) { \
real tmp; \
out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \
out2[8-(v)] = tmp * w[26-(v)]; } \
sum0 -= sum1; \
ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \
ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)];
#define MACRO1(v) { \
real sum0,sum1; \
sum0 = tmp1a + tmp2a; \
sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \
MACRO0(v); }
#define MACRO2(v) { \
real sum0,sum1; \
sum0 = tmp2a - tmp1a; \
sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \
MACRO0(v); }
register const real *c = COS9;
register real *out2 = o2;
register real *w = wintab;
register real *out1 = o1;
register real *ts = tsbuf;
real ta33,ta66,tb33,tb66;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -