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

📄 mpeg3dec.c

📁 arm9开发板上的例子,可以学习一下有简单的c程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -