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

📄 errdec.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	if (pmbmd->m_dctMd == INTRAQ)	{		Int iDQUANT = m_pbitstrmIn->getBits (2);		switch (iDQUANT) {		case 0:			pmbmd->m_intStepDelta = -1;			break;		case 1:			pmbmd->m_intStepDelta = -2;			break;		case 2:			pmbmd->m_intStepDelta = 1;			break;		case 3:			pmbmd->m_intStepDelta = 2;			break;		default:			assert (FALSE);		}		iCurrentQP += pmbmd->m_intStepDelta;		Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;		iCurrentQP = checkrange (iCurrentQP, 1, iQuantMax);	}	pmbmd->m_stepSize = iCurrentQP;	assert (pmbmd != NULL);	if (pmbmd -> m_rgTranspStatus [0] == ALL) 		return;	assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);	setDCVLCMode(pmbmd, pbRestart);		if (!pmbmd->m_bCodeDcAsAc)	{		for (iBlk = Y_BLOCK1; iBlk < U_BLOCK; iBlk++) {			if (pmbmd->m_rgTranspStatus [iBlk] != ALL)				piIntraDC[iBlk - 1] = decodeIntraDCmpeg (1);			}		for (iBlk = U_BLOCK; iBlk <= V_BLOCK; iBlk++) {			piIntraDC[iBlk - 1] = decodeIntraDCmpeg (0);		}	}}Void CVideoObjectDecoder::decodeMBTextureHeadOfIVOP_DataPartitioning (CMBMode* pmbmd, Int* piMCBPC){	assert (pmbmd->m_rgTranspStatus [0] != ALL);	Int iBlk = 0, cNonTrnspBlk = 0;	for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {		if (pmbmd->m_rgTranspStatus [iBlk] != ALL)				cNonTrnspBlk++;	}	Int iCBPC = 0;	Int iCBPY = 0;	pmbmd->m_dctMd = INTRA;	pmbmd->m_bSkip = FALSE; //reset for direct mode 	if (*piMCBPC > 3)		pmbmd->m_dctMd = INTRAQ;	pmbmd->m_bMCSEL = FALSE; //reset for direct mode	iCBPC = *piMCBPC % 4;	pmbmd->m_bACPrediction = m_pbitstrmIn->getBits (1);	switch (cNonTrnspBlk) {	case 1:		iCBPY = m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();		break;	case 2:		iCBPY = m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();		break;	case 3:		iCBPY = m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();		break;	case 4:		iCBPY = m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();		break;	default:		assert (FALSE);	}	setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);}Bool CVideoObjectDecoder::decodeMBTextureModeOfPVOP_DataPartitioning (CMBMode* pmbmd, Int* piMCBPC){	pmbmd->m_bSkip = m_pbitstrmIn->getBits (1);	if (!pmbmd->m_bSkip) {		*piMCBPC = m_pentrdecSet->m_pentrdecMCBPCinter->decodeSymbol ();		assert (*piMCBPC >= 0 && *piMCBPC <= 20);					if (*piMCBPC == 20)			return TRUE; // stuffing		Int iMBtype = *piMCBPC / 4;					//per H.263's MBtype		switch (iMBtype) {					case 0:			pmbmd->m_dctMd = INTER;			pmbmd->m_bhas4MVForward = FALSE;			break;		case 1:			pmbmd->m_dctMd = INTERQ;			pmbmd->m_bhas4MVForward = FALSE;			break;		case 2:			pmbmd->m_dctMd = INTER;			pmbmd->m_bhas4MVForward = TRUE;			break;		case 3:			pmbmd->m_dctMd = INTRA;			break;		case 4:			pmbmd->m_dctMd = INTRAQ;			break;		default:			assert (FALSE);		}				pmbmd->m_bMCSEL = FALSE;		if((pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ) && (pmbmd -> m_bhas4MVForward == FALSE) && (m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE))			pmbmd->m_bMCSEL = m_pbitstrmIn->getBits (1);	} else	{									//skipped		pmbmd->m_dctMd = INTER;		pmbmd->m_bhas4MVForward = FALSE;		pmbmd->m_bMCSEL = FALSE;		if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)			pmbmd -> m_bMCSEL = TRUE;	}	return FALSE;}Void CVideoObjectDecoder::decodeMBTextureHeadOfPVOP_DataPartitioning (CMBMode* pmbmd, Int& iCurrentQP, Int* piMCBPC,																	  Int* piIntraDC, Bool *pbRestart){	assert (pmbmd->m_rgTranspStatus [0] != ALL);	Int iBlk = 0, cNonTrnspBlk = 0;	for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int) Y_BLOCK4; iBlk++) {		if (pmbmd->m_rgTranspStatus [iBlk] != ALL)				cNonTrnspBlk++;	}	Int iCBPC = 0;	Int iCBPY = 0;	if (!pmbmd->m_bSkip) {	  //		Int iMBtype = *piMCBPC / 4;					//per H.263's MBtype		iCBPC = *piMCBPC % 4;		if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)	{			pmbmd->m_bACPrediction = m_pbitstrmIn->getBits (1);			switch (cNonTrnspBlk) {			case 1:				iCBPY = m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();				break;			case 2:				iCBPY = m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();				break;			case 3:				iCBPY = m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();				break;			case 4:				iCBPY = m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();				break;			default:				assert (FALSE);			}		}		else {			switch (cNonTrnspBlk) {			case 1:				iCBPY = 1 - m_pentrdecSet->m_pentrdecCBPY1->decodeSymbol ();				break;			case 2:				iCBPY = 3 - m_pentrdecSet->m_pentrdecCBPY2->decodeSymbol ();				break;			case 3:				iCBPY = 7 - m_pentrdecSet->m_pentrdecCBPY3->decodeSymbol ();				break;			case 4:				iCBPY = 15 - m_pentrdecSet->m_pentrdecCBPY->decodeSymbol ();				break;			default:				assert (FALSE);			}		}		assert (iCBPY >= 0 && iCBPY <= 15);				}	else	{									//skipped		pmbmd->m_dctMd = INTER;		pmbmd->m_bhas4MVForward = FALSE;	}	setCBPYandC (pmbmd, iCBPC, iCBPY, cNonTrnspBlk);		pmbmd->m_intStepDelta = 0;	if (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ) {		Int iDQUANT = m_pbitstrmIn->getBits (2);		switch (iDQUANT) {		case 0:			pmbmd->m_intStepDelta = -1;			break;		case 1:			pmbmd->m_intStepDelta = -2;			break;		case 2:			pmbmd->m_intStepDelta = 1;			break;		case 3:			pmbmd->m_intStepDelta = 2;			break;		default:			assert (FALSE);		}		iCurrentQP += pmbmd->m_intStepDelta;		Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;		if (iCurrentQP < 1)			iCurrentQP = 1;		else if (iCurrentQP > iQuantMax)			iCurrentQP = iQuantMax;	}	pmbmd->m_stepSize = iCurrentQP;	setDCVLCMode(pmbmd, pbRestart);	if(pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ)	{		if (!pmbmd->m_bCodeDcAsAc)		{			for (iBlk = Y_BLOCK1; iBlk < U_BLOCK; iBlk++) {				if (pmbmd->m_rgTranspStatus [iBlk] != ALL)					piIntraDC[iBlk - 1] = decodeIntraDCmpeg (1);				}			for (iBlk = U_BLOCK; iBlk <= V_BLOCK; iBlk++) {				piIntraDC[iBlk - 1] = decodeIntraDCmpeg (0);			}		}	}}// HHI Schueuer: added const PixelC *rgpxlcBlkShape,Int iBlkShapeWidth for sadctVoid	CVideoObjectDecoder::decodeIntraBlockTextureTcoef_DataPartitioning (PixelC* rgpxlcBlkDst,								 Int iWidthDst,								 Int iQP,								 Int iDcScaler,								 Int iBlk,								 MacroBlockMemory* pmbmCurr,								 CMBMode* pmbmd, 								 const BlockMemory blkmPred,								 Int iQpPred,								 Int* piIntraDC,								 const PixelC *rgpxlcBlkShape,                                 Int iBlkShapeWidth){	Int	iCoefStart = 0;	if (!pmbmd->m_bCodeDcAsAc) {		iCoefStart++;	}	Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];	rgiCoefQ[0] = piIntraDC [iBlk - 1];	if (pmbmd->getCodedBlockPattern (iBlk))	{		Int* rgiZigzag = grgiStandardZigzag;		if (pmbmd->m_bACPrediction)				rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;		// 09/16/99 HHI Schueuer:added for sadct		if (!m_volmd.bSadctDisable)				rgiZigzag = m_pscanSelector->select(rgiZigzag, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk); 		// end HHI 		if(m_volmd.bReversibleVlc) 			decodeIntraRVLCTCOEF (rgiCoefQ, iCoefStart, rgiZigzag); 		else			decodeIntraTCOEF (rgiCoefQ, iCoefStart, rgiZigzag);	}	else		memset (rgiCoefQ + iCoefStart, 0, sizeof (Int) * (BLOCK_SQUARE_SIZE - iCoefStart));	inverseDCACPred (pmbmd, iBlk - 1, rgiCoefQ, iQP, iDcScaler, blkmPred, iQpPred);	inverseQuantizeIntraDc (rgiCoefQ, iDcScaler);	// 09/16/99 HHI Schueuer: sadct 	if (rgpxlcBlkShape) {		// HHI Schueuer: for greyscale coding (iBlk-6)		// assert(pmbmd->m_rgTranspStatus [iBlk] == PARTIAL);		// end HHI 02/04/99       	// brute force method to clean out mispredictions outside the active region           Int *lx = m_rgiCurrMBCoeffWidth[iBlk];           Int iy, ix;                      for (ix=lx[0]; ix<BLOCK_SIZE; ix++)           	rgiCoefQ[ix] = 0;			for (iy=1; iy<BLOCK_SIZE; iy++) {            	if (!lx[iy])                	rgiCoefQ[iy*BLOCK_SIZE] = 0;            }	}	// end HHI	if (m_volmd.fQuantizer == Q_H263)		inverseQuantizeDCTcoefH263 (rgiCoefQ, 1, iQP);	else		inverseQuantizeIntraDCTcoefMPEG (rgiCoefQ, 1, iQP, iBlk>=A_BLOCK1, 0);	Int i, j;							//save coefQ (ac) for intra pred	pmbmCurr->rgblkm [iBlk - 1] [0] = m_rgiDCTcoef [0];	//save recon value of DC for intra pred								//save Qcoef in memory	for (i = 1, j = 8; i < BLOCK_SIZE; i++, j += BLOCK_SIZE)	{		pmbmCurr->rgblkm [iBlk - 1] [i] = rgiCoefQ [i];		pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = rgiCoefQ [j];	}// RRV modification	PixelC *pc_block8x8, *pc_block16x16;	if(m_vopmd.RRVmode.iRRVOnOff == 1)	{		pc_block8x8		= new PixelC [64];		pc_block16x16	= new PixelC [256];		// 09/16/99 HHI Schueuer: added for sadct		// m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, pc_block8x8, BLOCK_SIZE);		m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, pc_block8x8, BLOCK_SIZE, rgpxlcBlkShape, iBlkShapeWidth);		MeanUpSampling(pc_block8x8, pc_block16x16, 8, 8);		writeCubicRct(16, iWidthDst, pc_block16x16, rgpxlcBlkDst);		delete pc_block8x8;		delete pc_block16x16;	}	else	{		// 09/16/99 HHI Schueuer: added for sadct		// m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst);		m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst, rgpxlcBlkShape, iBlkShapeWidth);	}//	m_pidct->apply (m_rgiDCTcoef, BLOCK_SIZE, rgpxlcBlkDst, iWidthDst);// ~RRV}// 09/16/99 HHI schueuer: added const PixelC* m_ppxlcCurrMBBY = NULL, const PixelC* m_ppxlcCurrMBBUV = NULLVoid CVideoObjectDecoder::decodeTextureIntraMB_DataPartitioning (	CMBMode* pmbmd, CoordI iMBX, CoordI iMBY, 	PixelC* ppxlcCurrFrmQY, PixelC* ppxlcCurrFrmQU, PixelC* ppxlcCurrFrmQV, Int* piIntraDC,	const PixelC* ppxlcCurrMBBY, const PixelC* ppxlcCurrMBBUV){	assert (pmbmd != NULL);	if (pmbmd -> m_rgTranspStatus [0] == ALL) 		return;	assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);	Int iQP = pmbmd->m_stepSize;	Int iDcScalerY, iDcScalerC;	if (iQP <= 4)	{		iDcScalerY = 8;		iDcScalerC = 8;	}	else if (iQP >= 5 && iQP <= 8)	{		iDcScalerY = 2 * iQP;		iDcScalerC = (iQP + 13) / 2;	}	else if (iQP >= 9 && iQP <= 24)	{		iDcScalerY = iQP + 8;		iDcScalerC = (iQP + 13) / 2;	}	else	{		iDcScalerY = 2 * iQP - 16;		iDcScalerC = iQP - 6;	}	//for intra pred	MacroBlockMemory* pmbmLeft = NULL;	MacroBlockMemory* pmbmTop = NULL;	MacroBlockMemory* pmbmLeftTop = NULL;	CMBMode* pmbmdLeft = NULL;	CMBMode* pmbmdTop = NULL;	CMBMode* pmbmdLeftTop = NULL;											 	Int iMBTop	= iMBY - 1;	if (iMBTop >= 0)	{		if(pmbmd->m_iVideoPacketNumber==(pmbmd - m_iNumMBX)->m_iVideoPacketNumber)	{			pmbmTop  = m_rgpmbmAbove [iMBX];			pmbmdTop = pmbmd - m_iNumMBX;		}	}	if (iMBX > 0)	{		if(pmbmd->m_iVideoPacketNumber==(pmbmd - 1)->m_iVideoPacketNumber)	{			pmbmLeft  = m_rgpmbmCurr [iMBX - 1];			pmbmdLeft = pmbmd -  1;		}	}	if (iMBTop >= 0 && iMBX > 0)	{		if(pmbmd->m_iVideoPacketNumber==(pmbmd - m_iNumMBX - 1)->m_iVideoPacketNumber)	{			pmbmLeftTop  = m_rgpmbmAbove [iMBX - 1];			pmbmdLeftTop = pmbmd - m_iNumMBX - 1;		}	}	PixelC* rgchBlkDst = NULL;	// 09/16/99 HHI Schueuer : for sadct, see also the cond. assignments inside the next switch stmt.	const PixelC* rgchBlkShape = NULL;	// end HHI	Int iWidthDst;	Int iDcScaler;	Int* rgiCoefQ;	for (Int iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {	  if (iBlk < /* (UInt)*/ U_BLOCK) {			if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) 				continue;			switch (iBlk) 			{			case (Y_BLOCK1): 				rgchBlkDst = ppxlcCurrFrmQY;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY : NULL;				break;			case (Y_BLOCK2): // RRV modification				rgchBlkDst = ppxlcCurrFrmQY + (BLOCK_SIZE *m_iRRVScale);//				rgchBlkDst = ppxlcCurrFrmQY + BLOCK_SIZE;// ~RRV				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL;				break;			case (Y_BLOCK3): 				rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;				break;			case (Y_BLOCK4): // RRV modification				rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize					+ (BLOCK_SIZE *m_iRRVScale);//				rgchBlkDst = ppxlcCurrFrmQY + m_iFrameWidthYxBlkSize + BLOCK_SIZE;// ~RRV				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;				break;			}			iWidthDst = m_iFrameWidthY;			iDcScaler = iDcScalerY;		}		else {			iWidthDst = m_iFrameWidthUV;			rgchBlkDst = (iBlk == U_BLOCK) ? ppxlcCurrFrmQU: ppxlcCurrFrmQV;			rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL; // 09/16/99 HHI Schueuer: added for sadct			iDcScaler = iDcScalerC;		}		rgiCoefQ = m_rgpiCoefQ [iBlk - 1];		const BlockMemory blkmPred = NULL;		Int iQpPred = iQP; //default to current if no pred (use 128 case)		decideIntraPred (blkmPred, 						 pmbmd,						 iQpPred,						 (BlockNum)iBlk,						 pmbmLeft,   						 pmbmTop, 						 pmbmLeftTop,						 m_rgpmbmCurr [iMBX],						 pmbmdLeft,						 pmbmdTop,						 pmbmdLeftTop);		decodeIntraBlockTextureTcoef_DataPartitioning (rgchBlkDst,								 iWidthDst,								 iQP, 								 iDcScaler,								 iBlk,									 m_rgpmbmCurr [iMBX],								 pmbmd, 								 blkmPred, //for intra-pred								 iQpPred,								 piIntraDC,								 rgchBlkShape,								 (iBlk<U_BLOCK) ? MB_SIZE : BLOCK_SIZE); // HHI Schueuer	}}

⌨️ 快捷键说明

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