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

📄 g723_aux.c

📁 windows环境下利用IPP库的例子代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	Ipp8u	iBitStream[_G723_STREAM_BYTES_63KBPS<<3];   /* bitstream "expansion" or "decompression" buffer 
												           holds 1 stream bit in each 8-bit word */
	Ipp16s	iFrameType;									/* frame type as indicated by VADFLAG_B0 and RATEFLAG_B0 bits */
	Ipp16s	iTemp1,iTemp2;								/* Miscellaneous Ipp16s temp variables used throughout decoder */
	Ipp32s	nTemp1;										/* Ipp32s temp variable used throughout decoder */
	Ipp8u	*pTemp1;									/* Raw bitstream pointer */

	/* Extract bitrate and frame type */
	pTemp1 = iBitStream;
	iTemp2 = (Ipp16s)pSrcBitStream[0];
	for ( j = 0; j < 8; j ++ )
	{
		* pTemp1 ++ = (Ipp8u)((iTemp2 >> j) & 1);
	}
	iTemp1 = iBitStream[0] + (iBitStream[1] << 1);

	/* NonTX */
	if ( iTemp1 == 3 )
	{
		iFrameType = 0;
	} 

	/* SID */
	else if ( iTemp1 == 2 )
	{
		iFrameType = 2;
	} 

	/* voice frame */
	else if ( iTemp1 == 1 )
	{
		iFrameType = 1;
		*bitRate = IPP_SPCHBR_5300;
	} 
	else
	{
		iFrameType = 1;
		*bitRate = IPP_SPCHBR_6300;
	}

	/* Process externally flagged erasure frames */
	if ( *InvalidFrame )
	{
		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;
			

⌨️ 快捷键说明

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