📄 decg729.c
字号:
return APIG729_StsBadCodecType; } if(decoderObj->objPrm.objSize <= 0) return APIG729_StsNotInitialized; 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] = (Ipp16s)((equality(decoderObj->decPrm[1+3])+decoderObj->decPrm[1+4]) & 0x00000001); /* parity error (1) */ decoderObj->codecType = G729_CODEC; } else if(frametype == 4) { Ipp16s 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] = (Ipp16s)(decoderObj->decPrm[6] + i); decoderObj->decPrm[6] = (Ipp16s)((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] = (Ipp16s)(decoderObj->decPrm[4] + i); decoderObj->decPrm[4] = (Ipp16s)((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); } ippsMove_16s(&decoderObj->LTPostFilt[LP_FRAME_DIM], &decoderObj->LTPostFilt[0], SYNTH_BWD_DIM); if(LPmode == 1) { Ipp16s tmp; if((decoderObj->interpCoeff2 != 0)) { tmp = (Ipp16s)((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, Ipp16s, lsfq,LPF_DIM,decoderObj); sidGain = SIDgain[(Ipp32s)parm[4]]; ippsLSFDecode_G729B_16s(&parm[1],(Ipp16s*)(decoderObj->prevLSPfreq),lsfq); ippsLSFToLSP_G729_16s(lsfq,lspSID); LOCAL_ALIGN_ARRAY_FREE(32, Ipp16s, lsfq,LPF_DIM,decoderObj); } else { if(decoderObj->CNGvar > 1) { QuantSIDGain_G729B_16s(&decoderObj->SIDflag0, &decoderObj->SIDflag1, 0, &temp, &index2); sidGain = SIDgain[(Ipp32s)index2]; } } if(decoderObj->CNGvar > 1) { gainNow = sidGain; } else { gainNow = (Ipp16s)((gainNow * GAIN0 + BWF_HARMONIC)>>15); gainNow = Add_16s(gainNow, (Ipp16s)((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((Ipp16s)gpVal, gainNow, (IppsPhaseDispersion_State_G729D*)decoderObj->PhDispMem); } } else { for(i = 0; i < LP_FRAME_DIM; i += LP_SUBFRAME_DIM) { Ipp32s invSq; Ipp16s pG2, tmp, tmp2; const Ipp16s *excCached; LOCAL_ARRAY(Ipp16s, IdxVec, 4, decoderObj); LOCAL_ARRAY(Ipp16s, pulseSignVec, 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,IdxVec,pulseSignVec,&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 = (Ipp16s)ComfortNoiseExcitation_G729B_16s_I(excg,IdxVec,pulseSignVec,gainNow,pG2,&excitation[i],&tmp,tempArray); if(tmp2 < 0) gpVal = 0; if(tmp >= 0) ippsPhaseDispersionUpdate_G729D_16s((Ipp16s)gpVal,tmp, (IppsPhaseDispersion_State_G729D*)decoderObj->PhDispMem); else ippsPhaseDispersionUpdate_G729D_16s((Ipp16s)gpVal,(Ipp16s)-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, pulseSignVec, 4, decoderObj); LOCAL_ARRAY_FREE(Ipp16s, IdxVec, 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; } 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(Ipp16s, qIndex,4,decoderObj);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -