📄 dec_par.c
字号:
max(DPdelayNumSample-ILdelayNumSample,DPdelayNumSample-HVXdelayNumSample); if (CommonFreeAlloc((void**)&tmpSampleBuf, *frameMaxNumSample*sizeof(float)) == NULL) CommonExit(1,"DecParInit: memory allocation error"); if (CommonFreeAlloc((void**)&mixSampleBuf, mixSampleBufSize*sizeof(float)) == NULL) CommonExit(1,"DecParInit: memory allocation error"); for (i=0; i<mixSampleBufSize; i++) mixSampleBuf[i] = 0; if (DPdebugLevel >= 1) { printf("DecParInit: encDlyMode=%d vrMode=%d rateMode=%d\n", DPdelayMode,DPvarMode,DPrateMode); printf("DecParInit: dly=%d frm=%d mixBuf=%d ILdly=%d HVXdly=%d\n", DPframeMaxNumSample,DPdelayNumSample, mixSampleBufSize,ILdelayNumSample,HVXdelayNumSample); }}/* DecParFrame() *//* Decode one bit stream frame into one audio frame with *//* parametric decoder core. */void DecParFrame ( BsBitBuffer *bitBuf, /* in: bit stream frame */ float **sampleBuf, /* out: audio frame samples */ /* sampleBuf[numChannel][frameNumSample] */ int *usedNumBit, /* out: num bits used for this frame */ int *frameBufNumSample, /* out: num samples in sampleBuf[][] */ float speedFact, /* in: speed change factor (AI 990209) */ float pitchFact /* in: pitch change factor (AI 990209) */ ){ BsBitStream *stream; unsigned int il_hvxc; int i; int hvxcFrame1; if (DPdebugLevel >= 1) { printf("DecParFrame: availNum=%ld\n",BsBufferNumBit(bitBuf)); printf("DecParFrame: speedFact=%f pitchFact=%f\n", speedFact,pitchFact); } stream = BsOpenBufferRead(bitBuf); switch (DPmode) { case MODEPAR_HVX: DecParFrameHvx(stream,sampleBuf[0],frameBufNumSample,speedFact,pitchFact ); break; } *usedNumBit = BsCurrentBit(stream); BsCloseRemove(stream,1); if (DPdebugLevel >= 1) printf("DecParFrame: numBit=%d numSample=%d\n", *usedNumBit,*frameBufNumSample);}/* DecParFree() *//* Free memory allocated by parametric decoder core. */void DecParFree (){ if (DPdebugLevel >= 1) printf("DecParFree: ...\n"); if (!DPfree) return; if (DPmode != MODEPAR_IL) DecParFreeHvx();}/* DecHvxcInitNew() *//* Init HVXC decoder core for system interface(AI 99060X) */HvxcDecStatus *DecHvxcInitNew ( char *decPara, /* in: decoder parameter string */ FRAME_DATA *fD, /* in: system interface */ int layer /* in: number of layer */ ){ int i; int parac; char **parav; int result; BsBitBuffer *bitHeader; BsBitStream *hdrStream; AUDIO_SPECIFIC_CONFIG* audSpC; int numChannel; float fSample; float bitRate; HvxcDecStatus *hvxcD; sysFlag = 1; /* use system interface(flexmux) */ /* evalute decoder parameter string */ parav = CmdLineParseString(decPara,SEPACHAR,¶c); result = CmdLineEval(parac,parav,NULL,switchList,1,NULL); if (result) { if (result==1) { DecParInfo(stdout); exit (1); } else CommonExit(1,"decoder parameter string error"); } audSpC = &fD->od->ESDescriptor[layer]->DecConfigDescr.audioSpecificConfig; switch (audSpC->channelConfiguration.value) { case 1 :numChannel=1; break; default: CommonExit(1,"wrong channel config"); } bitRate = fD->od->ESDescriptor[layer]->DecConfigDescr.avgBitrate.value; if (fD->od->ESDescriptor[layer]->DecConfigDescr.audioSpecificConfig.samplingFreqencyIndex.value != 11) { CommonExit(1,"illegal sampling frequency config"); } else { fSample = 8000.0f; } if (DPdebugLevel >= 1) { printf("DecHvxcInit: numChannel=%d fSample=%f bitRate=%f\n", numChannel,fSample,bitRate); printf("DecHvxcInit: decPara=\"%s\"\n", decPara); printf("DecHvxcInit: debugLevel=%d\n", DPdebugLevel); if (DPtestMode != TM_NORMAL) { printf("DecHvxcInit: test_mode=%x(for HVXC decoder conformance testing)\n", DPtestMode); if (DPtestMode & TM_POSFIL_DISABLE) { printf(" - postfilter and post processing are skipped.\n"); } if (DPtestMode & TM_INIT_PHASE_ZERO) { printf(" - initial values of harmonic phase are reset to zeros.\n"); } if (DPtestMode & TM_NOISE_ADD_DISABLE) { printf(" - noise component addition are disabled.\n"); } if (DPtestMode & TM_VXC_DISABLE) { printf(" - the output of Time Domain Decoder is disabled.\n"); } } } if (numChannel != 1) CommonExit(1,"DecHvxcInit:audio data has more the one channel (%d)", numChannel); CmdLineParseFree(parav); DPfSample = fSample; DPbitRate = bitRate; if (sysFlag) { DPvarMode = audSpC->specConf.hvxcSpecificConfig.HVXCvarMode.value; DPrateMode = audSpC->specConf.hvxcSpecificConfig.HVXCrateMode.value; DPextensionFlag = audSpC->specConf.hvxcSpecificConfig.extensionFlag.value; } else { /* not necessary any more ? */ hdrStream = BsOpenBufferRead(bitHeader); if (BsGetBitInt(hdrStream,(unsigned int*)&DPvarMode,1)) CommonExit(1,"DecHvxcInit: error reading bit stream header"); if (BsGetBitInt(hdrStream,(unsigned int*)&DPrateMode,2)) CommonExit(1,"DecHvxcInit: error reading bit stream header"); if (BsGetBitInt(hdrStream,(unsigned int*)&DPextensionFlag,1)) CommonExit(1,"DecHvxcInit: error reading bit stream header"); BsClose(hdrStream); } DPframeMaxNumSample = 160 * (int) ceil(1.0 / MINSPEEDFACT); if (DPdelayMode == DM_LONG) /* HP 971023 */ DPdelayNumSample = 80; /* 10 ms */ else DPdelayNumSample = 60; /* 7.5 ms */ hvxcD = hvxc_decode_init(DPvarMode, DPrateMode, DPextensionFlag, DPdelayMode, DPtestMode); hvxcD->frameNumSample = DPframeMaxNumSample; hvxcD->delayNumSample = DPdelayNumSample; if (DPdebugLevel >= 1) { printf("DecHvxcInitNew: decDlyMode=%d vrMode=%d rateMode=%d\n", DPdelayMode,DPvarMode,DPrateMode); } if ((hvxcD->sampleBuf=(float**)malloc(numChannel*sizeof(float*)))==NULL) CommonExit(1,"DecHvxcInitNew: memory allocation error"); for (i=0; i<numChannel; i++) if ((hvxcD->sampleBuf[i]=(float*)malloc(DPframeMaxNumSample*sizeof(float)))==NULL) CommonExit(1,"DecHvxcInitNew: memory allocation error"); return(hvxcD);}/* DecHvxcInit() *//* Init parametric decoder core. */HvxcDecStatus *DecHvxcInit ( int numChannel, /* in: num audio channels */ float fSample, /* in: sampling frequency [Hz] */ float bitRate, /* in: total bit rate [bit/sec] */ char *decPara, /* in: decoder parameter string */ BsBitBuffer *bitHeader, /* in: header from bit stream */ int *frameMaxNumSample, /* out: max num samples per frame */ int *delayNumSample /* out: decoder delay (num samples) */ ){ int parac; char **parav; int result; BsBitStream *hdrStream; HvxcDecStatus *hvxcD; /* evalute decoder parameter string */ parav = CmdLineParseString(decPara,SEPACHAR,¶c); result = CmdLineEval(parac,parav,NULL,switchList,1,NULL); if (result) { if (result==1) { DecParInfo(stdout); exit (1); } else CommonExit(1,"decoder parameter string error"); } if (DPdebugLevel >= 1) { printf("DecHvxcInit: numChannel=%d fSample=%f bitRate=%f\n", numChannel,fSample,bitRate); printf("DecHvxcInit: decPara=\"%s\"\n", decPara); printf("DecHvxcInit: debugLevel=%d\n", DPdebugLevel); if (DPtestMode != TM_NORMAL) { printf("DecHvxcInit: test_mode=%x(for HVXC decoder conformance testing)\n", DPtestMode); if (DPtestMode & TM_POSFIL_DISABLE) { printf(" - postfilter and post processing are skipped.\n"); } if (DPtestMode & TM_INIT_PHASE_ZERO) { printf(" - initial values of harmonic phase are reset to zeros.\n"); } if (DPtestMode & TM_NOISE_ADD_DISABLE) { printf(" - noise component addition are disabled.\n"); } if (DPtestMode & TM_VXC_DISABLE) { printf(" - the output of Time Domain Decoder is disabled.\n"); } } } if (numChannel != 1) CommonExit(1,"DecHvxcInit: audio data has more the one channel (%d)", numChannel); CmdLineParseFree(parav); DPfSample = fSample; DPbitRate = bitRate; hdrStream = BsOpenBufferRead(bitHeader); if (BsGetBitInt(hdrStream,(unsigned int*)&DPvarMode,1)) CommonExit(1,"DecHvxcInit: error reading bit stream header"); if (BsGetBitInt(hdrStream,(unsigned int*)&DPrateMode,2)) CommonExit(1,"DecHvxcInit: error reading bit stream header"); if (BsGetBitInt(hdrStream,(unsigned int*)&DPextensionFlag,1)) CommonExit(1,"DecHvxcInit: error reading bit stream header"); DPframeMaxNumSample = 160 * (int) ceil(1.0 / MINSPEEDFACT); if (DPdelayMode == DM_LONG) /* HP 971023 */ DPdelayNumSample = 80; /* 10 ms */ else DPdelayNumSample = 60; /* 7.5 ms */ hvxcD = hvxc_decode_init(DPvarMode, DPrateMode, DPextensionFlag, DPdelayMode, DPtestMode); BsClose(hdrStream); *frameMaxNumSample = DPframeMaxNumSample; *delayNumSample = DPdelayNumSample; if (DPdebugLevel >= 1) { printf("DecHvxcInit: decDlyMode=%d vrMode=%d rateMode=%d\n", DPdelayMode,DPvarMode,DPrateMode); } return(hvxcD);}/* DecHvxcFrame() *//* Decode one bit stream frame into one audio frame with *//* HVXC decoder core. */void DecHvxcFrame ( HvxcDecStatus *hvxcD, /* in: HVXC decoder status handle */ BsBitBuffer *bitBuf, /* in: bit stream frame */ float **sampleBuf, /* out: audio frame samples */ /* sampleBuf[numChannel][frameNumSample] */ int *usedNumBit, /* out: num bits used for this frame */ int *frameBufNumSample, /* out: num samples in sampleBuf[][] */ float speedFact, /* in: speed change factor(AI 990127) */ float pitchFact /* in: pitch change factor(AI 990127) */ ){ BsBitStream *stream; int i, j; unsigned char tmpIdVUV; unsigned char tmpEncBit; unsigned char encBit[10]; if (DPdebugLevel >= 1) printf("DecHvxcFrame: availNum=%ld\n",BsBufferNumBit(bitBuf)); if (speedFact<MINSPEEDFACT) { speedFact = MINSPEEDFACT; CommonWarning("DecParFrameIl: speedFact below %f",MINSPEEDFACT); } stream = BsOpenBufferRead(bitBuf); if (DPdebugLevel >= 2) { printf("DecHvxcFrame: stream=%s\n",stream?"valid":"NULL"); printf("DecHvxcFrame: decMode="); switch (DPrateMode) { case DEC0K : printf("DEC0K\n"); break; case DEC2K : printf("DEC2K\n"); break; case DEC3K : printf("DEC3K\n"); break; case DEC4K : printf("DEC4K\n"); break; default : printf("ERROR!!!\n"); } } for (i = 0; i < 5; i++) encBit[i] = 0; if (DPrateMode == DEC4K || DPrateMode == DEC3K) /* Modified on 07/04/97 by Y.Maeda */ { { for(j = 0; j < 9; j++) if(BsGetBitChar(stream, &encBit[j], 8)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); if (DPrateMode == DEC4K) { if(BsGetBitChar(stream, &encBit[9], 8)) /* MN 971106 */ CommonExit(1,"DecParFrameHvx: error reading bit stream"); } else { /* MN 971107 */ if(BsGetBitChar(stream, &tmpEncBit, 8-6)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); encBit[9] = (tmpEncBit & 0x3) << 6; } } } else if(DPrateMode == DEC2K) { if(DPvarMode == BM_VARIABLE) { if(BsGetBitChar(stream, &tmpIdVUV, 2)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); encBit[0] = (tmpIdVUV << 6) & 0xc0; /* HP 971111 */ if (DPdebugLevel >= 2) printf("DecHvxcFrame: tmpIdVUV=%d\n", tmpIdVUV); switch(tmpIdVUV) { case 0: if(BsGetBitChar(stream, &tmpEncBit, 6)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); encBit[0] |= (tmpEncBit & 0x3f); for(j = 1; j < 3; j++) if(BsGetBitChar(stream, &encBit[j], 8)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); if(BsGetBitChar(stream, &tmpEncBit, 4)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); encBit[3] = (tmpEncBit & 0xf) << 4; if (sysFlag) { /* when system interface(flexmux) is used, data is byte aligned, */ /* then extra reading is necessary(AI 990616) */ if(BsGetBitChar(stream, &tmpEncBit, 4)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); } break; case 1: /*** reading padded bits necessary(AI 990528) ***/ if(BsGetBitChar(stream, &tmpEncBit, 6)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); break; case 2: case 3: if(BsGetBitChar(stream, &tmpEncBit, 6)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); encBit[0] |= (tmpEncBit & 0x3f); for(j = 1; j < 5; j++) if(BsGetBitChar(stream, &encBit[j], 8)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); break; } } else /* DPvarMode == BM_CONSTANT */ { for(j = 0; j < 5; j++) if(BsGetBitChar(stream, &encBit[j], 8)) CommonExit(1,"DecParFrameHvx: error reading bit stream"); } }/* scalable mode (YM 990730) */ if (DPbitRate == 2000.0) DPdecMode = DEC2K; else DPdecMode = DPrateMode; hvxc_decode(hvxcD, encBit, sampleBuf[0], frameBufNumSample, speedFact, pitchFact, DPdecMode /* DPrateMode : scalability (YM 990730) */ ); *usedNumBit = BsCurrentBit(stream); BsCloseRemove(stream,1); if (DPdebugLevel >= 1) printf("DecHvxcFrame: numBit=%d numSample=%d\n", *usedNumBit,*frameBufNumSample);}/* DecParFree() *//* Free memory allocated by parametric decoder core. */void DecHvxcFree(HvxcDecStatus *hvxcD /* in: HVXC decoder status handle */) { if (DPdebugLevel >= 1) printf("DecHvxcFree: ...\n"); if (sysFlag) { free( hvxcD->sampleBuf[0] ); free( hvxcD->sampleBuf ); } hvxc_decode_free(hvxcD);}/* end of dec_par.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -