kolibrios-fun/programs/media/ac97snd/trunk/mp3dec/l2dec.c
heavyiron 3eda462807 Kernel: Smoothing image code from Mario79, build scripts for skin and drivers/build.bat
Programs: fasm updated to 1.67.14, small fixes in desktop, stackcfg, calc, board, pipes, freecell, big cleanup of unused programs, added some applications from 0.6.3.0 distr...

git-svn-id: svn://kolibrios.org@205 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-11-02 14:18:23 +00:00

307 lines
10 KiB
C

#include "bstream.h"
#include "mp3dec.h"
extern float m_sample[2304];
extern int m_nsb_limit;
int m_stereo_sb;
int m_max_sb;
SBT_PROC m_sbt_proc;
float m_sf_table[64];
float m_look_c_valueL2[18];
char m_group3_table[32][3];
char m_group5_table[128][3];
short m_group9_table[1024][3];
int m_nbat[4];// = {3, 8, 12, 7};
int m_bat[4][16];
int m_ballo[64];
uint m_samp_dispatch[66];
float m_c_value[64];
uint m_sf_dispatch[66];
float m_cs_factor[3][64];
int m_bit_skip;
static const int look_joint[16] =
{ /* lookup stereo sb's by mode+ext */
64, 64, 64, 64, /* stereo */
2 * 4, 2 * 8, 2 * 12, 2 * 16, /* joint */
64, 64, 64, 64, /* dual */
32, 32, 32, 32, /* mono */
};
static const int bat_bit_masterL2[] =
{
0, 5, 7, 9, 10, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48
};
void unpack_ba();
void unpack_sfs();
void unpack_sf();
void unpack_samp();
void L2decode_frame(MPEG_HEADER* h, byte* mpeg, byte* pcm)
{
int crc_size;
crc_size = (h->error_prot) ? 2 : 0;
bitget_init(mpeg + 4 + crc_size);
m_stereo_sb = look_joint[(h->mode << 2) + h->mode_ext];
unpack_ba(); // unpack bit allocation
unpack_sfs(); // unpack scale factor selectors
unpack_sf(); // unpack scale factor
unpack_samp(); // unpack samples
m_sbt_proc(m_sample, pcm, 36);
}
void unpack_ba()
{
int i, j, k;
int nstereo;
int nbit[4] = {4, 4, 3, 2};
m_bit_skip = 0;
nstereo = m_stereo_sb;
k = 0;
for (i = 0; i < 4; i++) {
for (j = 0; j < m_nbat[i]; j++, k++) {
bitget_check(4);
m_ballo[k] = m_samp_dispatch[k] = m_bat[i][mac_bitget(nbit[i])];
if (k >= m_nsb_limit)
m_bit_skip += bat_bit_masterL2[m_samp_dispatch[k]];
m_c_value[k] = m_look_c_valueL2[m_samp_dispatch[k]];
if (--nstereo < 0) {
m_ballo[k + 1] = m_ballo[k];
m_samp_dispatch[k] += 18; /* flag as joint */
m_samp_dispatch[k + 1] = m_samp_dispatch[k]; /* flag for sf */
m_c_value[k + 1] = m_c_value[k];
k++;
j++;
}
}
}
m_samp_dispatch[m_nsb_limit] = 37; /* terminate the dispatcher with skip */
m_samp_dispatch[k] = 36; /* terminate the dispatcher */
}
void unpack_sfs() /* unpack scale factor selectors */
{
int i;
for (i = 0; i < m_max_sb; i++) {
bitget_check(2);
if (m_ballo[i])
m_sf_dispatch[i] = mac_bitget(2);
else
m_sf_dispatch[i] = 4; /* no allo */
}
m_sf_dispatch[i] = 5; /* terminate dispatcher */
}
void unpack_sf() /* unpack scale factor */
{ /* combine dequant and scale factors */
int i;
i = -1;
dispatch:switch (m_sf_dispatch[++i])
{
case 0: /* 3 factors 012 */
bitget_check(18);
m_cs_factor[0][i] = m_c_value[i] * m_sf_table[mac_bitget(6)];
m_cs_factor[1][i] = m_c_value[i] * m_sf_table[mac_bitget(6)];
m_cs_factor[2][i] = m_c_value[i] * m_sf_table[mac_bitget(6)];
goto dispatch;
case 1: /* 2 factors 002 */
bitget_check(12);
m_cs_factor[1][i] = m_cs_factor[0][i] = m_c_value[i] * m_sf_table[mac_bitget(6)];
m_cs_factor[2][i] = m_c_value[i] * m_sf_table[mac_bitget(6)];
goto dispatch;
case 2: /* 1 factor 000 */
bitget_check(6);
m_cs_factor[2][i] = m_cs_factor[1][i] = m_cs_factor[0][i] =
m_c_value[i] * m_sf_table[mac_bitget(6)];
goto dispatch;
case 3: /* 2 factors 022 */
bitget_check(12);
m_cs_factor[0][i] = m_c_value[i] * m_sf_table[mac_bitget(6)];
m_cs_factor[2][i] = m_cs_factor[1][i] = m_c_value[i] * m_sf_table[mac_bitget(6)];
goto dispatch;
case 4: /* no allo */
/*-- m_cs_factor[2][i] = m_cs_factor[1][i] = m_cs_factor[0][i] = 0.0; --*/
goto dispatch;
case 5: /* all done */
;
} /* end switch */
}
/*-------------------------------------------------------------------------*/
#define UNPACK_N(n) s[k] = m_cs_factor[i][k]*(bitget(n)-((1 << n-1) -1)); \
s[k+64] = m_cs_factor[i][k]*(bitget(n)-((1 << n-1) -1)); \
s[k+128] = m_cs_factor[i][k]*(bitget(n)-((1 << n-1) -1)); \
goto dispatch;
#define UNPACK_N2(n) bitget_check(3*n); \
s[k] = m_cs_factor[i][k]*(mac_bitget(n)-((1 << n-1) -1)); \
s[k+64] = m_cs_factor[i][k]*(mac_bitget(n)-((1 << n-1) -1)); \
s[k+128] = m_cs_factor[i][k]*(mac_bitget(n)-((1 << n-1) -1)); \
goto dispatch;
#define UNPACK_N3(n) bitget_check(2*n); \
s[k] = m_cs_factor[i][k]*(mac_bitget(n)-((1 << n-1) -1)); \
s[k+64] = m_cs_factor[i][k]*(mac_bitget(n)-((1 << n-1) -1)); \
bitget_check(n); \
s[k+128] = m_cs_factor[i][k]*(mac_bitget(n)-((1 << n-1) -1)); \
goto dispatch;
#define UNPACKJ_N(n) tmp = (bitget(n)-((1 << n-1) -1)); \
s[k] = m_cs_factor[i][k]*tmp; \
s[k+1] = m_cs_factor[i][k+1]*tmp; \
tmp = (bitget(n)-((1 << n-1) -1)); \
s[k+64] = m_cs_factor[i][k]*tmp; \
s[k+64+1] = m_cs_factor[i][k+1]*tmp; \
tmp = (bitget(n)-((1 << n-1) -1)); \
s[k+128] = m_cs_factor[i][k]*tmp; \
s[k+128+1] = m_cs_factor[i][k+1]*tmp; \
k++; /* skip right chan dispatch */ \
goto dispatch;
/*-------------------------------------------------------------------------*/
void unpack_samp() /* unpack samples */
{
int i, j, k;
float *s;
int n;
long tmp;
s = m_sample;
for (i = 0; i < 3; i++)
{ /* 3 groups of scale factors */
for (j = 0; j < 4; j++)
{
k = -1;
dispatch:switch (m_samp_dispatch[++k])
{
case 0:
s[k + 128] = s[k + 64] = s[k] = 0.0F;
goto dispatch;
case 1: /* 3 levels grouped 5 bits */
bitget_check(5);
n = mac_bitget(5);
s[k] = m_cs_factor[i][k] * m_group3_table[n][0];
s[k + 64] = m_cs_factor[i][k] * m_group3_table[n][1];
s[k + 128] = m_cs_factor[i][k] * m_group3_table[n][2];
goto dispatch;
case 2: /* 5 levels grouped 7 bits */
bitget_check(7);
n = mac_bitget(7);
s[k] = m_cs_factor[i][k] * m_group5_table[n][0];
s[k + 64] = m_cs_factor[i][k] * m_group5_table[n][1];
s[k + 128] = m_cs_factor[i][k] * m_group5_table[n][2];
goto dispatch;
case 3:
UNPACK_N2(3) /* 7 levels */
case 4: /* 9 levels grouped 10 bits */
bitget_check(10);
n = mac_bitget(10);
s[k] = m_cs_factor[i][k] * m_group9_table[n][0];
s[k + 64] = m_cs_factor[i][k] * m_group9_table[n][1];
s[k + 128] = m_cs_factor[i][k] * m_group9_table[n][2];
goto dispatch;
case 5:
UNPACK_N2(4) /* 15 levels */
case 6:
UNPACK_N2(5) /* 31 levels */
case 7:
UNPACK_N2(6) /* 63 levels */
case 8:
UNPACK_N2(7) /* 127 levels */
case 9:
UNPACK_N2(8) /* 255 levels */
case 10:
UNPACK_N3(9) /* 511 levels */
case 11:
UNPACK_N3(10) /* 1023 levels */
case 12:
UNPACK_N3(11) /* 2047 levels */
case 13:
UNPACK_N3(12) /* 4095 levels */
case 14:
UNPACK_N(13) /* 8191 levels */
case 15:
UNPACK_N(14) /* 16383 levels */
case 16:
UNPACK_N(15) /* 32767 levels */
case 17:
UNPACK_N(16) /* 65535 levels */
/* -- joint ---- */
case 18 + 0:
s[k + 128 + 1] = s[k + 128] = s[k + 64 + 1] = s[k + 64] = s[k + 1] = s[k] = 0.0F;
k++; /* skip right chan dispatch */
goto dispatch;
case 18 + 1: /* 3 levels grouped 5 bits */
n = bitget(5);
s[k] = m_cs_factor[i][k] * m_group3_table[n][0];
s[k + 1] = m_cs_factor[i][k + 1] * m_group3_table[n][0];
s[k + 64] = m_cs_factor[i][k] * m_group3_table[n][1];
s[k + 64 + 1] = m_cs_factor[i][k + 1] * m_group3_table[n][1];
s[k + 128] = m_cs_factor[i][k] * m_group3_table[n][2];
s[k + 128 + 1] = m_cs_factor[i][k + 1] * m_group3_table[n][2];
k++; /* skip right chan dispatch */
goto dispatch;
case 18 + 2: /* 5 levels grouped 7 bits */
n = bitget(7);
s[k] = m_cs_factor[i][k] * m_group5_table[n][0];
s[k + 1] = m_cs_factor[i][k + 1] * m_group5_table[n][0];
s[k + 64] = m_cs_factor[i][k] * m_group5_table[n][1];
s[k + 64 + 1] = m_cs_factor[i][k + 1] * m_group5_table[n][1];
s[k + 128] = m_cs_factor[i][k] * m_group5_table[n][2];
s[k + 128 + 1] = m_cs_factor[i][k + 1] * m_group5_table[n][2];
k++; /* skip right chan dispatch */
goto dispatch;
case 18 + 3:
UNPACKJ_N(3) /* 7 levels */
case 18 + 4: /* 9 levels grouped 10 bits */
n = bitget(10);
s[k] = m_cs_factor[i][k] * m_group9_table[n][0];
s[k + 1] = m_cs_factor[i][k + 1] * m_group9_table[n][0];
s[k + 64] = m_cs_factor[i][k] * m_group9_table[n][1];
s[k + 64 + 1] = m_cs_factor[i][k + 1] * m_group9_table[n][1];
s[k + 128] = m_cs_factor[i][k] * m_group9_table[n][2];
s[k + 128 + 1] = m_cs_factor[i][k + 1] * m_group9_table[n][2];
k++; /* skip right chan dispatch */
goto dispatch;
case 18 + 5:
UNPACKJ_N(4) /* 15 levels */
case 18 + 6:
UNPACKJ_N(5) /* 31 levels */
case 18 + 7:
UNPACKJ_N(6) /* 63 levels */
case 18 + 8:
UNPACKJ_N(7) /* 127 levels */
case 18 + 9:
UNPACKJ_N(8) /* 255 levels */
case 18 + 10:
UNPACKJ_N(9) /* 511 levels */
case 18 + 11:
UNPACKJ_N(10) /* 1023 levels */
case 18 + 12:
UNPACKJ_N(11) /* 2047 levels */
case 18 + 13:
UNPACKJ_N(12) /* 4095 levels */
case 18 + 14:
UNPACKJ_N(13) /* 8191 levels */
case 18 + 15:
UNPACKJ_N(14) /* 16383 levels */
case 18 + 16:
UNPACKJ_N(15) /* 32767 levels */
case 18 + 17:
UNPACKJ_N(16) /* 65535 levels */
/* -- end of dispatch -- */
case 37:
bitget_skip(m_bit_skip);
case 36:
s += 3 * 64;
} /* end switch */
} /* end j loop */
} /* end i loop */
}