📄 mpegaudiodec.c
字号:
dst = tmp + k; for(j=len;j>0;j--) { *dst = *ptr++; dst += 3; } } memcpy(ptr1, tmp, len * 3 * sizeof(int32_t)); }}#define ISQRT2 FIXR(0.70710678118654752440)static void compute_stereo(MPADecodeContext *s, GranuleDef *g0, GranuleDef *g1){ int i, j, k, l; int32_t v1, v2; int sf_max, tmp0, tmp1, sf, len, non_zero_found; int32_t (*is_tab)[16]; int32_t *tab0, *tab1; int non_zero_found_short[3]; /* intensity stereo */ if (s->mode_ext & MODE_EXT_I_STEREO) { if (!s->lsf) { is_tab = is_table; sf_max = 7; } else { is_tab = is_table_lsf[g1->scalefac_compress & 1]; sf_max = 16; } tab0 = g0->sb_hybrid + 576; tab1 = g1->sb_hybrid + 576; non_zero_found_short[0] = 0; non_zero_found_short[1] = 0; non_zero_found_short[2] = 0; k = (13 - g1->short_start) * 3 + g1->long_end - 3; for(i = 12;i >= g1->short_start;i--) { /* for last band, use previous scale factor */ if (i != 11) k -= 3; len = band_size_short[s->sample_rate_index][i]; for(l=2;l>=0;l--) { tab0 -= len; tab1 -= len; if (!non_zero_found_short[l]) { /* test if non zero band. if so, stop doing i-stereo */ for(j=0;j<len;j++) { if (tab1[j] != 0) { non_zero_found_short[l] = 1; goto found1; } } sf = g1->scale_factors[k + l]; if (sf >= sf_max) goto found1; v1 = is_tab[0][sf]; v2 = is_tab[1][sf]; for(j=0;j<len;j++) { tmp0 = tab0[j]; tab0[j] = MULL(tmp0, v1); tab1[j] = MULL(tmp0, v2); } } else { found1: if (s->mode_ext & MODE_EXT_MS_STEREO) { /* lower part of the spectrum : do ms stereo if enabled */ for(j=0;j<len;j++) { tmp0 = tab0[j]; tmp1 = tab1[j]; tab0[j] = MULL(tmp0 + tmp1, ISQRT2); tab1[j] = MULL(tmp0 - tmp1, ISQRT2); } } } } } non_zero_found = non_zero_found_short[0] | non_zero_found_short[1] | non_zero_found_short[2]; for(i = g1->long_end - 1;i >= 0;i--) { len = band_size_long[s->sample_rate_index][i]; tab0 -= len; tab1 -= len; /* test if non zero band. if so, stop doing i-stereo */ if (!non_zero_found) { for(j=0;j<len;j++) { if (tab1[j] != 0) { non_zero_found = 1; goto found2; } } /* for last band, use previous scale factor */ k = (i == 21) ? 20 : i; sf = g1->scale_factors[k]; if (sf >= sf_max) goto found2; v1 = is_tab[0][sf]; v2 = is_tab[1][sf]; for(j=0;j<len;j++) { tmp0 = tab0[j]; tab0[j] = MULL(tmp0, v1); tab1[j] = MULL(tmp0, v2); } } else { found2: if (s->mode_ext & MODE_EXT_MS_STEREO) { /* lower part of the spectrum : do ms stereo if enabled */ for(j=0;j<len;j++) { tmp0 = tab0[j]; tmp1 = tab1[j]; tab0[j] = MULL(tmp0 + tmp1, ISQRT2); tab1[j] = MULL(tmp0 - tmp1, ISQRT2); } } } } } else if (s->mode_ext & MODE_EXT_MS_STEREO) { /* ms stereo ONLY */ /* NOTE: the 1/sqrt(2) normalization factor is included in the global gain */ tab0 = g0->sb_hybrid; tab1 = g1->sb_hybrid; for(i=0;i<576;i++) { tmp0 = tab0[i]; tmp1 = tab1[i]; tab0[i] = tmp0 + tmp1; tab1[i] = tmp0 - tmp1; } }}static void compute_antialias_integer(MPADecodeContext *s, GranuleDef *g){ int32_t *ptr, *csa; int n, i; /* we antialias only "long" bands */ if (g->block_type == 2) { if (!g->switch_point) return; /* XXX: check this for 8000Hz case */ n = 1; } else { n = SBLIMIT - 1; } ptr = g->sb_hybrid + 18; for(i = n;i > 0;i--) { int tmp0, tmp1, tmp2; csa = &csa_table[0][0];#define INT_AA(j) \ tmp0 = ptr[-1-j];\ tmp1 = ptr[ j];\ tmp2= MULH(tmp0 + tmp1, csa[0+4*j]);\ ptr[-1-j] = 4*(tmp2 - MULH(tmp1, csa[2+4*j]));\ ptr[ j] = 4*(tmp2 + MULH(tmp0, csa[3+4*j])); INT_AA(0) INT_AA(1) INT_AA(2) INT_AA(3) INT_AA(4) INT_AA(5) INT_AA(6) INT_AA(7) ptr += 18; }}static void compute_antialias_float(MPADecodeContext *s, GranuleDef *g){ int32_t *ptr; int n, i; /* we antialias only "long" bands */ if (g->block_type == 2) { if (!g->switch_point) return; /* XXX: check this for 8000Hz case */ n = 1; } else { n = SBLIMIT - 1; } ptr = g->sb_hybrid + 18; for(i = n;i > 0;i--) { float tmp0, tmp1; float *csa = &csa_table_float[0][0]; #define FLOAT_AA(j)\ tmp0= ptr[-1-j];\ tmp1= ptr[ j];\ ptr[-1-j] = lrintf(tmp0 * csa[0+4*j] - tmp1 * csa[1+4*j]);\ ptr[ j] = lrintf(tmp0 * csa[1+4*j] + tmp1 * csa[0+4*j]); FLOAT_AA(0) FLOAT_AA(1) FLOAT_AA(2) FLOAT_AA(3) FLOAT_AA(4) FLOAT_AA(5) FLOAT_AA(6) FLOAT_AA(7) ptr += 18; }}static void compute_imdct(MPADecodeContext *s, GranuleDef *g, int32_t *sb_samples, int32_t *mdct_buf){ int32_t *ptr, *win, *win1, *buf, *out_ptr, *ptr1; int32_t out2[12]; int i, j, mdct_long_end, v, sblimit; /* find last non zero block */ ptr = g->sb_hybrid + 576; ptr1 = g->sb_hybrid + 2 * 18; while (ptr >= ptr1) { ptr -= 6; v = ptr[0] | ptr[1] | ptr[2] | ptr[3] | ptr[4] | ptr[5]; if (v != 0) break; } sblimit = ((ptr - g->sb_hybrid) / 18) + 1; if (g->block_type == 2) { /* XXX: check for 8000 Hz */ if (g->switch_point) mdct_long_end = 2; else mdct_long_end = 0; } else { mdct_long_end = sblimit; } buf = mdct_buf; ptr = g->sb_hybrid; for(j=0;j<mdct_long_end;j++) { /* apply window & overlap with previous buffer */ out_ptr = sb_samples + j; /* select window */ if (g->switch_point && j < 2) win1 = mdct_win[0]; else win1 = mdct_win[g->block_type]; /* select frequency inversion */ win = win1 + ((4 * 36) & -(j & 1)); imdct36(out_ptr, buf, ptr, win); out_ptr += 18*SBLIMIT; ptr += 18; buf += 18; } for(j=mdct_long_end;j<sblimit;j++) { /* select frequency inversion */ win = mdct_win[2] + ((4 * 36) & -(j & 1)); out_ptr = sb_samples + j; for(i=0; i<6; i++){ *out_ptr = buf[i]; out_ptr += SBLIMIT; } imdct12(out2, ptr + 0); for(i=0;i<6;i++) { *out_ptr = MULH(out2[i], win[i]) + buf[i + 6*1]; buf[i + 6*2] = MULH(out2[i + 6], win[i + 6]); out_ptr += SBLIMIT; } imdct12(out2, ptr + 1); for(i=0;i<6;i++) { *out_ptr = MULH(out2[i], win[i]) + buf[i + 6*2]; buf[i + 6*0] = MULH(out2[i + 6], win[i + 6]); out_ptr += SBLIMIT; } imdct12(out2, ptr + 2); for(i=0;i<6;i++) { buf[i + 6*0] = MULH(out2[i], win[i]) + buf[i + 6*0]; buf[i + 6*1] = MULH(out2[i + 6], win[i + 6]); buf[i + 6*2] = 0; } 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; }}#if defined(DEBUG)void sample_dump(int fnum, int32_t *tab, int n){ static FILE *files[16], *f; char buf[512]; int i; int32_t v; f = files[fnum]; if (!f) { snprintf(buf, sizeof(buf), "/tmp/out%d.%s.pcm", fnum, #ifdef USE_HIGHPRECISION "hp"#else "lp"#endif ); f = fopen(buf, "w"); if (!f) return; files[fnum] = f; } if (fnum == 0) { static int pos = 0; av_log(NULL, AV_LOG_DEBUG, "pos=%d\n", pos); for(i=0;i<n;i++) { av_log(NULL, AV_LOG_DEBUG, " %0.4f", (double)tab[i] / FRAC_ONE); if ((i % 18) == 17) av_log(NULL, AV_LOG_DEBUG, "\n"); } pos += n; } for(i=0;i<n;i++) { /* normalize to 23 frac bits */ v = tab[i] << (23 - FRAC_BITS); fwrite(&v, 1, sizeof(int32_t), f); }}#endif/* 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++) { dprintf("gr=%d ch=%d: side_info\n", gr, 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); dprintf("region1=%d region2=%d\n", region_address1, region_address2); 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 si
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -