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

📄 mbenc.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		ppxlcCurrMBU += (BLOCK_SIZE *m_iRRVScale);	ppxlcCurrU += iWidthUV;		ppxlcCurrMBV += (BLOCK_SIZE *m_iRRVScale);	ppxlcCurrV += iWidthUV;				memcpy (ppxlcCurrMBY, ppxlcCurrY,			(MB_SIZE *sizeof(PixelC) *m_iRRVScale));	// two rows for Y		ppxlcCurrMBY += (MB_SIZE *m_iRRVScale); ppxlcCurrY += iWidthY;		//	for (ic = 0; ic < BLOCK_SIZE; ic++) {		//		memcpy (ppxlcCurrMBY, ppxlcCurrY, MB_SIZE*sizeof(PixelC));		//		memcpy (ppxlcCurrMBU, ppxlcCurrU, BLOCK_SIZE*sizeof(PixelC));		//		memcpy (ppxlcCurrMBV, ppxlcCurrV, BLOCK_SIZE*sizeof(PixelC));		//		ppxlcCurrMBY += MB_SIZE; ppxlcCurrY += iWidthY;		//		ppxlcCurrMBU += BLOCK_SIZE; ppxlcCurrU += iWidthUV;		//		ppxlcCurrMBV += BLOCK_SIZE;	ppxlcCurrV += iWidthUV;		//		//		memcpy (ppxlcCurrMBY, ppxlcCurrY, MB_SIZE*sizeof(PixelC)); // two rows for Y		//		ppxlcCurrMBY += MB_SIZE; ppxlcCurrY += iWidthY;		// ~RRV	}}// compute error signalVoid CVideoObjectEncoder::computeTextureError (){	CoordI ix;	// RRV insertion	Int	iTmp	= (m_iRRVScale *m_iRRVScale);	// ~RRV	// Y	// RRV modification	for (ix = 0; ix < (MB_SQUARE_SIZE *iTmp); ix++)		//	for (ix = 0; ix < MB_SQUARE_SIZE; ix++)		// ~RRV		m_ppxliErrorMBY [ix] = m_ppxlcCurrMBY [ix] - m_ppxlcPredMBY [ix];		// UV	// RRV modification	for (ix = 0; ix < (BLOCK_SQUARE_SIZE *iTmp); ix++) {		//	for (ix = 0; ix < BLOCK_SQUARE_SIZE; ix++) {		// ~RRV		m_ppxliErrorMBU [ix] = m_ppxlcCurrMBU [ix] - m_ppxlcPredMBU [ix];		m_ppxliErrorMBV [ix] = m_ppxlcCurrMBV [ix] - m_ppxlcPredMBV [ix];	}		// Alpha	if(m_volmd.fAUsage==EIGHT_BIT) {		for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 29-Nov-99						for (ix = 0; ix < (MB_SQUARE_SIZE *iTmp); ix++)				m_ppxliErrorMBA[iAuxComp][ix] = m_ppxlcCurrMBA[iAuxComp][ix] - m_ppxlcPredMBA[iAuxComp][ix];		}	}}Void CVideoObjectEncoder::computeTextureErrorWithShape (){	CoordI ix;	// Y	for (ix = 0; ix < MB_SQUARE_SIZE; ix++) {		if (m_ppxlcCurrMBBY [ix] == transpValue)			m_ppxliErrorMBY [ix] = 0; // zero padding		else			m_ppxliErrorMBY [ix] = m_ppxlcCurrMBY [ix] - m_ppxlcPredMBY [ix];	}		// UV	for (ix = 0; ix < BLOCK_SQUARE_SIZE; ix++) {		if (m_ppxlcCurrMBBUV [ix] == transpValue)			m_ppxliErrorMBU [ix] = m_ppxliErrorMBV [ix] = 0;		else {			m_ppxliErrorMBU [ix] = m_ppxlcCurrMBU [ix] - m_ppxlcPredMBU [ix];			m_ppxliErrorMBV [ix] = m_ppxlcCurrMBV [ix] - m_ppxlcPredMBV [ix];		}	}		if(m_volmd.fAUsage==EIGHT_BIT) {		for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 29-Nov-99			for (ix = 0; ix < MB_SQUARE_SIZE; ix++) {				if (m_ppxlcCurrMBBY [ix] == transpValue)					m_ppxliErrorMBA[iAuxComp] [ix] = 0; // zero padding				else					m_ppxliErrorMBA[iAuxComp] [ix] = m_ppxlcCurrMBA[iAuxComp] [ix] - m_ppxlcPredMBA[iAuxComp] [ix];			}		}	}}Void CVideoObjectEncoder::computeAlphaError (){	CoordI ix;		for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 29-Nov-99		for (ix = 0; ix < MB_SQUARE_SIZE; ix++) {			if (m_ppxlcCurrMBBY [ix] == transpValue)				m_ppxliErrorMBA[iAuxComp] [ix] = 0; // zero padding			else				m_ppxliErrorMBA[iAuxComp] [ix] = m_ppxlcCurrMBA[iAuxComp] [ix] - m_ppxlcPredMBA[iAuxComp] [ix];		}	}}// HHI Schueuer: added const PixelC *ppxlcCurrMBBY, const PixelC *ppxlcCurrMBBUV for sadctVoid CVideoObjectEncoder::quantizeTextureIntraMB (													  Int imbX,												  Int imbY,												  CMBMode* pmbmd, 												  PixelC* ppxlcCurrQMBY,												  PixelC* ppxlcCurrQMBU,												  PixelC* ppxlcCurrQMBV,												  PixelC** pppxlcCurrQMBA,												  const PixelC *ppxlcCurrMBBY,												  const PixelC *ppxlcCurrMBBUV												  ){	assert (pmbmd != NULL);	assert (pmbmd -> m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ);	assert (pmbmd -> m_rgTranspStatus [0] != ALL);		pmbmd->m_bSkip = FALSE;		// for direct mode reference 		Int iQP = pmbmd->m_stepSize;#ifdef __TRACE_AND_STATS_	m_statsMB.nQMB++;	m_statsMB.nQp += iQP;#endif // __TRACE_AND_STATS_		Int iDcScalerY, iDcScalerC, iDcScalerA = 0;	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;	}		Int iQPA = 0;		Int iAuxComp;	for(iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) // MAC (SB) 29-Nov-99		pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED;		if(m_volmd.fAUsage == EIGHT_BIT)	{		iQPA = pmbmd->m_stepSizeAlpha;				if (iQPA <= 4)			iDcScalerA = 8;		else if (iQPA >= 5 && iQPA <= 8)			iDcScalerA = 2 * iQPA;		else if (iQPA >= 9 && iQPA <= 24)			iDcScalerA = iQPA + 8;		else			iDcScalerA = 2 * iQPA - 16;				if(pmbmd->m_rgTranspStatus [0] == NONE)		{			// need to test gray alpha vals			// CODA = 1 if all==255, can't use TranspStatus, has to be 255			Int i;			Int iThresh = 256 - iQPA;						Int iAuxComp;			for(iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 29-Nov-99								pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_ALL255;				for(i = 0; i<MB_SQUARE_SIZE; i++) {					if(m_ppxlcCurrMBA[iAuxComp][i]<=iThresh)					{						pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED;						break;					}				}				if(pmbmd->m_pCODAlpha[iAuxComp] == ALPHA_ALL255)				{					pxlcmemset(m_ppxlcCurrMBA[iAuxComp], 255, MB_SQUARE_SIZE);					PixelC *ppxlc = pppxlcCurrQMBA[iAuxComp];					for(i = 0; i<MB_SIZE; i++, ppxlc += m_iFrameWidthY)						pxlcmemset(ppxlc, 255, MB_SIZE);				}        			}		}		}		Int iCoefToStart;	if(pmbmd->m_bCodeDcAsAc)		iCoefToStart = 0;	else		iCoefToStart = 1;	//for intra pred	MacroBlockMemory* pmbmLeft = NULL;	MacroBlockMemory* pmbmTop = NULL;	MacroBlockMemory* pmbmLeftTop = NULL;	CMBMode* pmbmdLeft = NULL;	CMBMode* pmbmdTop = NULL;	CMBMode* pmbmdLeftTop = NULL;											 	Int iMBnum = imbY * m_iNumMBX + imbX;	if (!bVPNoTop(iMBnum))	{		pmbmTop  = m_rgpmbmAbove [imbX];		pmbmdTop = pmbmd - m_iNumMBX;	}	if (!bVPNoLeft(iMBnum, imbX))	{		pmbmLeft  = m_rgpmbmCurr [imbX - 1];		pmbmdLeft = pmbmd -  1;	}	if (!bVPNoLeftTop(iMBnum, imbX))	{		pmbmLeftTop  = m_rgpmbmAbove [imbX - 1];		pmbmdLeftTop = pmbmd - m_iNumMBX - 1;	}		// INTERLACE	if((pmbmd->m_rgTranspStatus [0] == NONE)&&(m_vopmd.bInterlace == TRUE) ) {		pmbmd->m_bFieldDCT = FrameFieldDCTDecideC(m_ppxlcCurrMBY);		m_statsMB.nFieldDCTMB += (Int) pmbmd->m_bFieldDCT;	}	else		pmbmd->m_bFieldDCT = 0;		// ~INTERLACE		PixelC* rgchBlkDst = NULL;	PixelC* rgchBlkSrc = NULL;	Int iWidthDst, iWidthSrc;	Int iDcScaler;	Int* rgiCoefQ;	Int iSumErr = 0; //sum of error to determine intra ac prediction	Int iBlk;	//	Int iBlkEnd;	//	if(m_volmd.fAUsage == EIGHT_BIT)	//		iBlkEnd = A_BLOCK4;	//	else	//		iBlkEnd = V_BLOCK;		// HHI Schueuer: for sadct, see also the cond. assignments inside the next switch stmt.	const PixelC* rgchBlkShape = NULL;	// end		for (iBlk = (Int) Y_BLOCK1; iBlk <= (Int)pmbmd->blkEnd(); iBlk++) { // + 1 is because of the indexing		if (iBlk < (Int) U_BLOCK || iBlk > (Int) V_BLOCK) {			if(iBlk>=A_BLOCK1 && ((iBlk-7)%4)==0)				iSumErr = 0; // start again for alpha planes			if (iBlk>=A_BLOCK1 && pmbmd->m_rgTranspStatus [((iBlk-7)%4)+1] == ALL)				continue;			else if (iBlk<A_BLOCK1 && pmbmd -> m_rgTranspStatus [iBlk % 6] == ALL) // %6 hack!!				continue;									switch (iBlk) 			{			case (Y_BLOCK1): 				rgchBlkDst = ppxlcCurrQMBY;				rgchBlkSrc = m_ppxlcCurrMBY;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY : NULL;				break;			case (Y_BLOCK2): 				rgchBlkDst = ppxlcCurrQMBY + BLOCK_SIZE;				rgchBlkSrc = m_ppxlcCurrMBY + BLOCK_SIZE;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL;				break;			case (Y_BLOCK3): 				// RRV modification				rgchBlkDst = ppxlcCurrQMBY + (m_iFrameWidthYxBlkSize /m_iRRVScale);				//				rgchBlkDst = ppxlcCurrQMBY + m_iFrameWidthYxBlkSize;				// ~RRV				rgchBlkSrc = m_ppxlcCurrMBY + MB_SIZE * BLOCK_SIZE;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;				break;			case (Y_BLOCK4): 				// RRV modification				rgchBlkDst = ppxlcCurrQMBY + (m_iFrameWidthYxBlkSize /m_iRRVScale) + BLOCK_SIZE;				//				rgchBlkDst = ppxlcCurrQMBY + m_iFrameWidthYxBlkSize + BLOCK_SIZE;				// ~RRV				rgchBlkSrc = m_ppxlcCurrMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;				rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;				break;			}						// MAC (SB) 29-Nov-99			if (iBlk>=A_BLOCK1) { // alpha blocks				Int iABlk = ((iBlk-7)&0x3);				iAuxComp = (iBlk-7)/4;				iABlk++;								rgchBlkDst = pppxlcCurrQMBA[iAuxComp];				rgchBlkSrc = m_ppxlcCurrMBA[iAuxComp];								switch (iABlk) {				case 1: rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[1] == PARTIAL) ? ppxlcCurrMBBY : NULL;					break;				case 2: rgchBlkDst += BLOCK_SIZE;					rgchBlkSrc += BLOCK_SIZE;					rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[2] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE : NULL;        					break;				case 3: rgchBlkDst += m_iFrameWidthYxBlkSize;					rgchBlkSrc += MB_SIZE * BLOCK_SIZE;					rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[3] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;					break;				case 4: rgchBlkDst += m_iFrameWidthYxBlkSize + BLOCK_SIZE;					rgchBlkSrc += MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;					rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[4] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;					break;				}			}			//~MAC						iWidthDst = m_iFrameWidthY;			iWidthSrc = MB_SIZE;			if(iBlk<=V_BLOCK)				iDcScaler = iDcScalerY;			else				iDcScaler = iDcScalerA;		}		else {			iWidthDst = m_iFrameWidthUV;			iWidthSrc = BLOCK_SIZE;			rgchBlkDst = (iBlk == U_BLOCK) ? ppxlcCurrQMBU: ppxlcCurrQMBV;			rgchBlkSrc = (iBlk == U_BLOCK) ? m_ppxlcCurrMBU: m_ppxlcCurrMBV;			// HHI: for sadct			rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL;			iDcScaler = iDcScalerC;		}				if (m_volmd.nBits<=8) { // NBIT: not always valid when nBits>8			assert(iDcScaler > 0 && iDcScaler < 128);		}				rgiCoefQ = m_rgpiCoefQ [iBlk - 1];		iSumErr += quantizeIntraBlockTexture (			rgchBlkSrc,			iWidthSrc,			rgchBlkDst,			iWidthDst,			rgiCoefQ, 			(iBlk<=V_BLOCK ? iQP : iQPA), 			iDcScaler,			iBlk,	//from here til last			pmbmLeft, 			pmbmTop, 			pmbmLeftTop, 			m_rgpmbmCurr [imbX],			pmbmdLeft, 			pmbmdTop, 			pmbmdLeftTop, 			pmbmd,			rgchBlkShape, ((iBlk<U_BLOCK) || (iBlk > V_BLOCK)) ? MB_SIZE : BLOCK_SIZE,	// HHI			iAuxComp			); //all for intra-pred		if(iBlk>=A_BLOCK1)			pmbmd->m_pbACPredictionAlpha[iAuxComp]	= (pmbmd->m_pCODAlpha[iAuxComp] == ALPHA_CODED && iSumErr >= 0);		else			pmbmd->m_bACPrediction =(iSumErr >= 0);	}		// INTERLACE	if ((pmbmd->m_rgTranspStatus [0] == NONE) && (m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))		fieldDCTtoFrameC(ppxlcCurrQMBY);	// ~INTERLACE		for (iBlk = (UInt) Y_BLOCK1; iBlk <= (Int)pmbmd->blkEnd(); iBlk++) { // + 1 is because of the indexing		Int iBlkMap;		if (iBlk>=A_BLOCK1) // alpha blocks			iBlkMap = ((iBlk-7)&0x3)+1;		else			iBlkMap = iBlk;		if (pmbmd->m_rgTranspStatus [iBlkMap % 6] == ALL) { // hack %6 ok if [6]==[0]			pmbmd->setCodedBlockPattern (iBlk, FALSE);			continue;		}		rgiCoefQ = m_rgpiCoefQ [iBlk - 1];		if (iBlk < (Int) U_BLOCK) 			iDcScaler = iDcScalerY; //m_rgiDcScalerY [iQP];		else if(iBlk < (Int) A_BLOCK1)			iDcScaler = iDcScalerC; //m_rgiDcScalerC [iQP];		else			iDcScaler = iDcScalerA;				intraPred ( iBlk, pmbmd, rgiCoefQ,			(iBlk<=V_BLOCK ? iQP : iQPA), iDcScaler, m_rgblkmCurrMB [iBlk - 1],			m_rgiQPpred [iBlk - 1]);		Bool bCoded = FALSE;		UInt i;

⌨️ 快捷键说明

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