📄 libmp3dec.c
字号:
for(i=0;i<6;i++) {
out[i] = 0;
out[6 + i] = 0;
out[30+i] = 0;
}
/* select frequency inversion */
win = mdct_win[2] + ((4 * 36) & -(j & 1));
buf2 = out + 6;
for(k=0;k<3;k++) {
/* reorder input for short mdct */
ptr1 = ptr + k;
for(i=0;i<6;i++) {
in[i] = *ptr1;
ptr1 += 3;
}
imdct12(out2, in);
/* apply 12 point window and do small overlap */
for(i=0;i<6;i++) {
buf2[i] = MULL(out2[i], win[i]) + buf2[i];
buf2[i + 6] = MULL(out2[i + 6], win[i + 6]);
}
buf2 += 6;
}
/* overlap */
out_ptr = sb_samples + j;
for(i=0;i<18;i++) {
*out_ptr = out[i] + buf[i];
buf[i] = out[i + 18];
out_ptr += SBLIMIT;
}
ptr += 18;
buf += 18;
}
/* zero bands */
for(j=sblimit;j<SBLIMIT;j++) {
/* overlap */
out_ptr = sb_samples + j;
for(i=0;i<18;i++) {
*out_ptr = buf[i];
buf[i] = 0;
out_ptr += SBLIMIT;
}
buf += 18;
}
}
/* main layer3 decoding function */
static int mp_decode_layer3(MPADecodeContext *s)
{
int nb_granules, main_data_begin, private_bits;
int gr, ch, blocksplit_flag, i, j, k, n, bits_pos, bits_left;
GranuleDef granules[2][2], *g;
int16_t exponents[576];
/* read side info */
if (s->lsf) {
main_data_begin = get_bits(&s->gb, 8);
if (s->nb_channels == 2)
private_bits = get_bits(&s->gb, 2);
else
private_bits = get_bits(&s->gb, 1);
nb_granules = 1;
} else {
main_data_begin = get_bits(&s->gb, 9);
if (s->nb_channels == 2)
private_bits = get_bits(&s->gb, 3);
else
private_bits = get_bits(&s->gb, 5);
nb_granules = 2;
for(ch=0;ch<s->nb_channels;ch++) {
granules[ch][0].scfsi = 0; /* all scale factors are transmitted */
granules[ch][1].scfsi = get_bits(&s->gb, 4);
}
}
for(gr=0;gr<nb_granules;gr++) {
for(ch=0;ch<s->nb_channels;ch++) {
g = &granules[ch][gr];
g->part2_3_length = get_bits(&s->gb, 12);
g->big_values = get_bits(&s->gb, 9);
g->global_gain = get_bits(&s->gb, 8);
/* if MS stereo only is selected, we precompute the
1/sqrt(2) renormalization factor */
if ((s->mode_ext & (MODE_EXT_MS_STEREO | MODE_EXT_I_STEREO)) ==
MODE_EXT_MS_STEREO)
g->global_gain -= 2;
if (s->lsf)
g->scalefac_compress = get_bits(&s->gb, 9);
else
g->scalefac_compress = get_bits(&s->gb, 4);
blocksplit_flag = get_bits(&s->gb, 1);
if (blocksplit_flag) {
g->block_type = get_bits(&s->gb, 2);
if (g->block_type == 0)
return -1;
g->switch_point = get_bits(&s->gb, 1);
for(i=0;i<2;i++)
g->table_select[i] = get_bits(&s->gb, 5);
for(i=0;i<3;i++)
g->subblock_gain[i] = get_bits(&s->gb, 3);
/* compute huffman coded region sizes */
if (g->block_type == 2)
g->region_size[0] = (36 / 2);
else {
if (s->sample_rate_index <= 2)
g->region_size[0] = (36 / 2);
else if (s->sample_rate_index != 8)
g->region_size[0] = (54 / 2);
else
g->region_size[0] = (108 / 2);
}
g->region_size[1] = (576 / 2);
} else {
int region_address1, region_address2, l;
g->block_type = 0;
g->switch_point = 0;
for(i=0;i<3;i++)
g->table_select[i] = get_bits(&s->gb, 5);
/* compute huffman coded region sizes */
region_address1 = get_bits(&s->gb, 4);
region_address2 = get_bits(&s->gb, 3);
g->region_size[0] =
band_index_long[s->sample_rate_index][region_address1 + 1] >> 1;
l = region_address1 + region_address2 + 2;
/* should not overflow */
if (l > 22)
l = 22;
g->region_size[1] =
band_index_long[s->sample_rate_index][l] >> 1;
}
/* convert region offsets to region sizes and truncate
size to big_values */
g->region_size[2] = (576 / 2);
j = 0;
for(i=0;i<3;i++) {
k = g->region_size[i];
if (k > g->big_values)
k = g->big_values;
g->region_size[i] = k - j;
j = k;
}
/* compute band indexes */
if (g->block_type == 2) {
if (g->switch_point) {
/* if switched mode, we handle the 36 first samples as
long blocks. For 8000Hz, we handle the 48 first
exponents as long blocks (XXX: check this!) */
if (s->sample_rate_index <= 2)
g->long_end = 8;
else if (s->sample_rate_index != 8)
g->long_end = 6;
else
g->long_end = 4; /* 8000 Hz */
if (s->sample_rate_index != 8)
g->short_start = 3;
else
g->short_start = 2;
} else {
g->long_end = 0;
g->short_start = 0;
}
} else {
g->short_start = 13;
g->long_end = 22;
}
g->preflag = 0;
if (!s->lsf)
g->preflag = get_bits(&s->gb, 1);
g->scalefac_scale = get_bits(&s->gb, 1);
g->count1table_select = get_bits(&s->gb, 1);
}
}
/* now we get bits from the main_data_begin offset */
seek_to_maindata(s, main_data_begin);
for(gr=0;gr<nb_granules;gr++) {
for(ch=0;ch<s->nb_channels;ch++) {
g = &granules[ch][gr];
bits_pos = get_bits_count(&s->gb);
if (!s->lsf) {
uint8_t *sc;
int slen, slen1, slen2;
/* MPEG1 scale factors */
slen1 = slen_table[0][g->scalefac_compress];
slen2 = slen_table[1][g->scalefac_compress];
if (g->block_type == 2) {
n = g->switch_point ? 17 : 18;
j = 0;
for(i=0;i<n;i++)
g->scale_factors[j++] = get_bitsz(&s->gb, slen1);
for(i=0;i<18;i++)
g->scale_factors[j++] = get_bitsz(&s->gb, slen2);
for(i=0;i<3;i++)
g->scale_factors[j++] = 0;
} else {
sc = granules[ch][0].scale_factors;
j = 0;
for(k=0;k<4;k++) {
n = (k == 0 ? 6 : 5);
if ((g->scfsi & (0x8 >> k)) == 0) {
slen = (k < 2) ? slen1 : slen2;
for(i=0;i<n;i++)
g->scale_factors[j++] = get_bitsz(&s->gb, slen);
} else {
/* simply copy from last granule */
for(i=0;i<n;i++) {
g->scale_factors[j] = sc[j];
j++;
}
}
}
g->scale_factors[j++] = 0;
}
} else {
int tindex, tindex2, slen[4], sl, sf;
/* LSF scale factors */
if (g->block_type == 2) {
tindex = g->switch_point ? 2 : 1;
} else {
tindex = 0;
}
sf = g->scalefac_compress;
if ((s->mode_ext & MODE_EXT_I_STEREO) && ch == 1) {
/* intensity stereo case */
sf >>= 1;
if (sf < 180) {
lsf_sf_expand(slen, sf, 6, 6, 0);
tindex2 = 3;
} else if (sf < 244) {
lsf_sf_expand(slen, sf - 180, 4, 4, 0);
tindex2 = 4;
} else {
lsf_sf_expand(slen, sf - 244, 3, 0, 0);
tindex2 = 5;
}
} else {
/* normal case */
if (sf < 400) {
lsf_sf_expand(slen, sf, 5, 4, 4);
tindex2 = 0;
} else if (sf < 500) {
lsf_sf_expand(slen, sf - 400, 5, 4, 0);
tindex2 = 1;
} else {
lsf_sf_expand(slen, sf - 500, 3, 0, 0);
tindex2 = 2;
g->preflag = 1;
}
}
j = 0;
for(k=0;k<4;k++) {
n = lsf_nsf_table[tindex2][tindex][k];
sl = slen[k];
for(i=0;i<n;i++)
g->scale_factors[j++] = get_bitsz(&s->gb, sl);
}
/* XXX: should compute exact size */
for(;j<40;j++)
g->scale_factors[j] = 0;
}
exponents_from_scale_factors(s, g, exponents);
/* read Huffman coded residue */
if (huffman_decode(s, g, exponents,
bits_pos + g->part2_3_length) < 0)
return -1;
/* skip extension bits */
bits_left = g->part2_3_length - (get_bits_count(&s->gb) - bits_pos);
if (bits_left < 0) {
return -1;
}
while (bits_left >= 16) {
skip_bits(&s->gb, 16);
bits_left -= 16;
}
if (bits_left > 0)
skip_bits(&s->gb, bits_left);
} /* ch */
if (s->nb_channels == 2)
compute_stereo(s, &granules[0][gr], &granules[1][gr]);
for(ch=0;ch<s->nb_channels;ch++) {
g = &granules[ch][gr];
reorder_block(s, g);
s->compute_antialias(s, g);
compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]);
}
} /* gr */
return nb_granules * 18;
}
static int mp_decode_frame(MPADecodeContext *s,
short *samples)
{
int i, nb_frames, ch;
short *samples_ptr;
init_get_bits(&s->gb, s->inbuf + HEADER_SIZE,
(s->inbuf_ptr - s->inbuf - HEADER_SIZE)*8);
/* skip error protection field */
if (s->error_protection)
get_bits(&s->gb, 16);
switch(s->layer)
{
case 1:
nb_frames = mp_decode_layer1(s);
break;
case 2:
nb_frames = mp_decode_layer2(s);
break;
case 3:
default:
nb_frames = mp_decode_layer3(s);
break;
}
/* apply the synthesis filter */
for(ch=0;ch<s->nb_channels;ch++)
{
samples_ptr = samples + ch;
for(i=0;i<nb_frames;i++)
{
synth_filter(s, ch, samples_ptr, s->nb_channels,
s->sb_samples[ch][i]);
samples_ptr += 32 * s->nb_channels;
}
}
return nb_frames * 32 * sizeof(short) * s->nb_channels;
}
HMP3DEC MP3_decode_init()
{
AVCodecContext * avctx;
MPADecodeContext *s;
static int init=0;
int i, j, k;
avctx = (AVCodecContext*)malloc(sizeof(AVCodecContext));
if(avctx == NULL)
{
return NULL;
}
memset(avctx, 0, sizeof(AVCodecContext));
avctx->priv_data = malloc(sizeof(MPADecodeContext));
if(avctx->priv_data == NULL)
{
free(avctx);
return NULL;
}
memset(avctx->priv_data, 0, sizeof(MPADecodeContext));
s = (MPADecodeContext *)avctx->priv_data;
// if(avctx->antialias_algo == FF_AA_INT)
s->compute_antialias= compute_antialias_integer;
// else
// s->compute_antialias= compute_antialias_float;
if (!init && !avctx->parse_only) {
/* scale factors table for layer 1/2 */
for(i=0;i<64;i++) {
int shift, mod;
/* 1.0 (i = 3) is normalized to 2 ^ FRAC_BITS */
shift = (i / 3);
mod = i % 3;
scale_factor_modshift[i] = mod | (shift << 2);
}
/* scale factor multiply for layer 1 */
for(i=0;i<15;i++) {
int n, norm;
n = i + 2;
norm = ((int64_t_C(1) << n) * FRAC_ONE) / ((1 << n) - 1);
scale_factor_mult[i][0] = MULL(FIXR(1.0 * 2.0), norm);
scale_factor_mult[i][1] = MULL(FIXR(0.7937005259 * 2.0), norm);
scale_factor_mult[i][2] = MULL(FIXR(0.6299605249 * 2.0), norm);
}
/* window */
/* max = 18760, max sum over all 16 coefs : 44736 */
for(i=0;i<257;i++) {
int v;
v = mpa_enwindow[i];
#if WFRAC_BITS < 16
v = (v + (1 << (16 - WFRAC_BITS - 1))) >> (16 - WFRAC_BITS);
#endif
window[i] = v;
if ((i & 63) != 0)
v = -v;
if (i != 0)
window[512 - i] = v;
}
/* huffman decode tables */
huff_code_table[0] = NULL;
for(i=1;i<16;i++) {
const HuffTable *h = &mpa_huff_tables[i];
int xsize, x, y;
unsigned int n;
uint8_t *code_table;
xsize = h->xsize;
n = xsize * xsize;
/* XXX: fail test */
init_vlc(&huff_vlc[i], 8, n,
h->bits, 1, 1, h->codes, 2, 2);
code_table = av_mallocz(n);
j = 0;
for(x=0;x<xsize;x++) {
fo
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -