⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hvxcdec.c

📁 C写的MPEG4音频源代码(G.723/G.729)
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -