📄 decode.c
字号:
bit_alloc[j][i] = getbits (bs, 4);
for (i=jsbound; i<SBLIMIT; i++)
{
b = getbits (bs, 4);
for (j=0; j<stereo; j++)
bit_alloc[j][i] = b;
}
if (bits_log)
{
for (j= 0; j < stereo; j++)
for (i = 0; i < SBLIMIT; i++)
{
int alloc_bits = 0, alloc_id = bit_alloc[j][i];
if ((j == 0 || i < jsbound) && bit_alloc[j][i] > 0)
alloc_bits = 12 * (alloc_id + 1);
printf ("alloc_bi[ %d ][ %2d ]= %3d\n", j, i, alloc_bits);
}
}
}
void II_decode_bitalloc (Bit_stream *bs,
frame_params *fr_ps,
unsigned int bit_alloc[7][SBLIMIT],
int bits_log)
{
int i,j,c,sbgr;
int stereo = fr_ps->stereo;
int sblimit = fr_ps->sblimit;
int jsbound = fr_ps->jsbound;
al_table *alloc = fr_ps->alloc;
unsigned int actual_alloc[7][SBLIMIT];
for (i = 0; i < SBLIMIT; i++)
for (j = 0; j < stereo; j++)
actual_alloc[j][i] = 0;
for (i=0; i<jsbound; i++)
for (j=0;j<stereo;j++)
actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
for (i=jsbound; i<sblimit; i++) /* expand to 2 channels */
actual_alloc[0][i] = bit_alloc[0][i] = bit_alloc[1][i] = (char) getbits (bs, (*alloc)[i][0].bits);
for (i=sblimit; i<SBLIMIT; i++)
for (j=0; j<stereo; j++)
bit_alloc[j][i] = 0;
if (bits_log)
{
for (j= 0; j < stereo; j++)
for (i = 0; i < SBLIMIT; i++)
{
int alloc_bits = 0, alloc_id = bit_alloc[j][i];
if (actual_alloc[j][i] > 0)
alloc_bits = 12 * (*alloc)[i][alloc_id].bits * (*alloc)[i][alloc_id].group;
printf ("alloc_bi[ %d ][ %2d ]= %3d\n", j, i, alloc_bits);
}
}
}
void II_decode_bitalloc_mc (Bit_stream *bs,
frame_params *fr_ps,
unsigned int bit_alloc[7][SBLIMIT],
int *l, int *m, int bits_log)
{
layer *info = fr_ps->header;
int i,j,c,sbgr;
int sblimit = fr_ps->sblimit_mc;
al_table *alloc = fr_ps->alloc_mc;
unsigned int actual_alloc[7][SBLIMIT];
for (i = 0; i < SBLIMIT; i++)
for (j = *l; j < *m; j++)
actual_alloc[j][i] = 0;
/* 10/31/95 Ralf Schwalbe LFE */
if (info->lfe)
info->lfe_alloc = (char) getbits (bs, (*alloc)[0][0].bits);
for (i=0; i<sblimit; i++)
if (info->dyn_cross_on == 0)
for (j=*l;j<*m;j++)
{
if ((fr_ps->header->center != 3) || (i < 12) || (j !=2))
actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
else
bit_alloc[j][i] = 0;
}
else /* dyn. cross mode */
{
if (i == 0) sbgr = 0;
else
for (c = 1; c < 12; c++)
{
if ((sb_groups[c-1] < i) && (i <= sb_groups[c]))
{
sbgr = c; /* search the valid subband group */
break;
}
}
/* 960816 FdB new setup for dyn. crosstalk modes */
if (info->dyn_cross_mode[sbgr] == 0)
{
for (j = *l; j < *m; j++)
if (fr_ps->header->center == 3 && i >= 12 && j == 2)
bit_alloc[j][i] = 0;
else if (info->surround == 3 && info->dyn_second_stereo[sbgr] == 1)
{
if (info->center != 0 && j == 4)
bit_alloc[j][i] = bit_alloc[3][i];
else if (info->center == 0 && j == 3)
bit_alloc[j][i] = bit_alloc[2][i];
else
actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
}
else
actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
}
else if (fr_ps->dyn_cross_bits == 1) /* for channel mode 3/0 and 2/1 */
{
/* DynX mode has to be 1 */
if ((info->center == 3) && (i >= 12)) /* 3/0 + phantom center */
bit_alloc[2][i] = 0;
else if (info->tc_alloc[sbgr] == 1)
bit_alloc[2][i] = bit_alloc[0][i];
else if (info->tc_alloc[sbgr] == 2)
bit_alloc[2][i] = bit_alloc[1][i];
else
if (info->dyn_cross_LR)
bit_alloc[2][i] = bit_alloc[1][i];
else
bit_alloc[2][i] = bit_alloc[0][i];
if (info->surround == 3) /* 3/0 + 2/0 */
{
actual_alloc[3][i] = bit_alloc[3][i] = (char) getbits (bs, (*alloc)[i][0].bits);
if (info->dyn_second_stereo[sbgr] == 1)
bit_alloc[4][i] = bit_alloc[3][i];
else
actual_alloc[4][i] = bit_alloc[4][i] = (char) getbits (bs, (*alloc)[i][0].bits);
}
}
else if (fr_ps->dyn_cross_bits == 3) /* for channel mode 3/1 and 2/2 */
{
if ((info->center == 3) && (i >= 12)) /* 3/1 + phantom center */
bit_alloc[2][i] = 0;
else if ((info->dyn_cross_mode[sbgr] == 1) || (info->dyn_cross_mode[sbgr] == 4))
actual_alloc[2][i] = bit_alloc[2][i] = (char) getbits (bs, (*alloc)[i][0].bits);
else
{
/* T2 not transmitted */
if (fr_ps->header->surround == 2 || /* 2/2 mode */
fr_ps->header->tc_alloc[sbgr] == 1 || /* 3/1 mode */
fr_ps->header->tc_alloc[sbgr] == 5 || /* 3/1 mode (matrix mode 2 only) */
fr_ps->header->tc_alloc[sbgr] != 2 && !fr_ps->header->dyn_cross_LR)
bit_alloc[2][i] = bit_alloc[0][i]; /* C, L or Ls from L0 */
else
bit_alloc[2][i] = bit_alloc[1][i]; /* C, R or Rs from RO */
}
if (info->dyn_cross_mode[sbgr] == 2)
actual_alloc[3][i] = bit_alloc[3][i] = (char) getbits (bs, (*alloc)[i][0].bits);
else if (info->dyn_cross_mode[sbgr] == 4)
bit_alloc[3][i] = bit_alloc[2][i];
else
{
/* T3 not transmitted */
if (fr_ps->header->surround == 2 || /* 2/2 mode */
fr_ps->header->tc_alloc[sbgr] == 4 || /* 3/1 mode */
fr_ps->header->tc_alloc[sbgr] == 5 || /* 3/1 mode (matrix mode 2 only) */
fr_ps->header->tc_alloc[sbgr] < 3 && fr_ps->header->dyn_cross_LR)
bit_alloc[3][i] = bit_alloc[1][i]; /* S, R or Rs from R0 */
else
bit_alloc[3][i] = bit_alloc[0][i]; /* S, L or Ls from LO */
}
}
else if (fr_ps->dyn_cross_bits == 4) /* for channel mode 3/2 */
{
/* T2 */
if ((info->center == 3) && (i >= 12)) /* 3/2 + phantom center */
bit_alloc[2][i] = 0;
else switch (info->dyn_cross_mode[sbgr])
{
case 1 : /* T2 contains bitalloc info */
case 2 :
case 4 :
case 8 :
case 9 :
case 10:
case 11:
case 12:
case 14:
actual_alloc[2][i] = bit_alloc[2][i] = (char) getbits (bs, (*alloc)[i][0].bits);
break;
case 3 : /* T2 contains no bitalloc info */
case 5 :
case 6 :
case 7 :
case 13:
if ((info->tc_alloc[sbgr] == 1) || (info->tc_alloc[sbgr] == 7))
bit_alloc[2][i] = bit_alloc[0][i];
else if ((info->tc_alloc[sbgr] == 2) || (info->tc_alloc[sbgr] == 6))
bit_alloc[2][i] = bit_alloc[1][i];
else
if (info->dyn_cross_LR)
bit_alloc[2][i] = bit_alloc[1][i];
else
bit_alloc[2][i] = bit_alloc[0][i];
break;
}
/* T3 */
switch (info->dyn_cross_mode[sbgr])
{
case 1 : /* T3 contains bitalloc info */
case 3 :
case 5 :
case 8 :
case 10:
case 13:
actual_alloc[3][i] = bit_alloc[3][i] = (char) getbits (bs, (*alloc)[i][0].bits);
break;
case 2 : /* T3 has to copy its bitalloc from T0 */
case 4 :
case 6 :
case 7 :
case 12:
bit_alloc[3][i] = bit_alloc[0][i];
break;
case 9 : /* T3 has to copy its bitalloc from T2 */
case 11:
case 14:
bit_alloc[3][i] = bit_alloc[2][i];
break;
}
/* T4 */
switch (info->dyn_cross_mode[sbgr])
{
case 2 : /* T4 contains bitalloc info */
case 3 :
case 6 :
case 9 :
actual_alloc[4][i] = bit_alloc[4][i] = (char) getbits (bs, (*alloc)[i][0].bits);
break;
case 1 : /* T4 has to copy its bitalloc from T1 */
case 4 :
case 5 :
case 7 :
case 11:
bit_alloc[4][i] = bit_alloc[1][i];
break;
case 10: /* T4 has to copy its bitalloc from T2 */
case 12:
case 14:
bit_alloc[4][i] = bit_alloc[2][i];
break;
case 8 : /* T4 has to copy its bitalloc from T3 */
case 13:
bit_alloc[4][i] = bit_alloc[3][i];
break;
}
}
}
for (i=sblimit; i<SBLIMIT; i++)
for (j=*l; j<*m; j++)
bit_alloc[j][i] = 0;
if (bits_log)
{
for (j= *l; j < *m; j++)
for (i = 0; i < SBLIMIT; i++)
{
int alloc_bits = 0, alloc_id = bit_alloc[j][i];
if (actual_alloc[j][i] > 0)
alloc_bits = 12 * (*alloc)[i][alloc_id].bits * (*alloc)[i][alloc_id].group;
printf ("alloc_bi[ %d ][ %2d ]= %3d\n", j, i, alloc_bits);
}
}
}
#ifdef Augmentation_7ch
void II_decode_bitalloc_aug (Bit_stream *bs,
frame_params *fr_ps,
unsigned int bit_alloc[7][SBLIMIT],
int *l, int *m, int bits_log)
{
layer *info = fr_ps->header;
int i,j,c,sbgr;
/* int stereo = fr_ps->stereo; */ /* not used for mc - decoding */
int sblimit = fr_ps->sblimit_mc;
al_table *alloc = fr_ps->alloc_mc;
unsigned int actual_alloc[7][SBLIMIT];
for (i = 0; i < SBLIMIT; i++)
for (j = *l; j < *m; j++)
actual_alloc[j][i] = 0;
for (i=0; i<sblimit; i++)
if (info->aug_dyn_cross_on == 0)
for (j=*l;j<*m;j++)
actual_alloc[j][i] = bit_alloc[j][i] = (char) getbits (bs, (*alloc)[i][0].bits);
else /* dyn. cross mode */
{
int T5T0 = 0, T6T0 = 0, T6T1 = 1;
if(i == 0) sbgr = 0;
else
for(c = 1; c < 12; c++)
{
if((sb_groups[c-1] < i) && (i <= sb_groups[c]))
{
sbgr = c; /* search the valid subband group */
break;
}
}
if (info->tc_aug_alloc[sbgr] == 4 || info->tc_aug_alloc[sbgr] == 5)
if (info->dyn_cross_LR == 0)
T6T1 = 0;
else
T6T0 = 1;
else if (info->tc_aug_alloc[sbgr] == 6 || info->tc_aug_alloc[sbgr] == 7)
if (info->dyn_cross_LR)
T5T0 = 1;
/* read bitalloc info from bitstream */
switch (info->dyn_cross_aug_mode[sbgr])
{
case 0: /* T5 and T6 contains bitalloc info */
actual_alloc[5][i] = bit_alloc[5][i] = (char) getbits (bs, (*alloc)[i][0].bits);
actual_alloc[6][i] = bit_alloc[6][i] = (char) getbits (bs, (*alloc)[i][0].bits);
break;
case 1: /* T5 contains bitalloc info */
case 2:
case 3:
case 4:
actual_alloc[5][i] = bit_alloc[5][i] = (char) getbits (bs, (*alloc)[i][0].bits);
break;
case 5: /* T6 contains bitalloc info */
case 10:
case 14:
actual_alloc[6][i] = bit_alloc[6][i] = (char) getbits (bs, (*alloc)[i][0].bits);
break;
}
/* copy bitalloc info from other channels */
switch (info->dyn_cross_aug_mode[sbgr])
{
case 1: /* copy T6 from T1 */
bit_alloc[6][i] = bit_alloc[T6T1][i];
break;
case 2: /* copy T6 from T2 */
bit_alloc[6][i] = bit_alloc[2][i];
break;
case 3: /* copy T6 from T4 */
bit_alloc[6][i] = bit_alloc[4][i];
break;
case 4: /* copy T6 from T5 */
bit_alloc[6][i] = bit_alloc[5][i];
break;
case 5: /* copy T5 from T0 */
bit_alloc[5][i] = bit_alloc[T5T0][i];
break;
case 6: /* copy T5 from T0 and T6 from T1 */
bit_alloc[5][i] = bit_alloc[T5T0][i];
bit_alloc[6][i] = bit_alloc[T6T1][i];
break;
case 7: /* copy T5 from T0 and T6 from T2 */
bit_alloc[5][i] = bit_alloc[T5T0][i];
bit_alloc[6][i] = bit_alloc[2][i];
break;
case 8: /* copy T5 from T0 and T6 from T4 */
bit_alloc[5][i] = bit_alloc[T5T0][i];
bit_alloc[6][i] = bit_alloc[4][i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -