mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-21 14:22:34 +03:00
213 lines
6.3 KiB
C
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;
|
||
|
}
|