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

📄 sbrside.c

📁 nds上大名鼎鼎的DSOrganize 2.8最新源代码。很值得研究。
💻 C
📖 第 1 页 / 共 2 页
字号:
		border += relBordLead[rel++];		sbrGrid->envTimeBorder[env] = border * SAMPLES_PER_SLOT;	}	rel = 0;	border = absBordTrail;	for (env = sbrGrid->numEnv - 1; env > numRelLead; env--) {		border -= relBordTrail[rel++];		sbrGrid->envTimeBorder[env] = border * SAMPLES_PER_SLOT;	}	sbrGrid->envTimeBorder[sbrGrid->numEnv] = absBordTrail * SAMPLES_PER_SLOT;	if (sbrGrid->numEnv > 1) {		sbrGrid->numNoiseFloors = 2;		sbrGrid->noiseTimeBorder[0] = sbrGrid->envTimeBorder[0];		sbrGrid->noiseTimeBorder[1] = sbrGrid->envTimeBorder[middleBorder];		sbrGrid->noiseTimeBorder[2] = sbrGrid->envTimeBorder[sbrGrid->numEnv];	} else {		sbrGrid->numNoiseFloors = 1;		sbrGrid->noiseTimeBorder[0] = sbrGrid->envTimeBorder[0];		sbrGrid->noiseTimeBorder[1] = sbrGrid->envTimeBorder[1];	}}/************************************************************************************** * Function:    UnpackDeltaTimeFreq * * Description: unpack time/freq flags for delta coding of SBR envelopes (table 4.63) * * Inputs:      BitStreamInfo struct pointing to start of dt/df flags *              number of envelopes *              number of noise floors *  * Outputs:     delta flags for envelope and noise floors * * Return:      none **************************************************************************************/static void UnpackDeltaTimeFreq(BitStreamInfo *bsi, int numEnv, unsigned char *deltaFlagEnv, 								int numNoiseFloors, unsigned char *deltaFlagNoise){	int env, noiseFloor;	for (env = 0; env < numEnv; env++)		deltaFlagEnv[env] = GetBits(bsi, 1);	for (noiseFloor = 0; noiseFloor < numNoiseFloors; noiseFloor++)		deltaFlagNoise[noiseFloor] = GetBits(bsi, 1);}/************************************************************************************** * Function:    UnpackInverseFilterMode * * Description: unpack invf flags for chirp factor calculation (table 4.64) * * Inputs:      BitStreamInfo struct pointing to start of invf flags *              number of noise floor bands *  * Outputs:     invf flags for noise floor bands * * Return:      none **************************************************************************************/static void UnpackInverseFilterMode(BitStreamInfo *bsi, int numNoiseFloorBands, unsigned char *mode){	int n;		for (n = 0; n < numNoiseFloorBands; n++)		mode[n] = GetBits(bsi, 2);}/************************************************************************************** * Function:    UnpackSinusoids * * Description: unpack sinusoid (harmonic) flags for each SBR subband (table 4.67) * * Inputs:      BitStreamInfo struct pointing to start of sinusoid flags *              number of high resolution SBR subbands (nHigh) *  * Outputs:     sinusoid flags for each SBR subband, zero-filled above nHigh * * Return:      none **************************************************************************************/static void UnpackSinusoids(BitStreamInfo *bsi, int nHigh, int addHarmonicFlag, unsigned char *addHarmonic){	int n;	n = 0;	if (addHarmonicFlag) {		for (  ; n < nHigh; n++)			addHarmonic[n] = GetBits(bsi, 1);	}	/* zero out unused bands */	for (     ; n < MAX_QMF_BANDS; n++)		addHarmonic[n] = 0;}/************************************************************************************** * Function:    CopyCouplingGrid * * Description: copy grid parameters from left to right for channel coupling * * Inputs:      initialized SBRGrid struct for left channel *  * Outputs:     initialized SBRGrid struct for right channel * * Return:      none **************************************************************************************/static void CopyCouplingGrid(SBRGrid *sbrGridLeft, SBRGrid *sbrGridRight){	int env, noiseFloor;	sbrGridRight->frameClass =     sbrGridLeft->frameClass;	sbrGridRight->ampResFrame =    sbrGridLeft->ampResFrame;	sbrGridRight->pointer =        sbrGridLeft->pointer;	sbrGridRight->numEnv =         sbrGridLeft->numEnv;	for (env = 0; env < sbrGridLeft->numEnv; env++) {		sbrGridRight->envTimeBorder[env] = sbrGridLeft->envTimeBorder[env];		sbrGridRight->freqRes[env] =       sbrGridLeft->freqRes[env];	}	sbrGridRight->envTimeBorder[env] = sbrGridLeft->envTimeBorder[env];	/* borders are [0, numEnv] inclusive */	sbrGridRight->numNoiseFloors = sbrGridLeft->numNoiseFloors;	for (noiseFloor = 0; noiseFloor <= sbrGridLeft->numNoiseFloors; noiseFloor++)		sbrGridRight->noiseTimeBorder[noiseFloor] = sbrGridLeft->noiseTimeBorder[noiseFloor];	/* numEnvPrev, numNoiseFloorsPrev, freqResPrev are updated in DecodeSBREnvelope() and DecodeSBRNoise() */}/************************************************************************************** * Function:    CopyCouplingInverseFilterMode * * Description: copy invf flags from left to right for channel coupling * * Inputs:      invf flags for left channel *              number of noise floor bands *  * Outputs:     invf flags for right channel * * Return:      none **************************************************************************************/static void CopyCouplingInverseFilterMode(int numNoiseFloorBands, unsigned char *modeLeft, unsigned char *modeRight){	int band;	for (band = 0; band < numNoiseFloorBands; band++)		modeRight[band] = modeLeft[band];}/************************************************************************************** * Function:    UnpackSBRSingleChannel * * Description: unpack sideband info (grid, delta flags, invf flags, envelope and  *                noise floor configuration, sinusoids) for a single channel * * Inputs:      BitStreamInfo struct pointing to start of sideband info *              initialized PSInfoSBR struct (after parsing SBR header and building *                frequency tables) *              base output channel (range = [0, nChans-1]) *  * Outputs:     updated PSInfoSBR struct (SBRGrid and SBRChan) * * Return:      none **************************************************************************************/void UnpackSBRSingleChannel(BitStreamInfo *bsi, PSInfoSBR *psi, int chBase){	int bitsLeft;	SBRHeader *sbrHdr = &(psi->sbrHdr[chBase]);	SBRGrid *sbrGridL = &(psi->sbrGrid[chBase+0]);	SBRFreq *sbrFreq =  &(psi->sbrFreq[chBase]);	SBRChan *sbrChanL = &(psi->sbrChan[chBase+0]);	psi->dataExtra = GetBits(bsi, 1);	if (psi->dataExtra)		psi->resBitsData = GetBits(bsi, 4);	UnpackSBRGrid(bsi, sbrHdr, sbrGridL);	UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise);	UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]);	DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0);	DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0);	sbrChanL->addHarmonicFlag[1] = GetBits(bsi, 1);	UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanL->addHarmonicFlag[1], sbrChanL->addHarmonic[1]);		psi->extendedDataPresent = GetBits(bsi, 1);	if (psi->extendedDataPresent) {		psi->extendedDataSize = GetBits(bsi, 4);		if (psi->extendedDataSize == 15)			psi->extendedDataSize += GetBits(bsi, 8);		bitsLeft = 8 * psi->extendedDataSize;		/* get ID, unpack extension info, do whatever is necessary with it... */		while (bitsLeft > 0) {			GetBits(bsi, 8);			bitsLeft -= 8;		}	}}/************************************************************************************** * Function:    UnpackSBRChannelPair * * Description: unpack sideband info (grid, delta flags, invf flags, envelope and  *                noise floor configuration, sinusoids) for a channel pair * * Inputs:      BitStreamInfo struct pointing to start of sideband info *              initialized PSInfoSBR struct (after parsing SBR header and building *                frequency tables) *              base output channel (range = [0, nChans-1]) *  * Outputs:     updated PSInfoSBR struct (SBRGrid and SBRChan for both channels) * * Return:      none **************************************************************************************/void UnpackSBRChannelPair(BitStreamInfo *bsi, PSInfoSBR *psi, int chBase){	int bitsLeft;	SBRHeader *sbrHdr = &(psi->sbrHdr[chBase]);	SBRGrid *sbrGridL = &(psi->sbrGrid[chBase+0]), *sbrGridR = &(psi->sbrGrid[chBase+1]);	SBRFreq *sbrFreq =  &(psi->sbrFreq[chBase]);	SBRChan *sbrChanL = &(psi->sbrChan[chBase+0]), *sbrChanR = &(psi->sbrChan[chBase+1]);	psi->dataExtra = GetBits(bsi, 1);	if (psi->dataExtra) {		psi->resBitsData = GetBits(bsi, 4);		psi->resBitsData = GetBits(bsi, 4);	}	psi->couplingFlag = GetBits(bsi, 1);	if (psi->couplingFlag) {		UnpackSBRGrid(bsi, sbrHdr, sbrGridL);		CopyCouplingGrid(sbrGridL, sbrGridR);		UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise);		UnpackDeltaTimeFreq(bsi, sbrGridR->numEnv, sbrChanR->deltaFlagEnv, sbrGridR->numNoiseFloors, sbrChanR->deltaFlagNoise);		UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]);		CopyCouplingInverseFilterMode(sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1], sbrChanR->invfMode[1]);				DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0);		DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0);		DecodeSBREnvelope(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1);		DecodeSBRNoise(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1);		/* pass RIGHT sbrChan struct */		UncoupleSBREnvelope(psi, sbrGridL, sbrFreq, sbrChanR);		UncoupleSBRNoise(psi, sbrGridL, sbrFreq, sbrChanR);	} else {		UnpackSBRGrid(bsi, sbrHdr, sbrGridL);		UnpackSBRGrid(bsi, sbrHdr, sbrGridR);		UnpackDeltaTimeFreq(bsi, sbrGridL->numEnv, sbrChanL->deltaFlagEnv, sbrGridL->numNoiseFloors, sbrChanL->deltaFlagNoise);		UnpackDeltaTimeFreq(bsi, sbrGridR->numEnv, sbrChanR->deltaFlagEnv, sbrGridR->numNoiseFloors, sbrChanR->deltaFlagNoise);		UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanL->invfMode[1]);		UnpackInverseFilterMode(bsi, sbrFreq->numNoiseFloorBands, sbrChanR->invfMode[1]);		DecodeSBREnvelope(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0);		DecodeSBREnvelope(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1);		DecodeSBRNoise(bsi, psi, sbrGridL, sbrFreq, sbrChanL, 0);		DecodeSBRNoise(bsi, psi, sbrGridR, sbrFreq, sbrChanR, 1);	}	sbrChanL->addHarmonicFlag[1] = GetBits(bsi, 1);	UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanL->addHarmonicFlag[1], sbrChanL->addHarmonic[1]);	sbrChanR->addHarmonicFlag[1] = GetBits(bsi, 1);	UnpackSinusoids(bsi, sbrFreq->nHigh, sbrChanR->addHarmonicFlag[1], sbrChanR->addHarmonic[1]);	psi->extendedDataPresent = GetBits(bsi, 1);	if (psi->extendedDataPresent) {		psi->extendedDataSize = GetBits(bsi, 4);		if (psi->extendedDataSize == 15)			psi->extendedDataSize += GetBits(bsi, 8);		bitsLeft = 8 * psi->extendedDataSize;		/* get ID, unpack extension info, do whatever is necessary with it... */		while (bitsLeft > 0) {			GetBits(bsi, 8);			bitsLeft -= 8;		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -