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

📄 sys_decoder_mbdec.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
								 iDcScaler,								 iBlk,									 m_rgpmbmCurr [iMBX],								 pmbmd, 								 blkmPred, //for intra-pred								 iQpPred,								 rgchBlkShape, (iBlk<U_BLOCK) ? MB_SIZE : BLOCK_SIZE);	}}Void CVideoObjectDecoder::decodeAlphaIntraMB (CMBMode* pmbmd, Int iMBX, Int iMBY, 											  PixelC* ppxlcRefMBA, Int iAuxComp, const PixelC *ppxlcCurrMBBY){	assert (pmbmd != NULL);	if (pmbmd -> m_rgTranspStatus [0] == ALL) 		return;	assert (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);	Int iQP = pmbmd->m_stepSizeAlpha;	Int iDcScalerA;	if (pmbmd -> m_stepSizeAlpha < 1)		pmbmd -> m_stepSizeAlpha = 1;	if (iQP <= 4)	{		iDcScalerA = 8;	}	else if (iQP >= 5 && iQP <= 8)	{		iDcScalerA = 2 * iQP;	}	else if (iQP >= 9 && iQP <= 24)	{		iDcScalerA = iQP + 8;	}	else	{		iDcScalerA = 2 * iQP - 16;	}	assert (iQP > 0 && iQP < 64);	pmbmd->m_bCodeDcAsAcAlpha = FALSE;	if(pmbmd->m_pCODAlpha[iAuxComp]==ALPHA_ALL255)	{		// fill curr macroblock with 255		Int iY;		PixelC *ppxlc = ppxlcRefMBA;		for(iY = 0; iY<MB_SIZE; iY++, ppxlc += m_iFrameWidthY)			pxlcmemset(ppxlc, 255, MB_SIZE);		// fix intra prediction		Int iBlk;		MacroBlockMemory* pmbmCurr = m_rgpmbmCurr [iMBX];		for(iBlk = A_BLOCK1; iBlk<=A_BLOCK4; iBlk++)		{			Int i;			pmbmCurr->rgblkm [iBlk - 1] [0] = divroundnearest(255 * 8, iDcScalerA) * iDcScalerA;			//save recon value of DC for intra pred								//save Qcoef in memory			for (i = 1; i < BLOCK_SIZE; i++)	{				pmbmCurr->rgblkm [iBlk - 1] [i] = 0;				pmbmCurr->rgblkm [iBlk - 1] [i + BLOCK_SIZE - 1] = 0;			}						}		return;	}	//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;	// HHI Schueuer: for sadct, see also the cond. assignments inside the next switch stmt.	const PixelC* rgchBlkShape = NULL;   	// end HHI	Int* rgiCoefQ;	for (Int iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {		if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) 			continue;		switch (iBlk) 		{		case (A_BLOCK1): 			rgchBlkDst = ppxlcRefMBA;			rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY : NULL;				break;		case (A_BLOCK2): 			rgchBlkDst = ppxlcRefMBA + BLOCK_SIZE;			rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL;			break;		case (A_BLOCK3): 			rgchBlkDst = ppxlcRefMBA + m_iFrameWidthYxBlkSize;			rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;    			break;		case (A_BLOCK4): 			rgchBlkDst = ppxlcRefMBA + m_iFrameWidthYxBlkSize + BLOCK_SIZE;			rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;			break;		}		rgiCoefQ = m_rgpiCoefQ [iBlk - 1];		const BlockMemory blkmPred = NULL;		Int iQpPred = iQP;		decideIntraPred (blkmPred, 						 pmbmd,						 iQpPred,						 (BlockNum)(iBlk+iAuxComp*4),						 pmbmLeft,   						 pmbmTop, 						 pmbmLeftTop,						 m_rgpmbmCurr [iMBX], // save for curr coefs						 pmbmdLeft,						 pmbmdTop,						 pmbmdLeftTop);		decodeIntraBlockTexture (rgchBlkDst,								 m_iFrameWidthY,								 iQP, 								 iDcScalerA,								 iBlk+iAuxComp*4,									 m_rgpmbmCurr [iMBX],								 pmbmd, 								 blkmPred, //for intra-pred								 iQpPred,								 rgchBlkShape, MB_SIZE, iAuxComp); // 01/27/99 HHI Schueuer: added rgchBlkShape, MB_SIZE			}}Void CVideoObjectDecoder::decodeTextureInterMB (CMBMode* pmbmd, const PixelC *ppxlcCurrMBBY, const PixelC *ppxlcCurrMBBUV){	assert (pmbmd != NULL);	if (pmbmd->m_rgTranspStatus [0] == ALL || pmbmd->m_bSkip) 		return;	assert (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ);	Int iQP = pmbmd->m_stepSize;	Int* rgiBlkCurrQ = m_ppxliErrorMBY;	// HHI Schueuer: for sadct, see also the cond. assignments inside the next switch stmt.	const PixelC* rgchBlkShape = NULL;    	// end HHI	Int iWidthCurrQ;// RRV insertion	PixelI* pi_block16x16 = NULL;	if(m_vopmd.RRVmode.iRRVOnOff == 1)	{		pi_block16x16	= new PixelI [256];	}// ~RRV	for (Int iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {		if (iBlk < U_BLOCK) {			if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) 				continue;			switch (iBlk) 			{			case (Y_BLOCK1): 				rgiBlkCurrQ = m_ppxliErrorMBY;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY : NULL;				break;			case (Y_BLOCK2): // RRV modification				rgiBlkCurrQ = m_ppxliErrorMBY + (BLOCK_SIZE *m_iRRVScale);//				rgiBlkCurrQ = m_ppxliErrorMBY + BLOCK_SIZE;// ~RRV				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL;				break;			case (Y_BLOCK3): // RRV modification				rgiBlkCurrQ = m_ppxliErrorMBY					+ (MB_SIZE * BLOCK_SIZE *m_iRRVScale *m_iRRVScale);//				rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;// ~RRV				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;				break;			case (Y_BLOCK4): // RRV modification				rgiBlkCurrQ = m_ppxliErrorMBY					+ (MB_SIZE * BLOCK_SIZE *m_iRRVScale *m_iRRVScale)						+ (BLOCK_SIZE *m_iRRVScale);//				rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;// ~RRV				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;				break;			}// RRV modification			iWidthCurrQ = (MB_SIZE *m_iRRVScale);//			iWidthCurrQ = MB_SIZE;// ~RRV		}		else {// RRV modification			iWidthCurrQ = (BLOCK_SIZE *m_iRRVScale);//			iWidthCurrQ = BLOCK_SIZE;// ~RRV			rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV;			rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL;		}		if (pmbmd->getCodedBlockPattern (iBlk))			// HHI Schueuer : pmbmd, iBlk, rgchBlkShape, (iBlk < U_BLOCK) ? MB_SIZE : BLOCK_SIZE added			decodeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, iQP, FALSE, pmbmd, iBlk, rgchBlkShape, (iBlk < U_BLOCK) ? MB_SIZE : BLOCK_SIZE); //all for intra-pred		else // RRV modification			if(m_vopmd.RRVmode.iRRVOnOff == 1)			{				memset (pi_block16x16, 0, sizeof (Int) * 256);				writeCubicRct(MB_SIZE, iWidthCurrQ,							  pi_block16x16, rgiBlkCurrQ);			}			else			{				for (Int i = 0; i < BLOCK_SIZE; i++)	{					memset (rgiBlkCurrQ, 0, sizeof (Int) * BLOCK_SIZE);					rgiBlkCurrQ += iWidthCurrQ;				}			}// ~RRV	}// RRV insertion	if(m_vopmd.RRVmode.iRRVOnOff == 1)	{		delete pi_block16x16;	}// ~RRV}// HHI Schueuer. const PixelC *ppxlcCurrMBBY added for sadctVoid CVideoObjectDecoder::decodeAlphaInterMB (CMBMode* pmbmd, PixelC *ppxlcRefMBA, Int iAuxComp, const PixelC *ppxlcCurrMBBY){	assert (pmbmd != NULL);	if (pmbmd->m_rgTranspStatus [0] == ALL)		return;	if(pmbmd->m_pCODAlpha[iAuxComp] == ALPHA_ALL255) 	{		// fill curr macroblock with 255		Int iY;		PixelC *ppxlc = ppxlcRefMBA;		for(iY = 0; iY<MB_SIZE; iY++, ppxlc += m_iFrameWidthY)			pxlcmemset(ppxlc, 255, MB_SIZE);		return;	}	if(pmbmd->m_pCODAlpha[iAuxComp] != ALPHA_CODED)		return;	assert (pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ);	Int iQP = pmbmd->m_stepSizeAlpha;	Int* piBlkCurrQ = NULL;	// HHI Schueuer : for sadct, see also the cond. assignments inside the next switch stmt.	const PixelC* rgchBlkShape = NULL;   	// end HHI	for (Int iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {		if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) 			continue;		switch (iBlk) 		{		case (A_BLOCK1): 			piBlkCurrQ = m_ppxliErrorMBA[iAuxComp];			rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY : NULL;			break;		case (A_BLOCK2): 			piBlkCurrQ = m_ppxliErrorMBA[iAuxComp] + BLOCK_SIZE;			rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL;			break;		case (A_BLOCK3): 			piBlkCurrQ = m_ppxliErrorMBA[iAuxComp] + MB_SIZE * BLOCK_SIZE;			rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;			break;		case (A_BLOCK4): 			piBlkCurrQ = m_ppxliErrorMBA[iAuxComp] + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;			rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk-6] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;			break;		}		//		Int *pix = piBlkCurrQ;		Int i;		if (pmbmd->getCodedBlockPattern (iBlk+iAuxComp*4))		{			// HHI Schueuer :  pmbmd, iBlk, rgchBlkShape, MB_SIZE added			decodeTextureInterBlock (piBlkCurrQ, MB_SIZE, iQP, TRUE,  pmbmd, iBlk+iAuxComp*4, rgchBlkShape, MB_SIZE, iAuxComp);		}		else 			for (i = 0; i < BLOCK_SIZE; i++)	{				memset (piBlkCurrQ, 0, sizeof (Int) * BLOCK_SIZE);				piBlkCurrQ += MB_SIZE;			}	}}Void CVideoObjectDecoder::setCBPYandC (CMBMode* pmbmd, Int iCBPC, Int iCBPY, Int cNonTrnspBlk){	pmbmd->setCodedBlockPattern (U_BLOCK, (iCBPC >> 1) & 1) ;	pmbmd->setCodedBlockPattern (V_BLOCK, iCBPC & 1) ;	Int iBitPos = 1, iBlk;	for (iBlk = Y_BLOCK1; iBlk <= Y_BLOCK4; iBlk++)	{		if (pmbmd->m_rgTranspStatus [iBlk] != ALL)	{			pmbmd->setCodedBlockPattern (				iBlk, 				(iCBPY >> (cNonTrnspBlk - iBitPos)) & 1			);			iBitPos++;		}		else			pmbmd->setCodedBlockPattern (iBlk, 0);	}}

⌨️ 快捷键说明

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