mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-18 04:43:06 +03:00
3eda462807
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
307 lines
10 KiB
C
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 */
|
|
}
|