📄 mpeg3dec.c
字号:
if (region1Start > region_stop) region1Start = region_stop; if (region2Start > region_stop) region2Start = region_stop; if (region_stop > 0) { huff_count = region1Start - i; if (huff_count > 0) { HUFF_decode_pair(h, gi->table_select[0], (INT16) (huff_count >> 1), isp); isp += huff_count; i += huff_count; } huff_count = region2Start - i; if (huff_count > 0) { HUFF_decode_pair(h, gi->table_select[1], (INT16) (huff_count >> 1), isp); isp += huff_count; i += huff_count; } huff_count = region_stop - i; if (huff_count > 0) { HUFF_decode_pair(h, gi->table_select[2], (INT16) (huff_count >> 1), isp); isp += huff_count; i += huff_count; } } /* Read count1 area. */ htable = gi->count1table_select; pos = HUFF_pos(h); count = HUFF_diff(part2_start, pos); // bits already used region_stop = gi->part2_3_length - count; // max bits to use HUFF_decode_quad(h, htable, region_stop, i, max_val, isp); return(MPEGDEC_ERR_NONE);}/****************************************************************************//* * Get nul pos of the current samples of MPEG III stream * Return 0 if Ok */static INT16 MPEG3_get_nul_pos(MPA_STREAM *mps, INT16 *is, INT16 gr, INT16 ch){ MPA_GRANULE_INFO *gi = &mps->side_info.ch[ch].gr[gr]; const INT16 *band_l = sfBandIndex_l[mps->header.ID][mps->header.sampling_frequency]; const INT16 *band_s = sfBandIndex_s[mps->header.ID][mps->header.sampling_frequency]; INT16 nul_begin = mps->huffman->nul_begin; INT16 sfb; if ((gi->window_switching_flag) && (gi->block_type == 2)) { // Short blocks INT16 nul_s; nul_s = (INT16) (nul_begin + 2) / 3; if (gi->mixed_block_flag) { // First 2 subbands are long blocks if (nul_begin > 36) { // can be in short blocks sfb = 12; while ((band_s[sfb] >= nul_s) && (sfb >= 3)) sfb--; mps->sfb_nul_s_top[ch] = mps->sfb_nul_s[0][ch] = mps->sfb_nul_s[1][ch] = mps->sfb_nul_s[2][ch] = sfb + 1; mps->sfb_nul_l[ch] = 8; } else { sfb = 7; while ((band_l[sfb] >= nul_begin) && (sfb >= 0)) sfb--; mps->sfb_nul_l[ch] = sfb + 1; mps->sfb_nul_s_top[ch] = mps->sfb_nul_s[0][ch] = mps->sfb_nul_s[1][ch] = mps->sfb_nul_s[2][ch] = 3; } } else { sfb = 12; while ((band_s[sfb] >= nul_s) && (sfb >= 0)) sfb--; mps->sfb_nul_s_top[ch] = mps->sfb_nul_s[0][ch] = mps->sfb_nul_s[1][ch] = mps->sfb_nul_s[2][ch] = sfb + 1; mps->sfb_nul_l[ch] = 0; } if (mps->header.ID == MPA_ID_2) { // Each null band should be evaluated for each window INT16 w; INT16 sfb_top = mps->sfb_nul_s[0][ch]; INT16 sfb_min = (gi->mixed_block_flag) ? 3 : 0; mps->sfb_nul_s_top[ch] = 0; for (w = 0; w < 3; w++) { register INT16 index; register INT16 cnt; register INT16 *isp; sfb = sfb_top; index = (band_s[sfb - 1] * 3) + ((INT16) (band_s[sfb] - band_s[sfb - 1]) * (INT16) (w + 1)) - 1; if (nul_begin < index) index = nul_begin; while (sfb > sfb_min) { isp = &is[index]; cnt = 1 + index - ((band_s[sfb - 1] * 3) + ((INT16) (band_s[sfb] - band_s[sfb - 1]) * w)); while (cnt--) if (*isp--) break; if (cnt >= 0) break; sfb--; index = (band_s[sfb - 1] * 3) + ((INT16) (band_s[sfb] - band_s[sfb - 1]) * (INT16) (w + 1)) - 1; } mps->sfb_nul_s[w][ch] = sfb; if (sfb > mps->sfb_nul_s_top[ch]) mps->sfb_nul_s_top[ch] = sfb; if ((sfb == sfb_min) && (sfb_min > 0)) { // Find into long blocks now sfb = 6; index = band_l[sfb] - 1; if (nul_begin < index) index = nul_begin; while (sfb > 0) { isp = &is[index]; cnt = 1 + index - band_l[sfb - 1]; while (cnt--) if (*isp--) break; if (cnt >= 0) break; sfb--; index = band_l[sfb] - 1; } mps->sfb_nul_l[ch] = sfb; } } } } else { // Long Blocks sfb = 21; while ((band_l[sfb] >= nul_begin) && (sfb >= 0)) sfb--; mps->sfb_nul_l[ch] = sfb + 1; mps->sfb_nul_s[0][ch] = mps->sfb_nul_s[1][ch] = mps->sfb_nul_s[2][ch] = 0; mps->sfb_nul_s_top[ch] = 0; } if ((mps->header.mode == MPA_MODE_JOINT_STEREO) && (ch > 0)) { mps->imdct_max[1] = mps->imdct_max[0]; } else { mps->imdct_max[ch] = 1 + (INT16) (nul_begin + (MPA_SSLIMIT - 1)) / MPA_SSLIMIT; if (mps->imdct_max[ch] > mps->sb_max) mps->imdct_max[ch] = mps->sb_max; if (mps->imdct_max[ch] > MPA_SBLIMIT) mps->imdct_max[ch] = MPA_SBLIMIT; } return(MPEGDEC_ERR_NONE);}/****************************************************************************/#ifndef SRAM_OPT_TABLEstatic const INT16 pretab[22] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0};#elseextern INT16 *pretab;#endif#ifdef MPEGAUD_INT#define POW_TYPE INT32#define POW_2_BITS 13#define POW_4_3_BITS MPEGTAB_POW_BITS // 18 usually#else#define POW_TYPE REAL#endif/****************************************************************************//* * Dequantize the current samples of MPEG III stream * Return 0 if Ok */#ifdef MOV_FUNCvoid (*MPEGSUBB_antialias_cp)(MPEGAUD_FRACT_TYPE *xr, INT16 sblim );#endifstatic INT16 MPEG3_dequantize_samples(MPA_STREAM *mps, INT16 *is, MPEGAUD_FRACT_TYPE *xr, INT16 gr, INT16 ch){ static BOOL init = FALSE;#ifdef MPEGAUD_INT // Init for POW_2_BITS = 13 (rounded to lowest) static POW_TYPE pow_2[4] = { 8192, 4870, 5792, 6888 }; INT16 sh, xrk_sh; POW_TYPE *pow4;#ifdef SPLIT_TABLE static POW_TYPE *pow_4_3_t[4];#endif#else static POW_TYPE *pows = NULL; static POW_TYPE *pow_2;#define POW_2_MAX 434 // 178+255+1#endif static POW_TYPE *pow_4_3 = NULL;#define POW_4_3_MAX 8192 MPA_GRANULE_INFO *gi = &mps->side_info.ch[ch].gr[gr]; MPA_SCALE_FAC3 *scf = &mps->scale_fac3[ch]; const INT16 *band_l = sfBandIndex_l[mps->header.ID][mps->header.sampling_frequency]; const INT16 *band_s = sfBandIndex_s[mps->header.ID][mps->header.sampling_frequency]; INT16 sfb; INT16 k, window; INT16 gk; MPEGAUD_FRACT_TYPE *xrp; INT16 *isp; POW_TYPE xrk;#ifdef MPEGAUD_INT#define DEQ(sa) \ if (sa >= 0) { \ sh = xrk_sh + (MPT_pow_4_3[sa] & 0xFF); \ if (sh < 32) \ *xrp = pow4[sa] >> sh; \ else \ *xrp = 0; \ } else { \ sh = xrk_sh + (MPT_pow_4_3[-(sa)] & 0xFF); \ if (sh < 32) \ *xrp = -(pow4[-(sa)] >> sh); \ else \ *xrp = 0; \ }#else#define DEQ(sa) \ if (sa >= 0) { \ *xrp = xrk * pow_4_3[sa]; \ } else { \ *xrp = -xrk * pow_4_3[-(sa)]; \ }#endif if (!init) { register INT16 i;#ifdef MPEGAUD_INT // Pre calc 2^(1/4 * k) * 2^POW2_BITS // ie: Keep POW_2_BITS as mantissa#ifdef SPLIT_TABLE pow_4_3_t[0] = (POW_TYPE *) malloc((POW_4_3_MAX * sizeof(POW_TYPE))); if (!pow_4_3_t[0]) return(MPEGDEC_ERR_MEM); pow_4_3_t[1] = (POW_TYPE *) malloc((POW_4_3_MAX * sizeof(POW_TYPE))); if (!pow_4_3_t[1]) return(MPEGDEC_ERR_MEM); pow_4_3_t[2] = (POW_TYPE *) malloc((POW_4_3_MAX * sizeof(POW_TYPE))); if (!pow_4_3_t[2]) return(MPEGDEC_ERR_MEM); pow_4_3_t[3] = (POW_TYPE *) malloc((POW_4_3_MAX * sizeof(POW_TYPE))); if (!pow_4_3_t[3]) return(MPEGDEC_ERR_MEM); for (k = 0; k < 4; k++) { pow4 = pow_4_3_t[k]; xrk = pow_2[k]; for (i = 0; i < POW_4_3_MAX; i++) pow4[i] = xrk * (MPT_pow_4_3[i] >> 8); }#else pow_4_3 = (POW_TYPE *) malloc((POW_4_3_MAX * 4 * sizeof(POW_TYPE)) - 1); if (!pow_4_3) return(MPEGDEC_ERR_MEM); for (k = 0; k < 4; k++) { pow4 = &pow_4_3[k * POW_4_3_MAX]; xrk = pow_2[k]; for (i = 0; i < POW_4_3_MAX; i++) pow4[i] = xrk * (MPT_pow_4_3[i] >> 8); }#endif#else pows = (POW_TYPE *) malloc((POW_2_MAX + POW_4_3_MAX) * sizeof(POW_TYPE)); if (!pows) return(MPEGDEC_ERR_MEM); pow_2 = pows; pow_4_3 = pow_2 + POW_2_MAX; for (i = 0; i < POW_2_MAX; i++) pow_2[i] = pow(2.0, 0.25 * (double) (i - 388)); for (i = 0; i < POW_4_3_MAX; i++) pow_4_3[i] = pow((double) i, 4.0 / 3.0);#endif init = TRUE; } isp = is; xrp = xr; gk = gi->global_gain + 178; if ((gi->window_switching_flag) && (gi->block_type == 2)) { // Short blocks sfb = 0; if (gi->mixed_block_flag) { // First 2 subbands are long blocks while (band_l[sfb + 1] < 36) { INT16 i = band_l[sfb + 1] - band_l[sfb]; k = scf->l[sfb]; if (gi->preflag) k += pretab[sfb]; if (gi->scalefac_scale) k <<= 1;#ifdef MPEGAUD_INT#ifdef SPLIT_TABLE pow4 = pow_4_3_t[((gk - (k << 1)) & 3)];#else pow4 = &pow_4_3[((gk - (k << 1)) & 3) * POW_4_3_MAX];#endif xrk_sh = POW_2_BITS - MPEGAUD_FRACT_BITS - ((gk - (k << 1) - 388 + 3) >> 2);#else xrk = pow_2[gk - (k << 1)];#endif while (i--) { if (*isp) { DEQ(*isp); xrp++; } else { *xrp++ = (MPEGAUD_FRACT_TYPE) 0; } isp++; } sfb++; } sfb = 3; // Start of short blocks now } // Short part while (sfb < mps->sfb_nul_s_top[ch]) { for (window = 0; window < 3; window++) { INT16 i = band_s[sfb + 1] - band_s[sfb]; k = scf->s[window][sfb]; if (gi->scalefac_scale) k <<= 1; k += (gi->subblock_gain[window] << 2);#ifdef MPEGAUD_INT#ifdef SPLIT_TABLE pow4 = pow_4_3_t[((gk - (k << 1)) & 3)];#else pow4 = &pow_4_3[((gk - (k << 1)) & 3) * POW_4_3_MAX];#endif xrk_sh = POW_2_BITS - MPEGAUD_FRACT_BITS - ((gk - (k << 1) - 388 + 3) >> 2);#else xrk = pow_2[gk - (k << 1)];#endif while (i--) { if (*isp) { DEQ(*isp); xrp++; } else { *xrp++ = (MPEGAUD_FRACT_TYPE) 0; } isp++; } } sfb++; } { register INT16 i = MPA_GRANULE_SIZE - (band_s[sfb] * 3); if (i > 0) { while (i--) *xrp++ = (MPEGAUD_FRACT_TYPE) 0; } } } else { // Long blocks for (sfb = 0; sfb < mps->sfb_nul_l[ch]; sfb++) { register INT16 i = band_l[sfb + 1] - band_l[sfb]; k = scf->l[sfb]; if (gi->preflag) k += pretab[sfb]; if (gi->scalefac_scale) k <<= 1;#ifdef MPEGAUD_INT // #7 Begin// xrk = pow_2[ (gk - (k<<1)) & 3 ];#ifdef SPLIT_TABLE pow4 = pow_4_3_t[((gk - (k << 1)) & 3)];#else pow4 = &pow_4_3[((gk - (k << 1)) & 3) * POW_4_3_MAX];#endif xrk_sh = POW_2_BITS - MPEGAUD_FRACT_BITS - ((gk - (k << 1) - 388 + 3) >> 2); // #7 End#else xrk = pow_2[gk - (k << 1)];#endif while (i--) { if (*isp) { DEQ(*isp); xrp++; } else { *xrp++ = (MPEGAUD_FRACT_TYPE) 0; } isp++; } } { INT16 i = MPA_GRANULE_SIZE - band_l[sfb]; if (i > 0) { while (i--) *xrp++ = (MPEGAUD_FRACT_TYPE) 0; } } } return(MPEGDEC_ERR_NONE);}/****************************************************************************/#define MAX_POS1 7#define MAX_POS2 32#ifdef MPEGAUD_INT/* * Precalc tables for ST_BITS = 14 */#ifndef SRAM_OPT_TABLEstatic const ST_TYPE tan_pos0[MAX_POS1] = { 0x0000, 0x0D86, 0x176C, 0x2000, 0x2893, 0x3279, 0x4000};static const ST_TYPE tan_pos1[MAX_POS1] = { 0x4000, 0x3279, 0x2893, 0x2000, 0x176C, 0x0D86, 0x0000};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -