📄 decg729.c
字号:
if(DEC_KEY != decoderObj->objPrm.key)
return APIG729_StsBadCodecType;
delayVal[0]=delayVal[1]=0;
pA = AzDec;
pParm = src;
if(frametype == -1) {
decoderObj->decPrm[1] = 0;
decoderObj->decPrm[0] = 1;
} else if(frametype == 0) {
decoderObj->decPrm[1] = 0;
decoderObj->decPrm[0] = 0;
} else if(frametype == 1) {
decoderObj->decPrm[1] = 1;
decoderObj->decPrm[0] = 0;
i=0;
decoderObj->decPrm[1+1] = ExtractBitsG729(&pParm,&i,1);
decoderObj->decPrm[1+2] = ExtractBitsG729(&pParm,&i,5);
decoderObj->decPrm[1+3] = ExtractBitsG729(&pParm,&i,4);
decoderObj->decPrm[1+4] = ExtractBitsG729(&pParm,&i,5);
} else if(frametype == 2) {
decoderObj->decPrm[0] = 0;
decoderObj->decPrm[1] = 2;
i=0;
decoderObj->decPrm[2] = ExtractBitsG729(&pParm,&i,1+FIR_STAGE_BITS);
decoderObj->decPrm[3] = ExtractBitsG729(&pParm,&i,SEC_STAGE_BITS*2);
decoderObj->decPrm[4] = ExtractBitsG729(&pParm,&i,8);
decoderObj->decPrm[5] = ExtractBitsG729(&pParm,&i,9);
decoderObj->decPrm[6] = ExtractBitsG729(&pParm,&i,2);
decoderObj->decPrm[7] = ExtractBitsG729(&pParm,&i,6);
decoderObj->decPrm[8] = ExtractBitsG729(&pParm,&i,4);
decoderObj->decPrm[9] = ExtractBitsG729(&pParm,&i,9);
decoderObj->decPrm[10] = ExtractBitsG729(&pParm,&i,2);
decoderObj->decPrm[11] = ExtractBitsG729(&pParm,&i,6);
decoderObj->codecType = G729D_CODEC;
} else if(frametype == 3) {
i=0;
decoderObj->decPrm[1] = 3;
decoderObj->decPrm[0] = 0;
decoderObj->decPrm[1+1] = ExtractBitsG729(&pParm,&i,1+FIR_STAGE_BITS);
decoderObj->decPrm[1+2] = ExtractBitsG729(&pParm,&i,SEC_STAGE_BITS*2);
decoderObj->decPrm[1+3] = ExtractBitsG729(&pParm,&i,8);
decoderObj->decPrm[1+4] = ExtractBitsG729(&pParm,&i,1);
decoderObj->decPrm[1+5] = ExtractBitsG729(&pParm,&i,13);
decoderObj->decPrm[1+6] = ExtractBitsG729(&pParm,&i,4);
decoderObj->decPrm[1+7] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[1+8] = ExtractBitsG729(&pParm,&i,5);
decoderObj->decPrm[1+9] = ExtractBitsG729(&pParm,&i,13);
decoderObj->decPrm[1+10] = ExtractBitsG729(&pParm,&i,4);
decoderObj->decPrm[1+11] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[1+4] = (equality(decoderObj->decPrm[1+3])+decoderObj->decPrm[1+4]) & 0x00000001; /* parity error (1) */
decoderObj->codecType = G729_CODEC;
} else if(frametype == 4) {
short tmp;
i=0;
tmp = ExtractBitsG729(&pParm,&i,2);
decoderObj->decPrm[0] = 0;
decoderObj->decPrm[1] = 4;
if(tmp==0) {
decoderObj->decPrm[2] = 0;
decoderObj->decPrm[3] = ExtractBitsG729(&pParm,&i,1+FIR_STAGE_BITS);
decoderObj->decPrm[4] = ExtractBitsG729(&pParm,&i,SEC_STAGE_BITS*2);
decoderObj->decPrm[5] = ExtractBitsG729(&pParm,&i,8);
decoderObj->decPrm[6] = ExtractBitsG729(&pParm,&i,1);
decoderObj->decPrm[7] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[8] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[9] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[10] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[11] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[12] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[13] = ExtractBitsG729(&pParm,&i,5);
decoderObj->decPrm[14] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[15] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[16] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[17] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[18] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[19] = ExtractBitsG729(&pParm,&i,7);
i = decoderObj->decPrm[5]>>1;
i &= 1;
decoderObj->decPrm[6] += i;
decoderObj->decPrm[6] = (equality(decoderObj->decPrm[5])+decoderObj->decPrm[6]) & 0x00000001;/* parm[6] = parity error (1) */
} else {
decoderObj->decPrm[2] = 1; /*LPmode*/
decoderObj->decPrm[3] = ExtractBitsG729(&pParm,&i,8);
decoderObj->decPrm[4] = ExtractBitsG729(&pParm,&i,1);
decoderObj->decPrm[5] = ExtractBitsG729(&pParm,&i,13);
decoderObj->decPrm[6] = ExtractBitsG729(&pParm,&i,10);
decoderObj->decPrm[7] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[8] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[9] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[10] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[11] = ExtractBitsG729(&pParm,&i,5);
decoderObj->decPrm[12] = ExtractBitsG729(&pParm,&i,13);
decoderObj->decPrm[13] = ExtractBitsG729(&pParm,&i,10);
decoderObj->decPrm[14] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[15] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[16] = ExtractBitsG729(&pParm,&i,7);
decoderObj->decPrm[17] = ExtractBitsG729(&pParm,&i,7);
i = decoderObj->decPrm[3]>>1;
i &= 1;
decoderObj->decPrm[4] += i;
decoderObj->decPrm[4] = (equality(decoderObj->decPrm[3])+decoderObj->decPrm[4]) & 0x00000001;/* parm[4] = parity error (1) */
}
decoderObj->codecType = G729E_CODEC;
}
parm = decoderObj->decPrm;
badFrameIndicator = *parm++;
fType = *parm;
if(badFrameIndicator == 1) {
fType = decoderObj->CNGvar;
if(fType == 1) fType = 0;
} else {
decoderObj->valGainAttenuation = IPP_MAX_16S;
decoderObj->BFIcount = 0;
}
if( fType == 4) {
if(badFrameIndicator != 0) {
LPmode = decoderObj->prevLPmode;
} else {
LPmode = parm[1];
}
if(decoderObj->prevBFI != 0) {
voiceFlag = decoderObj->prevVoiceFlag;
decoderObj->voiceFlag = decoderObj->prevVoiceFlag;
}
ippsWinHybrid_G729E_16s32s(decoderObj->LTPostFilt, BWDacf,
(IppsWinHybridState_G729E_16s*)&decoderObj->hwState);
BWDLagWindow(BWDacf, BWDhighAcf);
if(ippsLevinsonDurbin_G729_32s16s(BWDhighAcf, BWLPCF_DIM, &BWDfiltLPC[BWLPCF1_DIM], BWDrc,&temp) == ippStsOverflow) {
ippsCopy_16s(decoderObj->pPrevBwdLPC,&BWDfiltLPC[BWLPCF1_DIM],BWLPCF1_DIM);
BWDrc[0] = decoderObj->pPrevBwdRC[0];
BWDrc[1] = decoderObj->pPrevBwdRC[1];
} else {
ippsCopy_16s(&BWDfiltLPC[BWLPCF1_DIM],decoderObj->pPrevBwdLPC,BWLPCF1_DIM);
decoderObj->pPrevBwdRC[0] = BWDrc[0];
decoderObj->pPrevBwdRC[1] = BWDrc[1];
}
satFilter = 0;
for(i=BWLPCF1_DIM; i<2*BWLPCF1_DIM; i++) {
if(BWDfiltLPC[i] >= IPP_MAX_16S) {
satFilter = 1;
break;
}
}
if(satFilter == 1) ippsCopy_16s(decoderObj->pBwdLPC2, &BWDfiltLPC[BWLPCF1_DIM], BWLPCF1_DIM);
else ippsCopy_16s(&BWDfiltLPC[BWLPCF1_DIM], decoderObj->pBwdLPC2, BWLPCF1_DIM);
ippsMulPowerC_NR_16s_Sfs(&BWDfiltLPC[BWLPCF1_DIM], N0_98, &BWDfiltLPC[BWLPCF1_DIM], BWLPCF1_DIM, 15);
}
ippsCopy_16s(&decoderObj->LTPostFilt[LP_FRAME_DIM], &decoderObj->LTPostFilt[0], SYNTH_BWD_DIM);
if(LPmode == 1) {
short tmp;
if((decoderObj->interpCoeff2 != 0)) {
tmp = (1<<12) - decoderObj->interpCoeff2;
ippsInterpolateC_G729_16s_Sfs(BWDfiltLPC + BWLPCF1_DIM, tmp,
decoderObj->pBwdLPC, decoderObj->interpCoeff2, BWDfiltLPC + BWLPCF1_DIM, BWLPCF1_DIM, 12);
}
}
if((badFrameIndicator != 0)&&(decoderObj->prevBFI == 0) && (decoderObj->CNGvar >3))
ippsCopy_16s(&BWDfiltLPC[BWLPCF1_DIM],decoderObj->pBwdLPC,BWLPCF1_DIM);
if(fType < 2) {
if(fType == 1) {
LOCAL_ALIGN_ARRAY(32, short, lsfq,LPF_DIM,decoderObj);
sidGain = SIDgain[(int)parm[4]];
ippsLSFDecode_G729B_16s(&parm[1],(Ipp16s*)(decoderObj->prevLSPfreq),lsfq);
ippsLSFToLSP_G729_16s(lsfq,lspSID);
LOCAL_ALIGN_ARRAY_FREE(32, short, lsfq,LPF_DIM,decoderObj);
} else {
if(decoderObj->CNGvar > 1) {
QuantSIDGain_G729B_16s(&decoderObj->SIDflag0, &decoderObj->SIDflag1, 0, &temp, &index2);
sidGain = SIDgain[(int)index2];
}
}
if(decoderObj->CNGvar > 1) {
gainNow = sidGain;
} else {
gainNow = (gainNow * GAIN0 + BWF_HARMONIC)>>15;
gainNow = Add_16s(gainNow, (short)((sidGain * GAIN1 + BWF_HARMONIC)>>15));
}
if(gainNow == 0) {
ippsZero_16s(excitation,LP_FRAME_DIM);
gpVal = 0;
for(subfrIdx = 0; subfrIdx < LP_FRAME_DIM; subfrIdx += LP_SUBFRAME_DIM) {
ippsPhaseDispersionUpdate_G729D_16s(gpVal,gainNow,
(IppsPhaseDispersion_State_G729D*)decoderObj->PhDispMem);
}
} else {
for(i = 0; i < LP_FRAME_DIM; i += LP_SUBFRAME_DIM) {
int invSq;
Ipp16s pG2, tmp, tmp2;
const short *excCached;
LOCAL_ARRAY(Ipp16s, idx, 4, decoderObj);
LOCAL_ARRAY(Ipp16s, pulseSign, 4, decoderObj);
LOCAL_ALIGN_ARRAY(32, Ipp16s, excg, LP_SUBFRAME_DIM, decoderObj);
LOCAL_ARRAY(Ipp16s,tempArray,LP_SUBFRAME_DIM, decoderObj);
RandomCodebookParm_G729B_16s(&decoderObj->seed,idx,pulseSign,&pG2,delayVal);
ippsDecodeAdaptiveVector_G729_16s_I(delayVal,&prevExcitat[i]);
if(decoderObj->CNGidx > CNG_STACK_SIZE-1) { /* not cached */
ippsRandomNoiseExcitation_G729B_16s(&decoderObj->seed,excg,LP_SUBFRAME_DIM);
ippsDotProd_16s32s_Sfs(excg,excg,LP_SUBFRAME_DIM,&invSq,0);
ippsInvSqrt_32s_I(&invSq,1);
excCached=excg;
} else {
decoderObj->seed = cngSeedOut[decoderObj->CNGidx];
invSq = cngInvSqrt[decoderObj->CNGidx];
excCached=&cngCache[decoderObj->CNGidx][0];
decoderObj->CNGidx++;
}
NoiseExcitationFactorization_G729B_16s(excCached,invSq,gainNow,excg,LP_SUBFRAME_DIM);
tmp2 = ComfortNoiseExcitation_G729B_16s_I(excg,idx,pulseSign,gainNow,pG2,&excitation[i],&tmp,tempArray);
if(tmp2 < 0) gpVal = 0;
if(tmp >= 0)
ippsPhaseDispersionUpdate_G729D_16s(gpVal,tmp,
(IppsPhaseDispersion_State_G729D*)decoderObj->PhDispMem);
else
ippsPhaseDispersionUpdate_G729D_16s(gpVal,(short)-tmp,
(IppsPhaseDispersion_State_G729D*)decoderObj->PhDispMem);
LOCAL_ARRAY_FREE(Ipp16s,tempArray,LP_SUBFRAME_DIM, decoderObj);
LOCAL_ALIGN_ARRAY_FREE(32, Ipp16s, excg, LP_SUBFRAME_DIM, decoderObj);
LOCAL_ARRAY_FREE(Ipp16s, pulseSign, 4, decoderObj);
LOCAL_ARRAY_FREE(Ipp16s, idx, 4, decoderObj);
}
}
ippsInterpolate_G729_16s(prevSubfrLSP,lspSID,prevSubfrLSP, LPF_DIM );
ippsLSPToLPC_G729_16s(prevSubfrLSP,&FWDfiltLPC[0]);
ippsLSPToLPC_G729_16s(lspSID,&FWDfiltLPC[LPF_DIM+1]);
ippsCopy_16s(lspSID, prevSubfrLSP, LPF_DIM );
decoderObj->sidGain = sidGain;
decoderObj->gainNow = gainNow;
ppAz = FWDfiltLPC;
for(subfrIdx = 0; subfrIdx < LP_FRAME_DIM; subfrIdx += LP_SUBFRAME_DIM) {
if(SynthesisFilter_G729_16s(ppAz,&excitation[subfrIdx],&synth[subfrIdx],LP_SUBFRAME_DIM,synFltw,20)==
ippStsOverflow) {
/* scale down excitation and redo in case of overflow */
ippsRShiftC_16s_I(2,prevExcitat,L_prevExcitat+LP_FRAME_DIM);
SynthesisFilterOvf_G729_16s(ppAz,&excitation[subfrIdx],&synth[subfrIdx],LP_SUBFRAME_DIM,synFltw,20);
}
ppAz += LPF_DIM+1;
prevFrameDelay[subfrIdx/LP_SUBFRAME_DIM] = decoderObj->prevFrameDelay;
}
decoderObj->betaPreFilter = PITCH_SHARP_MIN;
prevFrameDelay1 = decoderObj->prevFrameDelay;
decoderObj->interpCoeff2_2 = 4506;
decoderObj->BWDFrameCounter = 0;
decoderObj->stat_pitch = 0;
ippsCopy_16s(&FWDfiltLPC[LPF_DIM+1], decoderObj->pPrevFilt, LPF_DIM+1);
ippsZero_16s(&decoderObj->pPrevFilt[LPF_DIM+1], (BWLPCF1_DIM-LPF_DIM-1));
} else {
decoderObj->seed = SEED_INIT;
decoderObj->CNGidx = 0;
parm++;
if(decoderObj->codecType == G729E_CODEC) parm++;
if( LPmode==0 ) {
LOCAL_ARRAY(short, qIndex,4,decoderObj);
qIndex[0] = (parm[0] >> FIR_STAGE_BITS) & 1;
qIndex[1] = (Ipp16s)(parm[0] & (FIR_STAGE - 1));
qIndex[2] = (Ipp16s)((parm[1] >> SEC_STAGE_BITS) & (SEC_STAGE - 1));
qIndex[3] = (Ipp16s)(parm[1] & (SEC_STAGE - 1));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -