📄 g723_aux.c
字号:
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 + -