forked from KolibriOS/kolibrios
1634ac97c2
git-svn-id: svn://kolibrios.org@165 a494cfbc-eb01-0410-851d-a64ba20cac60
203 lines
4.6 KiB
C
203 lines
4.6 KiB
C
#include "bstream.h"
|
|
#include "mp3dec.h"
|
|
|
|
extern MPEG_DECODE_OPTION m_option;
|
|
|
|
extern float m_sample[2304];
|
|
extern int m_nsb_limit;
|
|
extern SBT_PROC m_sbt_proc;
|
|
|
|
extern int m_max_sb;
|
|
extern int m_stereo_sb;
|
|
extern int m_bat[4][16];
|
|
extern int m_ballo[64];
|
|
extern unsigned int m_samp_dispatch[66];
|
|
extern float m_c_value[64];
|
|
extern unsigned int m_sf_dispatch[66];
|
|
extern float m_sf_table[64];
|
|
extern float m_cs_factor[3][64];
|
|
|
|
float m_look_c_valueL1[18];
|
|
float *m_cs_factorL1 = m_cs_factor[0];
|
|
int m_nbatL1;
|
|
|
|
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_masterL1[] =
|
|
{
|
|
0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
|
|
};
|
|
|
|
void unpack_baL1();
|
|
void unpack_sfL1();
|
|
void unpack_sampL1();
|
|
|
|
void L1decode_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_baL1(); /* unpack bit allocation */
|
|
unpack_sfL1(); /* unpack scale factor */
|
|
unpack_sampL1(); /* unpack samples */
|
|
|
|
m_sbt_proc(m_sample, pcm, 12);
|
|
}
|
|
|
|
void unpack_baL1()
|
|
{
|
|
int j;
|
|
int nstereo;
|
|
|
|
m_bit_skip = 0;
|
|
nstereo = m_stereo_sb;
|
|
|
|
for (j = 0; j < m_nbatL1; j++)
|
|
{
|
|
bitget_check(4);
|
|
m_ballo[j] = m_samp_dispatch[j] = mac_bitget(4);
|
|
if (j >= m_nsb_limit)
|
|
m_bit_skip += bat_bit_masterL1[m_samp_dispatch[j]];
|
|
m_c_value[j] = m_look_c_valueL1[m_samp_dispatch[j]];
|
|
if (--nstereo < 0)
|
|
{
|
|
m_ballo[j + 1] = m_ballo[j];
|
|
// flag as joint
|
|
m_samp_dispatch[j] += 15;
|
|
// flag for sf
|
|
m_samp_dispatch[j + 1] = m_samp_dispatch[j];
|
|
m_c_value[j + 1] = m_c_value[j];
|
|
j++;
|
|
}
|
|
}
|
|
// terminate with bit skip and end
|
|
m_samp_dispatch[m_nsb_limit] = 31;
|
|
m_samp_dispatch[j] = 30;
|
|
}
|
|
|
|
// unpack scale factor
|
|
// combine dequant and scale factors
|
|
void unpack_sfL1()
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < m_nbatL1; i++)
|
|
{
|
|
if (m_ballo[i])
|
|
{
|
|
bitget_check(6);
|
|
m_cs_factorL1[i] = m_c_value[i] * m_sf_table[mac_bitget(6)];
|
|
}
|
|
}
|
|
}
|
|
|
|
// unpack samples
|
|
#define UNPACKL1_N(n) \
|
|
s[k] = m_cs_factorL1[k]*(bitget(n)-((1 << n-1) -1)); \
|
|
goto dispatch;
|
|
#define UNPACKL1J_N(n) \
|
|
tmp = (bitget(n)-((1 << n-1) -1)); \
|
|
s[k] = m_cs_factorL1[k]*tmp; \
|
|
s[k+1] = m_cs_factorL1[k+1]*tmp; \
|
|
k++; \
|
|
goto dispatch;
|
|
|
|
void unpack_sampL1()
|
|
{
|
|
int j, k;
|
|
float *s;
|
|
long tmp;
|
|
|
|
s = m_sample;
|
|
for (j = 0; j < 12; j++)
|
|
{
|
|
k = -1;
|
|
dispatch:
|
|
switch (m_samp_dispatch[++k])
|
|
{
|
|
case 0:
|
|
s[k] = 0.0F;
|
|
goto dispatch;
|
|
case 1:
|
|
UNPACKL1_N(2) /* 3 levels */
|
|
case 2:
|
|
UNPACKL1_N(3) /* 7 levels */
|
|
case 3:
|
|
UNPACKL1_N(4) /* 15 levels */
|
|
case 4:
|
|
UNPACKL1_N(5) /* 31 levels */
|
|
case 5:
|
|
UNPACKL1_N(6) /* 63 levels */
|
|
case 6:
|
|
UNPACKL1_N(7) /* 127 levels */
|
|
case 7:
|
|
UNPACKL1_N(8) /* 255 levels */
|
|
case 8:
|
|
UNPACKL1_N(9) /* 511 levels */
|
|
case 9:
|
|
UNPACKL1_N(10) /* 1023 levels */
|
|
case 10:
|
|
UNPACKL1_N(11) /* 2047 levels */
|
|
case 11:
|
|
UNPACKL1_N(12) /* 4095 levels */
|
|
case 12:
|
|
UNPACKL1_N(13) /* 8191 levels */
|
|
case 13:
|
|
UNPACKL1_N(14) /* 16383 levels */
|
|
case 14:
|
|
UNPACKL1_N(15) /* 32767 levels */
|
|
/* -- joint ---- */
|
|
case 15 + 0:
|
|
s[k + 1] = s[k] = 0.0F;
|
|
k++; /* skip right chan dispatch */
|
|
goto dispatch;
|
|
/* -- joint ---- */
|
|
case 15 + 1:
|
|
UNPACKL1J_N(2) /* 3 levels */
|
|
case 15 + 2:
|
|
UNPACKL1J_N(3) /* 7 levels */
|
|
case 15 + 3:
|
|
UNPACKL1J_N(4) /* 15 levels */
|
|
case 15 + 4:
|
|
UNPACKL1J_N(5) /* 31 levels */
|
|
case 15 + 5:
|
|
UNPACKL1J_N(6) /* 63 levels */
|
|
case 15 + 6:
|
|
UNPACKL1J_N(7) /* 127 levels */
|
|
case 15 + 7:
|
|
UNPACKL1J_N(8) /* 255 levels */
|
|
case 15 + 8:
|
|
UNPACKL1J_N(9) /* 511 levels */
|
|
case 15 + 9:
|
|
UNPACKL1J_N(10) /* 1023 levels */
|
|
case 15 + 10:
|
|
UNPACKL1J_N(11) /* 2047 levels */
|
|
case 15 + 11:
|
|
UNPACKL1J_N(12) /* 4095 levels */
|
|
case 15 + 12:
|
|
UNPACKL1J_N(13) /* 8191 levels */
|
|
case 15 + 13:
|
|
UNPACKL1J_N(14) /* 16383 levels */
|
|
case 15 + 14:
|
|
UNPACKL1J_N(15) /* 32767 levels */
|
|
|
|
/* -- end of dispatch -- */
|
|
case 31:
|
|
bitget_skip(m_bit_skip);
|
|
case 30:
|
|
s += 64;
|
|
} /* end switch */
|
|
} /* end j loop */
|
|
}
|