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