📄 mpeg3dec.c
字号:
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);}/****************************************************************************/static 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};#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 */static 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#define ST_TYPE INT16#define ST_BITS 14#define ST_MULT(a, b) (((ST_TYPE)(a) * (ST_TYPE)(b))>>ST_BITS)/* * Precalc tables for ST_BITS = 14 */static 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};static const ST_TYPE pow_io0[2][MAX_POS2] = { 0x4000, 0x35D1, 0x4000, 0x2D41, 0x4000, 0x260D, 0x4000, 0x2000, 0x4000, 0x1AE8, 0x4000, 0x16A0, 0x4000, 0x1306, 0x4000, 0x1000, 0x4000, 0x0D74, 0x4000, 0x0B50, 0x4000, 0x0983, 0x4000, 0x0800, 0x4000, 0x06BA, 0x4000, 0x05A8, 0x4000, 0x04C1, 0x4000, 0x0400, 0x4000, 0x2D41, 0x4000, 0x2000, 0x4000, 0x16A0, 0x4000, 0x1000, 0x4000, 0x0B50, 0x4000, 0x0800, 0x4000, 0x05A8, 0x4000, 0x0400, 0x4000, 0x02D4, 0x4000, 0x0200, 0x4000, 0x016A, 0x4000, 0x0100, 0x4000, 0x00B5, 0x4000, 0x0080, 0x4000, 0x005A, 0x4000, 0x0040};static const ST_TYPE pow_io1[2][MAX_POS2] = { 0x4000, 0x4000, 0x35D1, 0x4000, 0x2D41, 0x4000, 0x260D, 0x4000, 0x2000, 0x4000, 0x1AE8, 0x4000, 0x16A0, 0x4000, 0x1306, 0x4000, 0x1000, 0x4000, 0x0D74, 0x4000, 0x0B50, 0x4000, 0x0983, 0x4000, 0x0800, 0x4000, 0x06BA, 0x4000, 0x05A8, 0x4000, 0x04C1, 0x4000, 0x4000, 0x4000, 0x2D41, 0x4000, 0x2000, 0x4000, 0x16A0, 0x4000, 0x1000, 0x4000, 0x0B50, 0x4000, 0x0800, 0x4000, 0x05A8, 0x4000, 0x0400, 0x4000, 0x02D4, 0x4000, 0x0200, 0x4000, 0x016A, 0x4000, 0x0100, 0x4000, 0x00B5, 0x4000, 0x0080, 0x4000, 0x005A, 0x4000};#else#define ST_TYPE REAL#define ST_MULT(a, b) ((a) * (b))static const ST_TYPE tan_pos0[MAX_POS1] = { 0.0, 0.211324841, 0.366025358, 0.5, 0.633974493, 0.788674951, 1.0};static const ST_TYPE tan_pos1[MAX_POS1] = { 1.0, 0.788674951, 0.633974493, 0.5, 0.366025358, 0.211324841, 0.0};static const ST_TYPE pow_io0[2][MAX_POS2] = { 1.0, 0.840896368, 1.0, 0.707106769, 1.0, 0.594603539, 1.0, 0.500000000, 1.0, 0.420448184, 1.0, 0.353553385, 1.0, 0.297301769, 1.0, 0.250000000, 1.0, 0.210224092, 1.0, 0.176776692, 1.0, 0.148650885, 1.0, 0.125000000, 1.0, 0.105112046, 1.0, 0.088388346, 1.0, 0.074325442, 1.0, 0.062500000, 1.0, 0.707106769, 1.0, 0.500000000, 1.0, 0.353553385, 1.0, 0.250000000, 1.0, 0.176776692, 1.0, 0.125000000, 1.0, 0.088388346, 1.0, 0.062500000, 1.0, 0.044194173, 1.0, 0.031250000, 1.0, 0.022097087, 1.0, 0.015625000, 1.0, 0.011048543, 1.0, 0.007812500, 1.0, 0.005524272, 1.0, 0.003906250,};static const ST_TYPE pow_io1[2][MAX_POS2] = { 1.0, 1.0, 0.840896368, 1.0, 0.707106769, 1.0, 0.594603539, 1.0, 0.500000000, 1.0, 0.420448184, 1.0, 0.353553385, 1.0, 0.297301769, 1.0, 0.250000000, 1.0, 0.210224092, 1.0, 0.176776692, 1.0, 0.148650885, 1.0, 0.125000000, 1.0, 0.105112046, 1.0, 0.088388346, 1.0, 0.074325442, 1.0, 1.0, 1.0, 0.707106769, 1.0, 0.500000000, 1.0, 0.353553385, 1.0, 0.250000000, 1.0, 0.176776692, 1.0, 0.125000000, 1.0, 0.088388346, 1.0, 0.062500000, 1.0, 0.044194173, 1.0, 0.031250000, 1.0, 0.022097087, 1.0, 0.015625000, 1.0, 0.011048543, 1.0, 0.007812500, 1.0, 0.005524272, 1.0,};#endif/****************************************************************************//* * Decode the stereo data of a granule * Return 0 if Ok */static int MPEG3_stereo(MPA_STREAM *mps, MPEGAUD_FRACT_TYPE *xr, INT16 gr){ static int init = 0; static FILE *fquant; 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]; MPA_SCALE_FAC3 *sf = &mps->scale_fac3[1]; MPA_GRANULE_INFO *gi = &mps->side_info.ch[0].gr[gr]; BOOL ms_stereo = (mps->header.mode == MPA_MODE_JOINT_STEREO) && (mps->header.mode_extension & 0x2); BOOL i_stereo = (mps->header.mode == MPA_MODE_JOINT_STEREO) && (mps->header.mode_extension & 0x1); INT16 sfb; INT16 i, j, sb, sbmax; BOOL lsf = (mps->header.ID == MPA_ID_2);#define MAX_POS1 7#define MAX_POS2 32 const ST_TYPE *pow_iok0; const ST_TYPE *pow_iok1; MPEGAUD_FRACT_TYPE *xrp0, *xrp1, temp;#ifdef MPEGAUD_INT ST_TYPE sq2 = 0.7071067812 * (1 << ST_BITS);#else REAL sq2 = 0.7071067812;#endif if (lsf) { if (gi->scalefac_compress & 1) { pow_iok0 = pow_io0[1]; pow_iok1 = pow_io1[1]; } else { pow_iok0 = pow_io0[0]; pow_iok1 = pow_io1[0]; } } else { pow_iok0 = tan_pos0; pow_iok1 = tan_pos1; } if ((mps->stereo) && i_stereo) { ST_TYPE k0, k1; INT16 sfb_top; INT16 max_sfb = 0; INT16 ispos; INT16 is_illegal; if (gi->window_switching_flag && (gi->block_type == 2)) { sbmax = mps->sfb_nul_s_top[0]; if (sbmax < mps->sfb_nul_s_top[1]) sbmax = mps->sfb_nul_s_top[1]; sbmax++; if (sbmax > 13) sbmax = 13; for (j = 0; j < 3; j++) { sfb_top = mps->sfb_nul_s[j][1]; if ((gi->mixed_block_flag) && (sfb_top < 3)) sfb_top = 3; // Normaly not !!! if (sfb_top > max_sfb) max_sfb = sfb_top; is_illegal = (lsf) ? mps->is_max_s[j][0] : 7; // Implicit: ispos == is_illegal here (not nul bands) ispos = is_illegal; for (sfb = 0; sfb < sfb_top; sfb++) { sb = band_s[sfb + 1] - band_s[sfb]; i = 3 * band_s[sfb] + j * sb; xrp0 = &xr[i]; xrp1 = &xr[MPA_GRANULE_SIZE + i]; if (ms_stereo) while (sb--) { temp = ST_MULT((*xrp0 + *xrp1), sq2); *xrp1 = ST_MULT((*xrp0 - *xrp1), sq2); *xrp0++ = temp; xrp1++; } } while (sfb < sbmax) { // #9: sbmax instead of 13 sb = band_s[sfb + 1] - band_s[sfb]; i = 3 * band_s[sfb] + j * sb; xrp0 = &xr[i]; xrp1 = &xr[MPA_GRANULE_SIZE + i]; if (sfb < 12) { // keep previous ispos for // last sfb ispos = sf->s[j][sfb]; is_illegal = (lsf) ? mps-> is_max_s[j][sfb] : 7; } if (ispos == is_illegal) { if (ms_stereo) while (sb--) { temp = ST_MULT((*xrp0 + *xrp1), sq2); *xrp1 = ST_MULT((*xrp0 - *xrp1), sq2); *xrp0++ = temp; xrp1++; } } else { // ispos != is_illegal k0 = pow_iok0[ispos]; k1 = pow_iok1[ispos]; while (sb--) { temp = ST_MULT(*xrp0, k0); *xrp1 = ST_MULT(*xrp0, k1); *xrp0++ = temp; xrp1++; } } sfb++; } } if (gi->mixed_block_flag) { INT16 sfb_max = (lsf) ? 6 : 8; xrp0 = xr; xrp1 = &xr[MPA_GRANULE_SIZE]; if (max_sfb <= 3) { // Top of nul bands in long blocks sfb = mps->sfb_nul_l[1]; // Begin of nul bands } else { sfb = sfb_max; // Begin of nul band not in long blocks } sb = band_l[sfb]; // Implicit: ispos == is_illegal here (not nul bands) if (ms_stereo) while (sb--) { temp = ST_MULT((*xrp0 + *xrp1), sq2); *xrp1 = ST_MULT((*xrp0 - *xrp1), sq2); *xrp0++ = temp; xrp1++; } else { xrp0 += sb; xrp1 += sb; } for (; sfb < sfb_max; sfb++) { sb = band_l[sfb + 1] - band_l[sfb]; ispos = sf->l[sfb]; is_illegal = (lsf) ? mps-> is_max_l[sfb] : 7; if (ispos == is_illegal) { if (ms_stereo) while (sb--) { temp = ST_MULT((*xrp0 + *xrp1), sq2); *xrp1 = ST_MULT((*xrp0 - *xrp1), sq2); *xrp0++ = temp; xrp1++; } else { xrp0 += sb; xrp1 += sb; } } else { // ispos != is_illegal k0 = pow_iok0[ispos]; k1 = pow_iok1[ispos]; while (sb--) { temp = ST_MULT(*xrp0, k0); *xrp1 = ST_MULT(*xrp0, k1); *xrp0++ = temp; xrp1++; } } } } } else { // Long blocks, intensity stereo sbmax = mps->sfb_nul_l[0]; if (sbmax < mps->sfb_nul_l[1]) sbmax = mps->sfb_nul_l[1]; sbmax++; if (sbmax > 22) sbmax = 22; xrp0 = xr; xrp1 = &xr[MPA_GRANULE_SIZE]; sfb = mps->sfb_nul_l[1]; // Begin of nul bands sb = band_l[sfb]; is_illegal = (lsf) ? mps->is_max_l[0] : 7; // Implicit: ispos == is_illegal here (not nul bands) ispos = is_illegal; if (ms_stereo)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -