📄 hvxcdec.c
字号:
#define LONG64 /* for 64bit platform like IRIX64@R10000(AI 990219) */int IPC_DecParams1st(unsigned char *encBit,float pchmod,int *idVUV2,float (*qLspQueue)[LPCORDER],float *pch2,float (*am2)[SAMPLE/2][3],IdCelp *idCelp2,HvxcDecStatus *HDS) /* in: pointer to decoder status(AI 990129) */{ IdAm idAm; float mfdpch; float tmpQLsp[LPCORDER]; int i, j, k; int idAmS[2], idAmG; int idAm4k[4]; float tmpAm[SAMPLE/2][3]; float *dumLSF = NULL; IdLsp idLsp; int idVUV; int normMode, bitNum;#include "inc_lsp_575.tbl" float min_gap=PAN_MINGAP_PAR; float p_factor=PAN_LSP_AR_R_PAR;#ifdef LONG64 long idx[L_VQ];#endif if(0==HDS->dec_frm) { for(j=0;j<LPCORDER;j++) { HDS->prevQLsp[j] = (float)(j+1)/(float)(LPCORDER+1); } } IPC_UnPackBit2Prm(encBit, &idLsp, &idVUV, &idCelp2[HDS->dec_frm % 2], &mfdpch, &idAm, HDS);#ifdef LONG64 for (i = 0; i < L_VQ; i++) idx[i] = (long)idLsp.nVq[i];#endif pan_lspdec(HDS->prevQLsp, tmpQLsp, p_factor, min_gap, LPCORDER, #ifdef LONG64 idx,#else (long *)idLsp.nVq, #endif lsp_tbl, d_tbl, pd_tbl, dim_1, ncd_1, dim_2, ncd_2, 1, HDS->flagLspPred); if (HDS->decMode == DEC0K) HDS->flagLspPred = 0; else HDS->flagLspPred = 1; /* 98.1.16 */ for(j=0;j<LPCORDER;j++) HDS->prevQLsp[j] = tmpQLsp[j]; if(DEC4K==HDS->decMode || DEC3K==HDS->decMode) { IPC_DecLspEnh(&idLsp, tmpQLsp); } for(j=0;j<LPCORDER;j++) tmpQLsp[j] *= .5; for(j = 0; j < P; j++) { qLspQueue[(HDS->dec_frm + 2) % 4][j] = tmpQLsp[j]; } idVUV2[0] = idVUV2[1]; idVUV2[1] = idVUV; pch2[0] = pch2[1]; pch2[1] = mfdpch; normMode = 0; bitNum = 10; idAmS[0]=idAm.idS0; idAmS[1]=idAm.idS1; idAmG=idAm.idG; if(HDS->decMode == DEC4K || HDS->decMode == DEC3K) { idAm4k[0]=idAm.id4kS0; idAm4k[1]=idAm.id4kS1; idAm4k[2]=idAm.id4kS2; idAm4k[3]=idAm.id4kS3; } harm_sew_dec(tmpAm, &pch2[1], dumLSF, normMode, idVUV2[1], idAmS, bitNum, idAmG, 0, pchmod, idAm4k, HDS); for(j = 0; j < SAMPLE / 2; j++) { for(k = 0; k < 3; k++) { am2[0][j][k] = am2[1][j][k]; } } for(j = 0; j < SAMPLE / 2; j++) { for(k = 0; k < 3; k++) { am2[1][j][k] = tmpAm[j][k]; } } HDS->dec_frm++; return(0);}int IPC_DecParams1stVR(unsigned char *encBit,float pchmod,int *idVUV2,int *bgnFlag2,float (*qLspQueue)[LPCORDER],float *pch2,float (*am2)[SAMPLE/2][3],IdCelp *idCelp2,HvxcDecStatus *HDS) /* in: pointer to decoder status(AI 990129) */{ IdAm idAm; float mfdpch; float tmpQLsp[LPCORDER]; int i, j, k; int idAmS[2], idAmG; int idAm4k[4]; float tmpAm[SAMPLE/2][3]; float *dumLSF = NULL; IdLsp idLsp; int idVUV; int bgnFlag; int normMode, bitNum;#include "inc_lsp_575.tbl" float min_gap=PAN_MINGAP_PAR; float p_factor=PAN_LSP_AR_R_PAR;#ifdef LONG64 long idx[L_VQ];#endif IPC_UnPackBit2PrmVR(encBit, &idLsp, &idVUV, &bgnFlag, &idCelp2[HDS->dec_frm % 2], &mfdpch, &idAm, HDS);#ifdef LONG64 for (i = 0; i < L_VQ; i++) idx[i] = (long)idLsp.nVq[i];#endif pan_lspdec(HDS->prevQLsp, tmpQLsp, p_factor, min_gap, LPCORDER, #ifdef LONG64 idx,#else (long *)idLsp.nVq, #endif lsp_tbl, d_tbl, pd_tbl, dim_1, ncd_1, dim_2, ncd_2, 1, HDS->flagLspPred); if (HDS->decMode == DEC0K) HDS->flagLspPred = 0; else HDS->flagLspPred = 1; if(DEC4K==HDS->decMode) { IPC_DecLspEnh(&idLsp, tmpQLsp); } { if(bgnFlag) { for(i = 0; i < LPCORDER; i++) { tmpQLsp[i] = (HDS->prevQLsp2[i] * (2.0 * BGN_INTVL - 1.0 - 2.0 * HDS->bgnCnt) + HDS->prevQLsp[i] * (1.0 + 2.0 * HDS->bgnCnt)) / (BGN_INTVL * 2.0); } HDS->bgnCnt++; } else { for(i = 0; i < LPCORDER; i++) { HDS->prevQLsp2[i] = HDS->prevQLsp[i]; } for(j = 0; j < LPCORDER; j++) { HDS->prevQLsp[j] = tmpQLsp[j]; } /* check gain of excitations */ if(HDS->bgnCnt == BGN_INTVL) {/* printf("gain %d\n", idCelp2[HDS->dec_frm % 2].idGL0[0]); printf(" %d\n", idCelp2[HDS->dec_frm % 2].idGL0[1]);*/ if(idCelp2[HDS->dec_frm % 2].idGL0[0] <= HDS->prevGainId + 2) { for(j = 0; j < LPCORDER; j++) { tmpQLsp[j] = HDS->prevQLsp2[j]; } } } HDS->bgnCnt = 0; } HDS->prevGainId = idCelp2[HDS->dec_frm % 2].idGL0[1]; } for(j=0;j<LPCORDER;j++) tmpQLsp[j] *= .5; for(j = 0; j < P; j++) { qLspQueue[(HDS->dec_frm + 2) % 4][j] = tmpQLsp[j]; } idVUV2[0] = idVUV2[1]; idVUV2[1] = idVUV; bgnFlag2[0] = bgnFlag2[1]; bgnFlag2[1] = bgnFlag; pch2[0] = pch2[1]; pch2[1] = mfdpch; normMode = 0; bitNum = 10; idAmS[0]=idAm.idS0; idAmS[1]=idAm.idS1; idAmG=idAm.idG; if(HDS->decMode == DEC4K) { idAm4k[0]=idAm.id4kS0; idAm4k[1]=idAm.id4kS1; idAm4k[2]=idAm.id4kS2; idAm4k[3]=idAm.id4kS3; } harm_sew_dec(tmpAm, &pch2[1], dumLSF, normMode, idVUV2[1], idAmS, bitNum, idAmG, 0, pchmod, idAm4k, HDS); for(j = 0; j < SAMPLE / 2; j++) { for(k = 0; k < 3; k++) { am2[0][j][k] = am2[1][j][k]; } } for(j = 0; j < SAMPLE / 2; j++) { for(k = 0; k < 3; k++) { am2[1][j][k] = tmpAm[j][k]; } } HDS->dec_frm++; return(0);}void IPC_DecParams2nd(int fr0,int *idVUV2,float (*qLspQueue)[LPCORDER],IdCelp *idCelp2,float (*qLsp2)[LPCORDER],float (*qRes2)[FRM],HvxcDecStatus *HDS) /* in: pointer to decoder status(AI 990129) */{ int j; int idCelpSL0[N_SFRM_L0], idCelpGL0[N_SFRM_L0]; int idCelpSL1[N_SFRM_L1], idCelpGL1[N_SFRM_L1]; fr0 += 2; for(j = 0; j < P; j++) { qLsp2[0][j] = qLspQueue[(fr0 + 0) % 4][j]; qLsp2[1][j] = qLspQueue[(fr0 + 1) % 4][j]; } for(j = 0; j < N_SFRM_L0; j++) { idCelpSL0[j] = idCelp2[fr0 % 2].idSL0[j]; idCelpGL0[j] = idCelp2[fr0 % 2].idGL0[j]; } if(HDS->decMode == DEC4K || HDS->decMode == DEC3K) { for(j = 0; j < N_SFRM_L1; j++) { idCelpSL1[j] = idCelp2[fr0 % 2].idSL1[j]; idCelpGL1[j] = idCelp2[fr0 % 2].idGL1[j]; } } td_decoder(idVUV2[0], idCelpSL0, idCelpGL0, idCelpSL1, idCelpGL1, qRes2[0], HDS); for(j = 0; j < N_SFRM_L0; j++) { idCelpSL0[j] = idCelp2[(fr0 + 1) % 2].idSL0[j]; idCelpGL0[j] = idCelp2[(fr0 + 1) % 2].idGL0[j]; } if(HDS->decMode == DEC4K || HDS->decMode == DEC3K) { for(j = 0; j < N_SFRM_L1; j++) { idCelpSL1[j] = idCelp2[(fr0 + 1) % 2].idSL1[j]; idCelpGL1[j] = idCelp2[(fr0 + 1) % 2].idGL1[j]; } } td_decoder(idVUV2[1], idCelpSL0, idCelpGL0, idCelpSL1, idCelpGL1, qRes2[1], HDS);}void IPC_DecParams2ndVR(int fr0,int *idVUV2,int *bgnFlag2,float (*qLspQueue)[LPCORDER],IdCelp *idCelp2,float (*qLsp2)[LPCORDER],float (*qRes2)[FRM],HvxcDecStatus *HDS) /* in: pointer to decoder status(AI 990129) */{ int j; int idCelpSL0[N_SFRM_L0], idCelpGL0[N_SFRM_L0]; int idCelpSL1[N_SFRM_L1], idCelpGL1[N_SFRM_L1]; fr0 += 2; for(j = 0; j < P; j++) { qLsp2[0][j] = qLspQueue[(fr0 + 0) % 4][j]; qLsp2[1][j] = qLspQueue[(fr0 + 1) % 4][j]; } for(j = 0; j < N_SFRM_L0; j++) { idCelpSL0[j] = idCelp2[fr0 % 2].idSL0[j]; idCelpGL0[j] = idCelp2[fr0 % 2].idGL0[j]; } if(HDS->decMode == DEC4K) { for(j = 0; j < N_SFRM_L1; j++) { idCelpSL1[j] = idCelp2[fr0 % 2].idSL1[j]; idCelpGL1[j] = idCelp2[fr0 % 2].idGL1[j]; } } td_decoderVR(idVUV2[0], bgnFlag2[0], idCelpSL0, idCelpGL0, idCelpSL1, idCelpGL1, qRes2[0], HDS); for(j = 0; j < N_SFRM_L0; j++) { idCelpSL0[j] = idCelp2[(fr0 + 1) % 2].idSL0[j]; idCelpGL0[j] = idCelp2[(fr0 + 1) % 2].idGL0[j]; } if(HDS->decMode == DEC4K) { for(j = 0; j < N_SFRM_L1; j++) { idCelpSL1[j] = idCelp2[(fr0 + 1) % 2].idSL1[j]; idCelpGL1[j] = idCelp2[(fr0 + 1) % 2].idGL1[j]; } } td_decoderVR(idVUV2[1], bgnFlag2[1], idCelpSL0, idCelpGL0, idCelpSL1, idCelpGL1, qRes2[1], HDS);}void IPC_SynthSC(int idVUV,float *qLsp,float mfdpch,float (*am)[3],float *qRes,short int *frmBuf,HvxcDecStatus *HDS) /* in: pointer to decoder status(AI 990129) */{ int i; int lsUn; float synoutu[SAMPLE-OVERLAP]; float synoutv[SAMPLE-OVERLAP]; float bufsf[FRM]; int tmpIdVUVs[2]; if(HDS->syn_frm == 0) { for(i = 0; i < P; i++) { HDS->qLsps[0][i] = HDS->qLsps[1][i] = qLsp[i]; } HDS->idVUVs[0] = HDS->idVUVs[1] = idVUV; HDS->pchs[0]= HDS->pchs[1]= mfdpch; for(i = 0; i < FRM; i++) { bufsf[i] = 0.0; } } else { for(i = 0; i < P; i++) { HDS->qLsps[0][i] = HDS->qLsps[1][i]; HDS->qLsps[1][i] = qLsp[i]; } HDS->idVUVs[0] = HDS->idVUVs[1]; HDS->idVUVs[1] = idVUV; HDS->pchs[0] = HDS->pchs[1]; HDS->pchs[1] = mfdpch; lsUn=8; if(HDS->varMode == BM_VARIABLE) { tmpIdVUVs[0] = HDS->idVUVs[0]; tmpIdVUVs[1] = HDS->idVUVs[1]; if(tmpIdVUVs[0] == 1) { tmpIdVUVs[0] = 0; } if(tmpIdVUVs[1] == 1) { tmpIdVUVs[1] = 0; } harm_srew_synt(am,HDS->pchs,tmpIdVUVs,HDS->qLsps,lsUn,synoutv,HDS); td_synt(qRes,HDS->idVUVs,HDS->qLsps,synoutu,HDS); } else { harm_srew_synt(am,HDS->pchs,HDS->idVUVs,HDS->qLsps,lsUn,synoutv,HDS); td_synt(qRes,HDS->idVUVs,HDS->qLsps,synoutu,HDS); } for(i=0;i<FRM;i++) bufsf[i]= synoutu[i] + synoutv[i]; if (!(HDS->testMode & TM_POSFIL_DISABLE)) IPC_bpf(bufsf, HDS); } if (HDS->decMode == DEC0K) { if (HDS->muteflag == 0) for (i=0;i<FRM;i++) bufsf[i] *= ((float)(FRM-i)/(float)FRM); else for (i=0;i<FRM;i++) bufsf[i] = 0; HDS->muteflag = 1; } else { if (HDS->muteflag == 1) for (i=0;i<FRM;i++) bufsf[i] *= ((float)i/(float)FRM); HDS->muteflag = 0; } for(i=0;i<FRM;i++) { if(bufsf[i] > 32767.) bufsf[i]=32767.; if(bufsf[i] < -32767.) bufsf[i]= -32767.; frmBuf[i] = (short) bufsf[i]; } HDS->syn_frm++;}void hvxc_decode( HvxcDecStatus *HDS, /* in: pointer to decoder status */ unsigned char *encBit, /* in: bit stream */ float *sampleBuf, /* out: frameNumSample audio samples */ int *frameBufNumSample, /* out: num samples in sampleBuf[] */ float speedFact, /* in: speed change factor */ float pitchFact, /* in: pitch change factor */ int decMode /* in: decode rate mode */){ int i; int dcfrm; float ratio; int idVUV; float mfdpch; float qLsp[LPCORDER]; float am[SAMPLE/2][3]; float qRes[FRM]; short int frmBuf[FRM]; HDS->speedFact = speedFact; HDS->pitchFact = pitchFact; HDS->decMode = decMode; dcfrm = 0; if(HDS->varMode == BM_VARIABLE) { IPC_DecParams1stVR(encBit, 1.0/HDS->pitchFact, HDS->idVUV2, HDS->bgnFlag2, HDS->qLspQueue, HDS->pch2, HDS->am2, HDS->idCelp2, HDS); } else { IPC_DecParams1st(encBit, 1.0/HDS->pitchFact, HDS->idVUV2, HDS->qLspQueue, HDS->pch2, HDS->am2, HDS->idCelp2, HDS); } while(HDS->nbs == HDS->fr0) { if(HDS->varMode == BM_VARIABLE) { IPC_DecParams2ndVR(HDS->fr0-1, HDS->idVUV2, HDS->bgnFlag2, HDS->qLspQueue, HDS->idCelp2, HDS->qLsp2, HDS->qRes2, HDS); } else { IPC_DecParams2nd(HDS->fr0-1, HDS->idVUV2, HDS->qLspQueue, HDS->idCelp2, HDS->qLsp2, HDS->qRes2, HDS); } ratio = HDS->targetP - (float)HDS->fr0 + 1; IPC_InterpolateParams(ratio, HDS->idVUV2, HDS->qLsp2, HDS->pch2, HDS->am2, HDS->qRes2, &idVUV, qLsp, &mfdpch, am, qRes, HDS->testMode); IPC_SynthSC(idVUV, qLsp, mfdpch, am, qRes, frmBuf, HDS); for(i = 0; i < FRM; i++) { sampleBuf[i + FRM * dcfrm] = (float) frmBuf[i]; } /* frm++; HDS->targetP = (float)frm*HDS->speedFact; */ HDS->targetP += HDS->speedFact; HDS->fr0 = (int)ceil(HDS->targetP); /* ratio = HDS->targetP - (float)HDS->fr0 + 1; */ dcfrm++; } HDS->nbs++; *frameBufNumSample = dcfrm * FRM; }void hvxc_decode_free(HvxcDecStatus *HDS) /* in: pointer to decoder status(AI 990129) */{ free(HDS);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -