⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpeg3dec.c

📁 mp3解码源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
						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 + -