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

📄 g723_func.c

📁 G.723在ARM上的实现。实现平台为Linux2.4.8+ Intel Xscal。包括源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	{		if ( prevDTXFrameType == 1 )		{			iFrameType = 1;		}		else		{			iFrameType = 0;		}	}					*frameType=iFrameType;	/* Unpack non-voice (VAD==0) SID/NonTX frames */	if (iFrameType !=1 )	{		if ( iFrameType == 2 )		{			/* obtain the remaining SID bits (24) */			iTemp1 = 4;			for ( i = 1; i < iTemp1; i ++ )			{				iTemp2 = (Ipp16s)pSrcBitStream[i];				for ( j = 0; j < 8; j ++ ) 				{					* pTemp1 ++ = (Ipp8u)((iTemp2 >> j) & 1);				}			}						/* obtain the LSF coefficients index */			*quantLsfIndex = 0;			for ( i = 0; i < 24; i ++ )			{				*quantLsfIndex += (Ipp16s)iBitStream[2+i] << i;			}						/* obtain the gain index */			fixedCbGainIndex[0] = 0;			for ( i = 0; i < 6; i ++ )			{				fixedCbGainIndex[0] += (Ipp16s)iBitStream[26+i] << i;			}					} 	}	/* Unpack voice (VAD==1) frames */	else	{		/* For valid frames, decode remaining stream parameters. In order to		   detect corrupted incoming frames, perform bounds checking on            decoded parameters */		if ( *InvalidFrame == 0 )		{			/* Unpack the compressed stream into an uncompresesd, 1-bit per byte buffer */			if ( *bitRate == IPP_SPCHBR_6300 )				iTemp1 = _G723_STREAM_BYTES_63KBPS;			else				iTemp1 = _G723_STREAM_BYTES_53KBPS;			for ( i = 1; i < iTemp1; i ++ )			{				iTemp2 = (Ipp16s)pSrcBitStream[i];				for ( j = 0; j < 8; j ++ )					* pTemp1 ++ = (Ipp8u)((iTemp2 >> j) & 1);			}						/* Check combined VADFLAG_B0 and RATEFLAG_B0 bits:			   VAD Rate		       0   0   - 6.3 kbps, speech		       0   1   - 5.3 kbps, speech		       1   0   - 6.3 kbps, non-speech		       1   1   - Reserved  */			iFrameType = (Ipp16s)iBitStream[0] + ((Ipp16s)iBitStream[1] << 1);			/* Bits 2-25:  LPC parameters (quantized LSFs; VQ indices) */			*quantLsfIndex = 0;			for ( i = 0; i < 24; i ++ )				*quantLsfIndex += ((Ipp16s)iBitStream[2+i] << i);			/* Skip remaining parameters for invalid (reserved) frame type (Rate=VAD=1) */			if ( iFrameType == 2 )			{				UpdateErasureFrameParameters(*InvalidFrame,                                              ConsecutiveFrameErasures,                                              fixedCbGainIndex,										     InterpolationGain);				if (*bitRate==IPP_SPCHBR_5300)					*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_5300;				else					*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_6300;				return(IPP_STATUS_OK);			}			/* Bits 26-32: 7-bit adaptive codeboook lag, subframe 0 */			iTemp1 = 0;			for ( i = 0; i < 7; i ++ )				iTemp1 += (Ipp16s)iBitStream[26+i] << i;			/* Verify lag validity 18<=L0<=141; declare invalid frame for corrupt lag bits */			if ( iTemp1 <= 123 )			{				adaptCbLagAbs[0] = iTemp1 + 18;				adaptCbLagAbs[1] = iTemp1 + 18;			} 			else			{				*InvalidFrame = 1;				UpdateErasureFrameParameters(*InvalidFrame, 					                         ConsecutiveFrameErasures, 											fixedCbGainIndex,											InterpolationGain);				if (*bitRate==IPP_SPCHBR_5300)					*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_5300;				else					*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_6300;				return(IPP_STATUS_OK);			}			/* Bits 33-34: 2-bit adaptive codeboook lag (differential), subframe 1 */			iTemp1 = 0;			for ( i = 0; i < 2; i ++ )				iTemp1 += (Ipp16s)iBitStream[33+i] << i;			adaptCbLagDiff[0] = 1;			adaptCbLagDiff[1] = iTemp1;			/* Bits 35-41: 7-bit adaptive codeboook lag, subframe 2 */			iTemp1 = 0;			for ( i = 0; i < 7; i ++ )			iTemp1 += (Ipp16s)iBitStream[35+i] << i;			/* Verify lag validity 18<=L2<=141; declare invalid frame for corrupt lag bits */			if ( iTemp1 <= 123 )			{				adaptCbLagAbs[2] = iTemp1 + 18;				adaptCbLagAbs[3] = iTemp1 + 18;			} 			else			{				*InvalidFrame = 1;				UpdateErasureFrameParameters(*InvalidFrame, 					                         ConsecutiveFrameErasures, 						                     fixedCbGainIndex,											 InterpolationGain);				if (*bitRate==IPP_SPCHBR_5300)					*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_5300;				else					*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_6300;				return(IPP_STATUS_OK);			}			/* Bits 42-43: 2-bit adaptive codeboook lag (differential), subframe 3 */			iTemp1 = 0;			for ( i = 0; i < 2; i ++ )				iTemp1 += (Ipp16s)iBitStream[42+i] << i;			adaptCbLagDiff[2] = 1;			adaptCbLagDiff[3] = iTemp1;			/* Bits 44-91: 48 bits of encoded gains, 12-bits per subframe */			/* Dirac pulse train indicator bits included for 6.3 kbps mode */			for ( i = 0; i < IPP_G723_NUM_SUBFRAME; i ++ )			{				iTemp1 = 0;				iTemp2 = (Ipp16s)(i * 12);				for ( j = 0; j < 12; j ++ )					iTemp1 += (Ipp16s)iBitStream[44+iTemp2+j] << j;				iTemp2 = 175;				fixedCbDiracPulseFlag[i] = 0;				if ( *bitRate == IPP_SPCHBR_6300 && adaptCbLagAbs[i] < 58 )				{					iTemp2 = 85;					fixedCbDiracPulseFlag[i] = iTemp1 >> 11;					iTemp1 &= 0x7ff;				}				adaptCbGainIndex[i] = iTemp1/24;				/* Bounds check gain quantization indices, declare invalid frame for				out-of-range indices 				*/				if ( adaptCbGainIndex[i] < iTemp2 )					fixedCbGainIndex[i] = iTemp1 % 24;				else				{					*InvalidFrame = 1;					UpdateErasureFrameParameters(*InvalidFrame, 						                         ConsecutiveFrameErasures, 							                     fixedCbGainIndex,											     InterpolationGain);					if (*bitRate==IPP_SPCHBR_5300)						*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_5300;					else						*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_6300;					return(IPP_STATUS_OK);				}			}			/* Bits 92-95:  Grid position bits for subframes 0-3 */			for ( i = 0; i < IPP_G723_NUM_SUBFRAME; i ++ )				fixedCbGridAlign[i] = (Ipp16s)iBitStream[92+i];			/* Decode fixed codebook pulse position and sign parameters */			/* 6.3 kbps mode */			if ( *bitRate == IPP_SPCHBR_6300 )			{				/* Extract 4 most significant position bits for subframes 0-3 				   from the combined 13-bit index */				/* Bits 96-108: Combined 13-bit pulse position index */				iTemp1 = 0;				for ( i = 0; i < 13; i ++ )				{					iTemp1 += (Ipp16s)iBitStream[97+i] << i;				}				fixedCbPulsePos[0] = (Ipp32s)(iTemp1/90)/9;				fixedCbPulsePos[1] = (Ipp32s)(iTemp1/90)%9;				fixedCbPulsePos[2] = (Ipp32s)(iTemp1%90)/9;				fixedCbPulsePos[3] = (Ipp32s)(iTemp1%90)%9;				/* Bits 109-124: Pulse position bits for 6 pulses, subframe 0 */					nTemp1 = 0;				for ( i = 0; i < 16; i ++ )					nTemp1 += (Ipp32s)iBitStream[110+i] << i;				fixedCbPulsePos[0] <<= 16;				fixedCbPulsePos[0] += nTemp1;				/* Bits 125-138: Pulse position bits for 5 pulses, subframe 1 */					iTemp1 = 0;				for ( i = 0; i < 14; i ++ )					iTemp1 += (Ipp16s)iBitStream[126+i] << i;				fixedCbPulsePos[1] <<= 14;				fixedCbPulsePos[1] += iTemp1;				/* Bits 139-154: Pulse position bits for 6 pulses, subframe 2 */					nTemp1 = 0;				for ( i = 0; i < 16; i ++ )					nTemp1 += (Ipp32s)iBitStream[140+i] << i;				fixedCbPulsePos[2] <<= 16;				fixedCbPulsePos[2] += nTemp1;				/* Bits 155-168: Pulse position bits for 5 pulses, subframe 3 */					iTemp1 = 0;				for ( i = 0; i < 14; i ++ )					iTemp1 += (Ipp16s)iBitStream[156+i] << i;				fixedCbPulsePos[3] <<= 14;				fixedCbPulsePos[3] += iTemp1;				/* Bits 169-174: Pulse sign bits for 6 pulses, subframe 0 */				iTemp1 = 0;				for ( i = 0; i < 6; i ++ )					iTemp1 += (Ipp16s)iBitStream[170+i] << i;				fixedCbPulseSign[0] = iTemp1;					/* Bits 175-179: Pulse sign bits for 5 pulses, subframe 1 */				iTemp1 = 0;				for ( i = 0; i < 5; i ++ )					iTemp1 += (Ipp16s)iBitStream[176+i] << i;				fixedCbPulseSign[1] = iTemp1;				/* Bits 180-185: Pulse sign bits for 6 pulses, subframe 2 */				iTemp1 = 0;				for ( i = 0; i < 6; i ++ )					iTemp1 += (Ipp16s)iBitStream[181+i] << i;				fixedCbPulseSign[2] = iTemp1;				/* Bits 186-190: Pulse sign bits for 5 pulses, subframe 3 */							iTemp1 = 0;				for ( i = 0; i < 5; i ++ )					iTemp1 += (Ipp16s)iBitStream[187+i] << i;				fixedCbPulseSign[3] = iTemp1;			} 			else			/* Decode fixed codebook pulse position and sign parameters */			/* 5.3 kbps mode */			{				/* Bits 96-143: Pulse position bits for subframes 0-3 */				for ( i = 0; i < IPP_G723_NUM_SUBFRAME; i ++ )				{					iTemp1 = 0;					iTemp2 = (Ipp16s)(i * 12);					for ( j = 0; j < 12; j ++ )						iTemp1 += (Ipp16s)iBitStream[96+iTemp2+j] << j;					fixedCbPulsePos[i] = (Ipp32s)iTemp1;				}				/* Bits 144-159: Pulse sign bits for subframes 0-3 */				for ( i = 0; i < IPP_G723_NUM_SUBFRAME; i ++ )				{					iTemp1 = 0;					iTemp2 = (Ipp16s)(i * 4);					for ( j = 0; j < 4; j ++ )						iTemp1 += (Ipp16s)iBitStream[144+iTemp2+j] << j;					fixedCbPulseSign[i] = iTemp1;				}			} /* End fixed codebook parameter decoding */		} /* End bitstream decoding */		UpdateErasureFrameParameters(*InvalidFrame,                                      ConsecutiveFrameErasures, 									 fixedCbGainIndex, 									 InterpolationGain);	}	switch(*frameType)	{		case 1:			if (*bitRate==IPP_SPCHBR_5300)				*pDstNumBitstreamBytes=IPP_G723_BITSTREAM_LEN_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -