📄 cupl3.c
字号:
bitget(m, 2); /* skip layer */
prot = bitget(m, 1); /* bitget prot bit */
br_index = bitget(m, 4);
m->cupl.sr_index = bitget(m, 2);
m->cupl.pad = bitget(m, 1);
bitget(m, 1); /* skip to mode */
m->cupl.side_info.mode = bitget(m, 2); /* mode */
m->cupl.side_info.mode_ext = bitget(m, 2); /* mode ext */
if (m->cupl.side_info.mode != 1)
m->cupl.side_info.mode_ext = 0;
/* adjust global gain in ms mode to avoid having to mult by 1/sqrt(2) */
m->cupl.ms_mode = m->cupl.side_info.mode_ext >> 1;
m->cupl.is_mode = m->cupl.side_info.mode_ext & 1;
m->cupl.crcbytes = 0;
if (prot)
bitget(m, 4); /* skip to data */
else
{
bitget(m, 20); /* skip crc */
m->cupl.crcbytes = 2;
}
if (br_index > 0)
{ /* framebytes fixed for free format */
if (m->cupl.mpeg25_flag == 0)
{
m->cupl.framebytes =
1440 * mp_br_tableL3[m->cupl.id][br_index] / mp_sr20_table[m->cupl.id][m->cupl.sr_index];
}
else
{
m->cupl.framebytes =
2880 * mp_br_tableL3[m->cupl.id][br_index] / mp_sr20_table[m->cupl.id][m->cupl.sr_index];
//if( sr_index == 2 ) return 0; // fail mpeg25 8khz
}
}
m->cupl.side_info.main_data_begin = bitget(m, 8);
if (m->cupl.side_info.mode == 3)
{
m->cupl.side_info.private_bits = bitget(m, 1);
m->cupl.nchan = 1;
m->cupl.stereo_flag = 0;
side_bytes = (4 + 9);
/*-- with header --*/
}
else
{
m->cupl.side_info.private_bits = bitget(m, 2);
m->cupl.nchan = 2;
m->cupl.stereo_flag = 1;
side_bytes = (4 + 17);
/*-- with header --*/
}
m->cupl.side_info.scfsi[1] = m->cupl.side_info.scfsi[0] = 0;
for (ch = 0; ch < m->cupl.nchan; ch++)
{
m->cupl.side_info.gr[igr][ch].part2_3_length = bitget(m, 12);
m->cupl.side_info.gr[igr][ch].big_values = bitget(m, 9);
if (m->cupl.side_info.gr[igr][ch].big_values > 288)
return -1; // to catch corrupt sideband data
m->cupl.side_info.gr[igr][ch].global_gain = bitget(m, 8) + m->cupl.gain_adjust;
if (m->cupl.ms_mode)
m->cupl.side_info.gr[igr][ch].global_gain -= 2;
m->cupl.side_info.gr[igr][ch].scalefac_compress = bitget(m, 9);
m->cupl.side_info.gr[igr][ch].window_switching_flag = bitget(m, 1);
if (m->cupl.side_info.gr[igr][ch].window_switching_flag)
{
m->cupl.side_info.gr[igr][ch].block_type = bitget(m, 2);
m->cupl.side_info.gr[igr][ch].mixed_block_flag = bitget(m, 1);
m->cupl.side_info.gr[igr][ch].table_select[0] = bitget(m, 5);
m->cupl.side_info.gr[igr][ch].table_select[1] = bitget(m, 5);
m->cupl.side_info.gr[igr][ch].subblock_gain[0] = bitget(m, 3);
m->cupl.side_info.gr[igr][ch].subblock_gain[1] = bitget(m, 3);
m->cupl.side_info.gr[igr][ch].subblock_gain[2] = bitget(m, 3);
/* region count set in terms of long block cb's/bands */
/* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
/* bt=1 or 3 54 samples */
/* bt=2 mixed=0 36 samples */
/* bt=2 mixed=1 54 (8 long sf) samples? or maybe 36 */
/* region0 discussion says 54 but this would mix long */
/* and short in region0 if scale factors switch */
/* at band 36 (6 long scale factors) */
if ((m->cupl.side_info.gr[igr][ch].block_type == 2))
{
m->cupl.side_info.gr[igr][ch].region0_count = (6 - 1); /* 36 samples */
m->cupl.side_info.gr[igr][ch].region1_count = 20 - (6 - 1);
}
else
{ /* long block type 1 or 3 */
m->cupl.side_info.gr[igr][ch].region0_count = (8 - 1); /* 54 samples */
m->cupl.side_info.gr[igr][ch].region1_count = 20 - (8 - 1);
}
}
else
{
m->cupl.side_info.gr[igr][ch].mixed_block_flag = 0;
m->cupl.side_info.gr[igr][ch].block_type = 0;
m->cupl.side_info.gr[igr][ch].table_select[0] = bitget(m, 5);
m->cupl.side_info.gr[igr][ch].table_select[1] = bitget(m, 5);
m->cupl.side_info.gr[igr][ch].table_select[2] = bitget(m, 5);
m->cupl.side_info.gr[igr][ch].region0_count = bitget(m, 4);
m->cupl.side_info.gr[igr][ch].region1_count = bitget(m, 3);
}
m->cupl.side_info.gr[igr][ch].preflag = 0;
m->cupl.side_info.gr[igr][ch].scalefac_scale = bitget(m, 1);
m->cupl.side_info.gr[igr][ch].count1table_select = bitget(m, 1);
}
/* return bytes in header + side info */
return side_bytes;
}
/*-----------------------------------------------------------------*/
static void unpack_main(MPEG *m, unsigned char *pcm, int igr)
{
int ch;
int bit0;
int n1, n2, n3, n4, nn2, nn3;
int nn4;
int qbits;
int m0;
for (ch = 0; ch < m->cupl.nchan; ch++)
{
bitget_init(m, m->cupl.buf + (m->cupl.main_pos_bit >> 3));
bit0 = (m->cupl.main_pos_bit & 7);
if (bit0)
bitget(m, bit0);
m->cupl.main_pos_bit += m->cupl.side_info.gr[igr][ch].part2_3_length;
bitget_init_end(m, m->cupl.buf + ((m->cupl.main_pos_bit + 39) >> 3));
/*-- scale factors --*/
if (m->cupl.id)
unpack_sf_sub_MPEG1(m, &m->cupl.sf[igr][ch],
&m->cupl.side_info.gr[igr][ch], m->cupl.side_info.scfsi[ch], igr);
else
unpack_sf_sub_MPEG2(m, &m->cupl.sf[igr][ch],
&m->cupl.side_info.gr[igr][ch], m->cupl.is_mode & ch, &m->cupl.is_sf_info);
if (m->eq->enableEQ)
{
m->cupl.side_info.gr[igr][ch].global_gain += m->eq->EQ_gain_adjust;
}
/*--- huff data ---*/
n1 = m->cupl.sfBandIndex[0][m->cupl.side_info.gr[igr][ch].region0_count];
n2 = m->cupl.sfBandIndex[0][m->cupl.side_info.gr[igr][ch].region0_count
+ m->cupl.side_info.gr[igr][ch].region1_count + 1];
n3 = m->cupl.side_info.gr[igr][ch].big_values;
n3 = n3 + n3;
if (n3 > m->cupl.band_limit)
n3 = m->cupl.band_limit;
if (n2 > n3)
n2 = n3;
if (n1 > n3)
n1 = n3;
nn3 = n3 - n2;
nn2 = n2 - n1;
unpack_huff(m, m->cupl.sample[ch][igr], n1,
m->cupl.side_info.gr[igr][ch].table_select[0]);
unpack_huff(m, m->cupl.sample[ch][igr] + n1, nn2,
m->cupl.side_info.gr[igr][ch].table_select[1]);
unpack_huff(m, m->cupl.sample[ch][igr] + n2, nn3,
m->cupl.side_info.gr[igr][ch].table_select[2]);
qbits = m->cupl.side_info.gr[igr][ch].part2_3_length - (bitget_bits_used(m) - bit0);
nn4 = unpack_huff_quad(m, m->cupl.sample[ch][igr] + n3,
m->cupl.band_limit - n3, qbits,
m->cupl.side_info.gr[igr][ch].count1table_select);
n4 = n3 + nn4;
m->cupl.nsamp[igr][ch] = n4;
//limit n4 or allow deqaunt to sf band 22
if (m->cupl.side_info.gr[igr][ch].block_type == 2)
n4 = min(n4, m->cupl.band_limit12);
else
n4 = min(n4, m->cupl.band_limit21);
if (n4 < 576)
memset(m->cupl.sample[ch][igr] + n4, 0, sizeof(SAMPLE) * (576 - n4));
if (m->cupl.bitdat.bs_ptr > m->cupl.bitdat.bs_ptr_end)
{ // bad data overrun
memset(m->cupl.sample[ch][igr], 0, sizeof(SAMPLE) * (576));
}
}
/*--- dequant ---*/
for (ch = 0; ch < m->cupl.nchan; ch++)
{
dequant(m,m->cupl.sample[ch][igr],
&m->cupl.nsamp[igr][ch], /* nsamp updated for shorts */
&m->cupl.sf[igr][ch], &m->cupl.side_info.gr[igr][ch],
&m->cupl.cb_info[igr][ch], m->cupl.ncbl_mixed);
}
/*--- ms stereo processing ---*/
if (m->cupl.ms_mode)
{
if (m->cupl.is_mode == 0)
{
m0 = m->cupl.nsamp[igr][0]; /* process to longer of left/right */
if (m0 < m->cupl.nsamp[igr][1])
m0 = m->cupl.nsamp[igr][1];
}
else
{ /* process to last cb in right */
m0 = m->cupl.sfBandIndex[m->cupl.cb_info[igr][1].cbtype][m->cupl.cb_info[igr][1].cbmax];
}
ms_process(m->cupl.sample[0][igr], m0);
}
/*--- is stereo processing ---*/
if (m->cupl.is_mode)
{
if (m->cupl.id)
is_process_MPEG1(m, m->cupl.sample[0][igr], &m->cupl.sf[igr][1],
m->cupl.cb_info[igr], m->cupl.nsamp[igr][0], m->cupl.ms_mode);
else
is_process_MPEG2(m,m->cupl.sample[0][igr], &m->cupl.sf[igr][1],
m->cupl.cb_info[igr], &m->cupl.is_sf_info,
m->cupl.nsamp[igr][0], m->cupl.ms_mode);
}
/*-- adjust ms and is modes to max of left/right */
if (m->cupl.side_info.mode_ext)
{
if (m->cupl.nsamp[igr][0] < m->cupl.nsamp[igr][1])
m->cupl.nsamp[igr][0] = m->cupl.nsamp[igr][1];
else
m->cupl.nsamp[igr][1] = m->cupl.nsamp[igr][0];
}
/*--- antialias ---*/
for (ch = 0; ch < m->cupl.nchan; ch++)
{
if (m->cupl.cb_info[igr][ch].ncbl == 0)
continue; /* have no long blocks */
if (m->cupl.side_info.gr[igr][ch].mixed_block_flag)
n1 = 1; /* 1 -> 36 samples */
else
n1 = (m->cupl.nsamp[igr][ch] + 7) / 18;
if (n1 > 31)
n1 = 31;
antialias(m, m->cupl.sample[ch][igr], n1);
n1 = 18 * n1 + 8; /* update number of samples */
if (n1 > m->cupl.nsamp[igr][ch])
m->cupl.nsamp[igr][ch] = n1;
}
/*--- hybrid + sbt ---*/
m->cupl.Xform(m, pcm, igr);
/*-- done --*/
}
/*--------------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
IN_OUT L3audio_decode(void *mv, unsigned char *bs, unsigned char *pcm)
{
MPEG *m = mv;
return m->cupl.decode_function((MPEG *)mv, bs, pcm);
}
/*--------------------------------------------------------------------*/
IN_OUT L3audio_decode_MPEG1(void *mv, unsigned char *bs, unsigned char *pcm)
{
MPEG *m = mv;
int sync;
IN_OUT in_out;
int side_bytes;
int nbytes;
m->cupl.iframe++;
bitget_init(m, bs); /* initialize bit getter */
/* test sync */
in_out.in_bytes = 0; /* assume fail */
in_out.out_bytes = 0;
sync = bitget(m, 12);
if (sync != 0xFFF)
return in_out; /* sync fail */
/*-----------*/
/*-- unpack side info --*/
side_bytes = unpack_side_MPEG1(m);
if (side_bytes < 0)
{
in_out.in_bytes = 0;
return in_out;
}
m->cupl.padframebytes = m->cupl.framebytes + m->cupl.pad;
in_out.in_bytes = m->cupl.padframebytes;
/*-- load main data and update buf pointer --*/
/*-------------------------------------------
if start point < 0, must just cycle decoder
if jumping into middle of stream,
w---------------------------------------------*/
m->cupl.buf_ptr0 = m->cupl.buf_ptr1 - m->cupl.side_info.main_data_begin; /* decode start point */
if (m->cupl.buf_ptr1 > BUF_TRIGGER)
{ /* shift buffer */
memmove(m->cupl.buf, m->cupl.buf + m->cupl.buf_ptr0, m->cupl.side_info.main_data_begin);
m->cupl.buf_ptr0 = 0;
m->cupl.buf_ptr1 = m->cupl.side_info.main_data_begin;
}
nbytes = m->cupl.padframebytes - side_bytes - m->cupl.crcbytes;
// RAK: This is no bueno. :-(
if (nbytes < 0 || nbytes > NBUF)
{
in_out.in_bytes = 0;
return in_out;
}
memmove(m->cupl.buf + m->cupl.buf_ptr1, bs + side_bytes + m->cupl.crcbytes, nbytes);
m->cupl.buf_ptr1 += nbytes;
/*-----------------------*/
if (m->cupl.buf_ptr0 >= 0)
{
// dump_frame(buf+buf_ptr0, 64);
m->cupl.main_pos_bit = m->cupl.buf_ptr0 << 3;
unpack_main(m,pcm, 0);
unpack_main(m,pcm + m->cupl.half_outbytes, 1);
in_out.out_bytes = m->cupl.outbytes;
}
else
{
memset(pcm, m->cupl.zero_level_pcm, m->cupl.outbytes); /* fill out skipped frames */
in_out.out_bytes = m->cupl.outbytes;
/* iframe--; in_out.out_bytes = 0; // test test */
}
return in_out;
}
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
IN_OUT L3audio_decode_MPEG2(void *mv, unsigned char *bs, unsigned char *pcm)
{
MPEG *m = mv;
int sync;
IN_OUT in_out;
int side_bytes;
int nbytes;
static int igr = 0;
m->cupl.iframe++;
bitget_init(m, bs); /* initialize bit getter */
/* test sync */
in_out.in_bytes = 0; /* assume fail */
in_out.out_bytes = 0;
sync = bitget(m, 12);
// if( sync != 0xFFF ) return in_out; /* sync fail */
m->cupl.mpeg25_flag = 0;
if (sync != 0xFFF)
{
m->cupl.mpeg25_flag = 1; /* mpeg 2.5 sync */
if (sync != 0xFFE)
return in_out; /* sync fail */
}
/*-----------*/
/*-- unpack side info --*/
side_bytes = unpack_side_MPEG2(m,igr);
if (side_bytes < 0)
{
in_out.in_bytes = 0;
return in_out;
}
m->cupl.padframebytes = m->cupl.framebytes + m->cupl.pad;
in_out.in_bytes = m->cupl.padframebytes;
m->cupl.buf_ptr0 = m->cupl.buf_ptr1 - m->cupl.side_info.main_data_begin; /* decode start point */
if (m->cupl.buf_ptr1 > BUF_TRIGGER)
{ /* shift buffer */
memmove(m->cupl.buf, m->cupl.buf + m->cupl.buf_ptr0, m->cupl.side_info.main_data_begin);
m->cupl.buf_ptr0 = 0;
m->cupl.buf_ptr1 = m->cupl.side_info.main_data_begin;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -