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

📄 mcenc.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		    motionCompOneBVOPReference(m_pvopcPredMB, FORWARD,  x, y, pmbmd, pmvForward, prctMVLimitForward);		    computeTextureErrorWithShape();		    break;	    case BACKWARD:		    motionCompOneBVOPReference(m_pvopcPredMB, BACKWARD, x, y, pmbmd, pmvBackward, prctMVLimitBackward);		    computeTextureErrorWithShape();		    break;	    case DIRECT:		    motionCompDirectMode(x, y, pmbmd,                &m_rgmvRef[(PVOP_MV_PER_REF_PER_MB*(x + m_iNumMBX * y)) / MB_SIZE],                prctMVLimitForward, prctMVLimitBackward,0);   // new change 02-19-99		    averagePredAndComputeErrorY_WithShape();		    averagePredAndComputeErrorUV_WithShape();		    break;	    case INTERPOLATE:		    motionCompOneBVOPReference(m_pvopcPredMB,     FORWARD,  x, y, pmbmd, pmvForward, prctMVLimitForward);		    motionCompOneBVOPReference(m_pvopcPredMBBack, BACKWARD, x, y, pmbmd, pmvBackward, prctMVLimitBackward);		    averagePredAndComputeErrorY_WithShape();		    averagePredAndComputeErrorUV_WithShape();		    break;	    }        return;    }// INTERLACED// end of new changes	if (pmbmd->m_mbType == DIRECT || pmbmd->m_mbType == INTERPOLATE) { // Y is done when doing motion estimation		motionCompInterpAndError_WithShape (pmvForward, pmvBackward, x, y,prctMVLimitForward,prctMVLimitBackward);		CoordI xRefUVForward, yRefUVForward;		mvLookupUVWithShape (pmbmd, pmvForward, xRefUVForward, yRefUVForward);		motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, m_pvopcRefQ0, x, y, xRefUVForward, yRefUVForward, 0, prctMVLimitForward);				CoordI xRefUVBackward, yRefUVBackward;		mvLookupUVWithShape (pmbmd, pmvBackward, xRefUVBackward, yRefUVBackward);		motionCompUV (m_ppxlcPredMBBackU, m_ppxlcPredMBBackV, m_pvopcRefQ1, x, y, xRefUVBackward, yRefUVBackward, 0, prctMVLimitBackward);		averagePredAndComputeErrorUV_WithShape ();	}	else { 		const CMotionVector* pmv;		const PixelC* ppxlcRef; // point to left-top of the reference VOP		const PixelC* ppxlcRefZoom; // point to left-top of the reference VOP		const CVOPU8YUVBA* pvopcRef;		CRct *prctMVLimit;		if (pmbmd->m_mbType == FORWARD) { // Y is done when doing motion estimation			pmv = pmvForward;			pvopcRef = m_pvopcRefQ0;			ppxlcRef = m_pvopcRefQ0->pixelsY (); // point to left-top of the reference VOP			ppxlcRefZoom = m_puciRefQZoom0->pixels (); // point to left-top of the reference VOP			prctMVLimit = prctMVLimitForward;		}		else {			pmv = pmvBackward;			pvopcRef = m_pvopcRefQ1;			ppxlcRef = m_pvopcRefQ1->pixelsY (); // point to left-top of the reference VOP			ppxlcRefZoom = m_puciRefQZoom1->pixels (); // point to left-top of the reference VOP			prctMVLimit = prctMVLimitBackward;		}		CoordI xRefUV, yRefUV;		mvLookupUVWithShape (pmbmd, pmv, xRefUV, yRefUV);		motionCompEncY (ppxlcRef, ppxlcRefZoom, m_ppxlcPredMBY, MB_SIZE, pmv, x, y,prctMVLimit);		motionCompUV (m_ppxlcPredMBU, m_ppxlcPredMBV, pvopcRef, x, y, xRefUV, yRefUV, 0, prctMVLimit);		computeTextureErrorWithShape ();	}}Void CVideoObjectEncoder::motionCompAndDiffAlpha_BVOP_MB (	const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 	const CMBMode* pmbmd, 	CoordI x, CoordI y,	CRct *prctMVLimitForward,CRct *prctMVLimitBackward){	if (pmbmd->m_mbType == DIRECT || pmbmd->m_mbType == INTERPOLATE) {		motionCompMBAEnc (pmvForward, pmbmd, m_ppxlcPredMBA, m_pvopcRefQ0,			x, y, 0, prctMVLimitForward,0);		motionCompMBAEnc (pmvBackward, pmbmd, m_ppxlcPredMBBackA, m_pvopcRefQ1,			x, y, 0, prctMVLimitBackward,1);		// average predictions		Int i;		for(i = 0; i<MB_SQUARE_SIZE; i++)			m_ppxlcPredMBA[i] = (m_ppxlcPredMBA[i] + m_ppxlcPredMBBackA[i] + 1)>>1;	}	else { 		const CMotionVector* pmv;		const PixelC* ppxlcRef; // point to left-top of the reference VOP		CRct *prctMVLimit;		if (pmbmd->m_mbType == FORWARD) {			pmv = pmvForward;			ppxlcRef = m_pvopcRefQ0->pixelsA (); // point to left-top of the reference VOP			prctMVLimit = prctMVLimitForward;// 12.22.98 begin of changes			if(m_vopmd.bInterlace&&pmbmd->m_bFieldMV)				motionCompMBAEnc (pmvForward, pmbmd, m_ppxlcPredMBA, m_pvopcRefQ0,					x, y, 0, prctMVLimitForward,0);// end of changes		}		else {			pmv = pmvBackward;			ppxlcRef = m_pvopcRefQ1->pixelsA (); // point to left-top of the reference VOP			prctMVLimit = prctMVLimitBackward;// 12.22.98 begin of changes			if(m_vopmd.bInterlace&&pmbmd->m_bFieldMV)				motionCompMBAEnc (pmvBackward, pmbmd, m_ppxlcPredMBA, m_pvopcRefQ1,					x, y, 0, prctMVLimitBackward,1);// end of changes		}		if((!m_vopmd.bInterlace||(m_vopmd.bInterlace&&!pmbmd->m_bFieldMV))) // 12.22.98 changes			motionComp (				m_ppxlcPredMBA,				ppxlcRef,				MB_SIZE, // MB size				x * 2 + pmv->trueMVHalfPel ().x, 				y * 2 + pmv->trueMVHalfPel ().y,				0,				prctMVLimit			);	}	computeAlphaError();}Void CVideoObjectEncoder::averagePredAndComputeErrorUV (){	Int i = 0;	for (i = 0; i < BLOCK_SQUARE_SIZE; i++) {		m_ppxlcPredMBU [i] = (m_ppxlcPredMBU [i] + m_ppxlcPredMBBackU [i] + 1) >> 1;		m_ppxlcPredMBV [i] = (m_ppxlcPredMBV [i] + m_ppxlcPredMBBackV [i] + 1) >> 1;		m_ppxliErrorMBU [i] = m_ppxlcCurrMBU [i] - m_ppxlcPredMBU [i];		m_ppxliErrorMBV [i] = m_ppxlcCurrMBV [i] - m_ppxlcPredMBV [i];	}}Void CVideoObjectEncoder::averagePredAndComputeErrorUV_WithShape (){	Int i = 0;	for (i = 0; i < BLOCK_SQUARE_SIZE; i++) {		if (m_ppxlcCurrMBBUV [i] == transpValue)			m_ppxliErrorMBU [i] = m_ppxliErrorMBV [i] = 0;		else {			m_ppxlcPredMBU [i] = (m_ppxlcPredMBU [i] + m_ppxlcPredMBBackU [i] + 1) >> 1;			m_ppxlcPredMBV [i] = (m_ppxlcPredMBV [i] + m_ppxlcPredMBBackV [i] + 1) >> 1;			m_ppxliErrorMBU [i] = m_ppxlcCurrMBU [i] - m_ppxlcPredMBU [i];			m_ppxliErrorMBV [i] = m_ppxlcCurrMBV [i] - m_ppxlcPredMBV [i];		}	}}// B-VOP ME/MC stuffInt CVideoObjectEncoder::interpolateAndDiffY (	const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 	CoordI x, CoordI y,	CRct *prctMVLimitForward,CRct *prctMVLimitBackward){	motionCompEncY (		m_pvopcRefQ0->pixelsY (), 		m_puciRefQZoom0->pixels (),		m_ppxlcPredMBY, MB_SIZE, pmvForward, x, y,		prctMVLimitForward	);	/*Int iLeft  = (x << 1) + pmvBackward->m_vctTrueHalfPel.x;	Int iRight = (y << 1) + pmvBackward->m_vctTrueHalfPel.y;		//make sure don't end up with a mv that points out of a frame; object-based not done	if (!m_puciRefQZoom1->where ().includes (CRct (iLeft, iRight, iLeft + (MB_SIZE << 1), iRight + (MB_SIZE << 1))))		return 1000000000;	else*/	motionCompEncY (		m_pvopcRefQ1->pixelsY (), 		m_puciRefQZoom1->pixels (),		m_ppxlcPredMBBackY, MB_SIZE, pmvBackward, x, y,		prctMVLimitBackward	);	Int ic;	Int iSAD = 0;	for (ic = 0; ic < MB_SQUARE_SIZE; ic++)		iSAD += abs (m_ppxlcCurrMBY [ic] - ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1));	return iSAD;}Int CVideoObjectEncoder::interpolateAndDiffY_WithShape (	const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 	CoordI x, CoordI y,	CRct *prctMVLimitForward,CRct *prctMVLimitBackward){	motionCompEncY (		m_pvopcRefQ0->pixelsY (), 		m_puciRefQZoom0->pixels (),		m_ppxlcPredMBY, MB_SIZE, pmvForward, x, y,		prctMVLimitForward	);	motionCompEncY (		m_pvopcRefQ1->pixelsY (), 		m_puciRefQZoom1->pixels (),		m_ppxlcPredMBBackY, MB_SIZE, pmvBackward, x, y,		prctMVLimitBackward	);	Int ic;	Int iSAD = 0;	for (ic = 0; ic < MB_SQUARE_SIZE; ic++) {		if (m_ppxlcCurrMBBY [ic] != transpValue)			iSAD += abs (m_ppxlcCurrMBY [ic] - ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1));	}	return iSAD;}Int CVideoObjectEncoder::interpolateAndDiffYField(	const CMotionVector* pmvFwdTop,	const CMotionVector* pmvFwdBot,	const CMotionVector* pmvBakTop,	const CMotionVector* pmvBakBot,	CoordI x, CoordI y,	CMBMode *pmbmd){	x <<= 1;	y <<= 1;	motionCompYField(m_ppxlcPredMBY,		m_pvopcRefQ0->pixelsY () + pmbmd->m_bForwardTop * m_iFrameWidthY,		x + pmvFwdTop->m_vctTrueHalfPel.x, y + pmvFwdTop->m_vctTrueHalfPel.y);	motionCompYField(m_ppxlcPredMBY + MB_SIZE,		m_pvopcRefQ0->pixelsY () + pmbmd->m_bForwardBottom * m_iFrameWidthY,		x + pmvFwdBot->m_vctTrueHalfPel.x, y + pmvFwdBot->m_vctTrueHalfPel.y);	motionCompYField(m_ppxlcPredMBBackY,		m_pvopcRefQ1->pixelsY () + pmbmd->m_bBackwardTop * m_iFrameWidthY,		x + pmvBakTop->m_vctTrueHalfPel.x, y + pmvBakTop->m_vctTrueHalfPel.y);	motionCompYField(m_ppxlcPredMBBackY + MB_SIZE,		m_pvopcRefQ1->pixelsY () + pmbmd->m_bBackwardBottom * m_iFrameWidthY,		x + pmvBakBot->m_vctTrueHalfPel.x, y + pmvBakBot->m_vctTrueHalfPel.y);		Int ic;	Int iSAD = 0;// new changes by X. Chen	if (pmbmd->m_rgTranspStatus[0]==NONE) {		for (ic = 0; ic < MB_SQUARE_SIZE; ic++)			iSAD += abs (m_ppxlcCurrMBY [ic] - ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1));	} else if (pmbmd->m_rgTranspStatus[0]==PARTIAL) {		for (ic = 0; ic < MB_SQUARE_SIZE; ic++) {			if (m_ppxlcCurrMBBY [ic] != transpValue)				iSAD += abs (m_ppxlcCurrMBY [ic] - ((m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1));		}	}// end of new changes	return iSAD;}Void CVideoObjectEncoder::motionCompInterpAndError (	const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 	CoordI x, CoordI y,	CRct *prctMVLimitForward,CRct *prctMVLimitBackward){	motionCompEncY (		m_pvopcRefQ0->pixelsY (), 		m_puciRefQZoom0->pixels (),		m_ppxlcPredMBY, MB_SIZE, pmvForward, x, y,		prctMVLimitForward	);	motionCompEncY (		m_pvopcRefQ1->pixelsY (), 		m_puciRefQZoom1->pixels (),		m_ppxlcPredMBBackY, MB_SIZE, pmvBackward, x, y,		prctMVLimitBackward	);	Int ic;	for (ic = 0; ic < MB_SQUARE_SIZE; ic++) {		m_ppxlcPredMBY [ic] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1;		m_ppxliErrorMBY [ic] = m_ppxlcCurrMBY [ic] - m_ppxlcPredMBY [ic];	}}Void CVideoObjectEncoder::motionCompInterpAndError_WithShape (	const CMotionVector* pmvForward, const CMotionVector* pmvBackward, 	CoordI x, CoordI y,	CRct *prctMVLimitForward,CRct *prctMVLimitBackward){	motionCompEncY (		m_pvopcRefQ0->pixelsY (), 		m_puciRefQZoom0->pixels (),		m_ppxlcPredMBY, MB_SIZE, pmvForward, x, y,		prctMVLimitForward	);	motionCompEncY (		m_pvopcRefQ1->pixelsY (), 		m_puciRefQZoom1->pixels (),		m_ppxlcPredMBBackY, MB_SIZE, pmvBackward, x, y,		prctMVLimitBackward	);	Int ic;	for (ic = 0; ic < MB_SQUARE_SIZE; ic++) {		if (m_ppxlcCurrMBBY [ic] == transpValue){		m_ppxlcPredMBY [ic] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1;		/*m_ppxlcPredMBY [ic] = */m_ppxliErrorMBY [ic] = 0;		}		else {			m_ppxlcPredMBY [ic] = (m_ppxlcPredMBY [ic] + m_ppxlcPredMBBackY [ic] + 1) >> 1;			m_ppxliErrorMBY [ic] = m_ppxlcCurrMBY [ic] - m_ppxlcPredMBY [ic];		}	}}

⌨️ 快捷键说明

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