kolibrios-gitea/programs/media/ac97 mp3/trunk/mp3dec/l3init.c
Sergey Semyonov (Serge) 1634ac97c2 ac97_mp3 source code
git-svn-id: svn://kolibrios.org@165 a494cfbc-eb01-0410-851d-a64ba20cac60
2006-10-06 06:20:41 +00:00

213 lines
6.3 KiB
C

#include "layer3.h"
extern MPEG_DECODE_OPTION m_option;
extern SAMPLE m_sample[2][2][576];
extern int m_frequency;
extern SBT_PROC m_sbt_proc;
extern XFORM_PROC m_xform_proc;
extern int m_channels;
extern int m_sfBandIndex[2][22];// [long/short][cb]
extern int m_nBand[2][22];
extern int m_band_limit;
extern int m_band_limit21; // limit for sf band 21
extern int m_band_limit12; // limit for sf band 12 short
extern int m_band_limit_nsb;
extern int m_ncbl_mixed;
extern int m_nsb_limit;
extern int m_gr;
extern int m_buf_ptr0, m_buf_ptr1;
extern float m_yout[576];
//extern "l3sbt.c"
void sbt_mono_L3(float *sample, signed short *pcm, int ch);
void sbt_dual_L3(float *sample, signed short *pcm, int ch);
void sbt16_mono_L3(float *sample, signed short *pcm, int ch);
void sbt16_dual_L3(float *sample, signed short *pcm, int ch);
void sbt8_mono_L3(float *sample, signed short *pcm, int ch);
void sbt8_dual_L3(float *sample, signed short *pcm, int ch);
void sbtB_mono_L3(float *sample, unsigned char *pcm, int ch);
void sbtB_dual_L3(float *sample, unsigned char *pcm, int ch);
void sbtB16_mono_L3(float *sample, unsigned char *pcm, int ch);
void sbtB16_dual_L3(float *sample, unsigned char *pcm, int ch);
void sbtB8_mono_L3(float *sample, unsigned char *pcm, int ch);
void sbtB8_dual_L3(float *sample, unsigned char *pcm, int ch);
//extern "l3dec.c"
void xform_mono(void *pcm, int igr);
void xform_dual(void *pcm, int igr);
void xform_dual_mono(void *pcm, int igr);
void xform_dual_right(void *pcm, int igr);
static const SBT_PROC sbt_table[2][3][2] =
{
sbt_mono_L3,
sbt_dual_L3,
sbt16_mono_L3,
sbt16_dual_L3,
sbt8_mono_L3,
sbt8_dual_L3,
// 8 bit output
sbtB_mono_L3,
sbtB_dual_L3,
sbtB16_mono_L3,
sbtB16_dual_L3,
sbtB8_mono_L3,
sbtB8_dual_L3,
};
static const XFORM_PROC xform_table[5] =
{
xform_mono,
xform_dual,
xform_dual_mono,
xform_mono, /* left */
xform_dual_right,
};
static const struct {
int l[23];
int s[14];
} sfBandTable[3][3] = {
// MPEG-1
{{
{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576},
{0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192}
},{
{0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576},
{0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192}
},{
{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576},
{0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192}
}},
// MPEG-2
{{
{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
{0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192}
},{
{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576},
{0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192}
},{
{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
{0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192}
}},
// MPEG-2.5, 11 & 12 KHz seem ok, 8 ok
{{
{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
{0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192}
},{
{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
{0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192}
},{
// this 8khz table, and only 8khz, from mpeg123)
{0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576},
{0, 8, 16, 24, 36, 52, 72, 96, 124, 160, 162, 164, 166, 192}
}},
};
void quant_init();
void alias_init();
void msis_init();
void fdct_init();
void imdct_init();
void hwin_init();
void L3table_init()
{
quant_init();
alias_init();
msis_init();
fdct_init();
imdct_init();
hwin_init();
}
int L3decode_start(MPEG_HEADER* h)
{
int i, j, k, v;
int channels, limit;
int bit_code;
m_buf_ptr0 = 0;
m_buf_ptr1 = 0;
m_gr = 0;
v = h->version - 1;
if (h->version == 1) //MPEG-1
m_ncbl_mixed = 8;
else //MPEG-2, MPEG-2.5
m_ncbl_mixed = 6;
// compute nsb_limit
m_nsb_limit = (m_option.freqLimit * 64L + m_frequency / 2) / m_frequency;
// caller limit
limit = (32 >> m_option.reduction);
if (limit > 8)
limit--;
if (m_nsb_limit > limit)
m_nsb_limit = limit;
limit = 18 * m_nsb_limit;
if (h->version == 1) {
//MPEG-1
m_band_limit12 = 3 * sfBandTable[v][h->fr_index].s[13];
m_band_limit = m_band_limit21 = sfBandTable[v][h->fr_index].l[22];
}
else {
//MPEG-2, MPEG-2.5
m_band_limit12 = 3 * sfBandTable[v][h->fr_index].s[12];
m_band_limit = m_band_limit21 = sfBandTable[v][h->fr_index].l[21];
}
m_band_limit += 8; // allow for antialias
if (m_band_limit > limit)
m_band_limit = limit;
if (m_band_limit21 > m_band_limit)
m_band_limit21 = m_band_limit;
if (m_band_limit12 > m_band_limit)
m_band_limit12 = m_band_limit;
m_band_limit_nsb = (m_band_limit + 17) / 18; // limit nsb's rounded up
/*
gain_adjust = 0; // adjust gain e.g. cvt to mono sum channel
if ((h->mode != 3) && (m_option.convert == 1))
gain_adjust = -4;
*/
m_channels = (h->mode == 3) ? 1 : 2;
if (m_option.convert) channels = 1;
else channels = m_channels;
bit_code = (m_option.convert & 8) ? 1 : 0;
m_sbt_proc = sbt_table[bit_code][m_option.reduction][channels - 1];//[2][3][2]
k = (h->mode != 3) ? (1 + m_option.convert) : 0;
m_xform_proc = xform_table[k];//[5]
/*
if (bit_code)
zero_level_pcm = 128;// 8 bit output
else
zero_level_pcm = 0;
*/
// init band tables
for (i = 0; i < 22; i ++)
m_sfBandIndex[0][i] = sfBandTable[v][h->fr_index].l[i + 1];
for (i = 0; i < 13; i ++)
m_sfBandIndex[1][i] = 3 * sfBandTable[v][h->fr_index].s[i + 1];
for (i = 0; i < 22; i ++)
m_nBand[0][i] = sfBandTable[v][h->fr_index].l[i + 1]
- sfBandTable[v][h->fr_index].l[i];
for (i = 0; i < 13; i ++)
m_nBand[1][i] = sfBandTable[v][h->fr_index].s[i + 1]
- sfBandTable[v][h->fr_index].s[i];
// clear buffers
for (i = 0; i < 576; i++)
m_yout[i] = 0.0f;
for (i = 0; i < 2; i ++)
{ for (j = 0; j < 2; j ++)
{ for (k = 0; k < 576; k++)
{ m_sample[i][j][k].x = 0.0f;
m_sample[i][j][k].s = 0;
}
}
}
return 1;
}