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

📄 sys_encoder_motest.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		if (!m_volmd.bOriginalForME) m_iMVFileUsage = 0;  // 04/28/99  must not use mv file based on reconstructed vop		iSADDirect = blkmatch16WithShape  (rgmvDirectForward, iXInit, iYInit, x, y, iSADDirect, ppxlcInitRefMBY,	        m_puciRefQZoom0, pmbmd, m_vopmd.iDirectModeRadius, m_volmd.bQuarterSample,0) - FAVOR_DIRECT;		m_iMVFileUsage = isave;                           // 04/28/99 		rgmvDirectForward->computeTrueMV ();		rgmvDirectForward->computeMV ();		pmbmd->m_vctDirectDeltaMV = rgmvDirectForward->m_vctTrueHalfPel - vctRefScaled;		backwardMVFromForwardMV (rgmvDirectBack [0], rgmvDirectForward [0], *pmvRef, 								 pmbmd->m_vctDirectDeltaMV);		iSADDirect = interpolateAndDiffY (rgmvDirectForward, rgmvDirectBack, x, y,										  &m_rctRefVOPY0, &m_rctRefVOPY1);// GMC		if(pmbmdRef->m_bMCSEL)			iSADDirect -= FAVORZERO;		else// ~GMC		if (pmbmd->m_vctDirectDeltaMV.x == 0 && pmbmd->m_vctDirectDeltaMV.y == 0)			iSADDirect -= FAVORZERO;	}	iInitSAD = sad16x16At0WithShape (ppxlcRef1MBY, pmbmd);//shouldn't favor 0 mv inside this function    Int iSADBackward = blkmatch16WithShape (pmvBackward, x, y, x, y, iInitSAD, ppxlcRef1MBY,	    m_puciRefQZoom1, pmbmd, m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample,1);	pmvBackward->computeTrueMV ();	pmvBackward->computeMV ();	Int iSADInterpolate = interpolateAndDiffY_WithShape (		pmvForward, pmvBackward,		x, y, &m_rctRefVOPY0, &m_rctRefVOPY1	);	Int iSADMin = minimum (iSADDirect, iSADForward, iSADBackward, iSADInterpolate);	Int iBlk;		if(m_bCodedFutureRef==FALSE)		iSADMin = iSADForward; // force forward mode		if (iSADMin == iSADDirect) {		pmbmd->m_mbType = DIRECT;		//compute backward mv		pmvForward [0] = rgmvDirectForward [0];		pmvBackward [0] = rgmvDirectBack [0];		for (iBlk = 1; iBlk <= 4; iBlk++) {			pmvForward [iBlk] = pmvForward [0];			pmvBackward [iBlk] = pmvBackward [0];		}	}	else if (iSADMin == iSADForward) {		pmbmd->m_mbType = FORWARD;		for (iBlk = 1; iBlk <= 4; iBlk++)			pmvForward [iBlk] = pmvForward [0];	}	else if (iSADMin == iSADBackward) {		pmbmd->m_mbType = BACKWARD;		for (iBlk = 1; iBlk <= 4; iBlk++)			pmvBackward [iBlk] = pmvBackward [0];	}	else {		pmbmd->m_mbType = INTERPOLATE;		for (iBlk = 1; iBlk <= 4; iBlk++) {			pmvForward [iBlk] = pmvForward [0];			pmvBackward [iBlk] = pmvBackward [0];		}	}	return iSADMin;}//OBSS_SAIT_991015Int CVideoObjectEncoder::motionEstMB_BVOP_WithShape (	CoordI x, CoordI y, CMotionVector* pmvForward, CMotionVector* pmvBackward,	CMBMode* pmbmd, const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY){	Int numForePixel=0;Bool BackwardSkipped = FALSE;			assert (pmbmd->m_rgTranspStatus [0] == PARTIAL);	Int iInitSAD = sad16x16At0WithShape (ppxlcRef0MBY, pmbmd);	//shouldn't favor 0 mv inside this function	Int iSADForward = blkmatch16WithShape (pmvForward, x, y, x, y, iInitSAD, ppxlcRef0MBY,        m_puciRefQZoom0, pmbmd, m_vopmd.iSearchRangeForward,m_volmd.bQuarterSample,0);	pmvForward->computeTrueMV ();	//	Int iSADDirect = 1000000000;	iInitSAD = sad16x16At0WithShape (ppxlcRef1MBY, pmbmd, &numForePixel);	Int iSADBackward = iInitSAD;	*pmvBackward = CMotionVector( 0, 0 );	pmvBackward->computeTrueMV ();	BackwardSkipped = quantizeTextureMBBackwardCheck (pmbmd, m_ppxlcCurrMBY, m_ppxlcCurrMBBY, ppxlcRef1MBY);	Int iSADInterpolate = interpolateAndDiffY_WithShape(pmvForward, pmvBackward, x, y,							&m_rctRefVOPY0, &m_rctRefVOPY1);		Int iSADMin = 0;	if(BackwardSkipped)									iSADMin = iSADBackward;				else {		if(iSADForward <= iSADBackward && iSADForward <= iSADInterpolate)			iSADMin = iSADForward;		else if (iSADBackward <= iSADInterpolate)			iSADMin = iSADBackward;		else			iSADMin = iSADInterpolate;	}	Int iBlk;	if (iSADMin == iSADForward) {		pmbmd->m_mbType = FORWARD;		for (iBlk = 1; iBlk <= 4; iBlk++)			pmvForward [iBlk] = pmvForward [0];	}	else if (iSADMin == iSADBackward) {		pmbmd->m_mbType = BACKWARD;		for (iBlk = 1; iBlk <= 4; iBlk++)			pmvBackward [iBlk] = pmvBackward [0];	}	else {		pmbmd->m_mbType = INTERPOLATE;		for (iBlk = 1; iBlk <= 4; iBlk++) {			pmvForward [iBlk] = pmvForward [0];			pmvBackward [iBlk] = pmvBackward [0];		}	}	return iSADMin;}//~OBSS_SAIT_991015// INTERLACE#define	BbiasAgainstFrameAve	((MB_SIZE*MB_SIZE)/2 + 1)		// Biases favor modes with fewer MVs#define BbiasAgainstFieldAve	((MB_SIZE*MB_SIZE)/1 + 1)#define BbiasAgainstField		((MB_SIZE*MB_SIZE)/2 + 1)#define	BbiasFavorDirect		((MB_SIZE*MB_SIZE)/2 + 1)Int CVideoObjectEncoder::motionEstMB_BVOP_Interlaced (	CoordI x, CoordI y, 	CMotionVector* pmvForward, CMotionVector* pmvBackward,	CMBMode* pmbmd,	const CMBMode* pmbmdRef, const CMotionVector* pmvRef,	const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,	Bool bColocatedMBExist){	Int iSAD, iSADnobias, iFieldSAD, iSADFrmMB[3];	MBType mbtype;	iSADFrmMB[0] = blkmatch16(pmvForward, x, y,x,y, sad16x16At0 (ppxlcRef0MBY),		ppxlcRef0MBY, m_puciRefQZoom0, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);	pmvForward->computeTrueMV ();	pmvForward->computeMV ();    	iSADFrmMB[1] = blkmatch16(pmvBackward, x, y,x,y, sad16x16At0 (ppxlcRef1MBY),		ppxlcRef1MBY, m_puciRefQZoom1, m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample);	pmvBackward->computeTrueMV ();	pmvBackward->computeMV ();	iSADFrmMB[2] = interpolateAndDiffY(pmvForward, pmvBackward, x, y		, &m_rctRefVOPY0, &m_rctRefVOPY1);#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSADFrmMB, 3, "SADFrmMB");#endif // __TRACE_AND_STATS_	// Choose best 16x16 mode	pmbmd->m_bFieldMV = FALSE;	if (iSADFrmMB[0] < iSADFrmMB[1]) {		iSAD = iSADFrmMB[0];		pmbmd->m_mbType = FORWARD;	} else {		iSAD = iSADFrmMB[1];		pmbmd->m_mbType = BACKWARD;	}	iSADnobias = iSAD;	if ((iSADFrmMB[2] + BbiasAgainstFrameAve) < iSAD) {		iSAD = iSADFrmMB[2] + BbiasAgainstFrameAve;		iSADnobias = iSADFrmMB[2];		pmbmd->m_mbType = INTERPOLATE;	}			if(m_bCodedFutureRef==FALSE)	{		iSAD = iSADFrmMB[0];		pmbmd->m_mbType = FORWARD; // force forward mode	}		if (m_vopmd.bInterlace) {		const PixelC *ppxlcFwdHalfPelRef = m_pvopcRefQ0->pixelsY()			+EXPANDY_REF_FRAME * m_iFrameWidthY + EXPANDY_REF_FRAME+ x + y * m_iFrameWidthY; // 1.31.99 changes		const PixelC *ppxlcBakHalfPelRef = m_pvopcRefQ1->pixelsY()			+EXPANDY_REF_FRAME * m_iFrameWidthY + EXPANDY_REF_FRAME+ x + y * m_iFrameWidthY; // 1.31.99 changes		Int iSADFldMB[3], iSADFld[8];		// Choose best fwd top field predictor    // ppxlc???HalfPelRef is not zoomed [interpolation within blkmatch??()]		iSADFld[0] = blkmatch16x8 (pmvForward+1, x, y, 0,			ppxlcRef0MBY, ppxlcFwdHalfPelRef, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);		pmvForward[1].computeTrueMV();		pmvForward[1].computeMV();		iSADFld[1] = blkmatch16x8 (pmvForward+2, x, y, 0,			ppxlcRef0MBY + m_iFrameWidthY, ppxlcFwdHalfPelRef + m_iFrameWidthY,			m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);		pmvForward[2].computeTrueMV();		pmvForward[2].computeMV();		if (iSADFld[0] <= iSADFld[1]) {			pmbmd->m_bForwardTop = 0;			iSADFldMB[0] = iSADFld[0];		} else {			pmbmd->m_bForwardTop = 1;			iSADFldMB[0] = iSADFld[1];		}		// Choose best fwd botton field predictor		iSADFld[2] = blkmatch16x8 (pmvForward+3, x, y, MB_SIZE,			ppxlcRef0MBY, ppxlcFwdHalfPelRef, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);		pmvForward[3].computeTrueMV();		pmvForward[3].computeMV();		iSADFld[3] = blkmatch16x8 (pmvForward+4, x, y, MB_SIZE,			ppxlcRef0MBY + m_iFrameWidthY, ppxlcFwdHalfPelRef + m_iFrameWidthY,			m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);		pmvForward[4].computeTrueMV();		pmvForward[4].computeMV();		if (iSADFld[2] < iSADFld[3]) {			pmbmd->m_bForwardBottom = 0;			iSADFldMB[0] += iSADFld[2];		} else {			pmbmd->m_bForwardBottom = 1;			iSADFldMB[0] += iSADFld[3];		}				// Choose best bak top field predictor		iSADFld[4] = blkmatch16x8 (pmvBackward+1, x, y, 0,			ppxlcRef1MBY, ppxlcBakHalfPelRef, m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample);		pmvBackward[1].computeTrueMV();		pmvBackward[1].computeMV();		iSADFld[5] = blkmatch16x8 (pmvBackward+2, x, y, 0,			ppxlcRef1MBY + m_iFrameWidthY, ppxlcBakHalfPelRef + m_iFrameWidthY,			m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample);		pmvBackward[2].computeTrueMV();		pmvBackward[2].computeMV();		if (iSADFld[4] <= iSADFld[5]) {			pmbmd->m_bBackwardTop = 0;			iSADFldMB[1] = iSADFld[4];		} else {			pmbmd->m_bBackwardTop = 1;			iSADFldMB[1] = iSADFld[5];		}		// Choose best bak bottom field predictor		iSADFld[6] = blkmatch16x8 (pmvBackward+3, x, y, MB_SIZE,			ppxlcRef1MBY, ppxlcBakHalfPelRef, m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample);		pmvBackward[3].computeTrueMV();		pmvBackward[3].computeMV();		iSADFld[7] = blkmatch16x8 (pmvBackward+4, x, y, MB_SIZE,			ppxlcRef1MBY + m_iFrameWidthY, ppxlcBakHalfPelRef + m_iFrameWidthY,			m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample);		pmvBackward[4].computeTrueMV();		pmvBackward[4].computeMV();		if (iSADFld[6] < iSADFld[7]) {			pmbmd->m_bBackwardBottom = 0;			iSADFldMB[1] += iSADFld[6];		} else {			pmbmd->m_bBackwardBottom = 1;			iSADFldMB[1] += iSADFld[7];		}		// Choose best of forward & backward field prediction		if (iSADFldMB[0] <= iSADFldMB[1]) {			iFieldSAD = iSADFldMB[0];			mbtype = FORWARD;		} else {			iFieldSAD = iSADFldMB[1];			mbtype = BACKWARD;		}		iFieldSAD += BbiasAgainstField;		iSADFldMB[2] = interpolateAndDiffYField(			pmvForward  + 1 + (int)pmbmd->m_bForwardTop,			pmvForward  + 3 + (int)pmbmd->m_bForwardBottom,			pmvBackward + 1 + (int)pmbmd->m_bBackwardTop,			pmvBackward + 3 + (int)pmbmd->m_bBackwardBottom,			x, y, pmbmd);		if ((iSADFldMB[2] + BbiasAgainstFieldAve) < iFieldSAD) {			iFieldSAD = iSADFldMB[2] + BbiasAgainstFieldAve;			mbtype = INTERPOLATE;		}		if(m_bCodedFutureRef==FALSE) // FORCE FORWARD		{			iFieldSAD = iSADFldMB[0];			mbtype = FORWARD;		}		// Field versus Frame prediction		if (iFieldSAD < iSAD) {			pmbmd->m_bFieldMV = TRUE;			pmbmd->m_mbType = mbtype;			iSAD = iFieldSAD;			iSADnobias = iFieldSAD - ((mbtype == INTERPOLATE) ? BbiasAgainstFieldAve : BbiasAgainstField);		}#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (iSADFld,   8, "SADFld");		m_pbitstrmOut->trace (iSADFldMB, 3, "SADFldMB");#endif // __TRACE_AND_STATS_	}#if 1				// #if 0 to temporarily disable direct mode (debug only)	// Check direct mode	Int iSADDirect = 0;	if (m_volmd.fAUsage == RECTANGLE) {			iSADDirect= (pmbmdRef->m_bFieldMV && !pmbmdRef->m_bMCSEL) ? // GMC		directSADField(x, y, pmbmd, pmbmdRef, pmvRef, ppxlcRef0MBY, ppxlcRef1MBY) :		directSAD     (x, y, pmbmd, pmbmdRef, pmvRef);		if ((iSADDirect - BbiasFavorDirect) < iSAD) {			pmbmd->m_mbType = DIRECT;			pmbmd->m_bFieldMV = pmbmdRef->m_bFieldMV;			iSADnobias = iSADDirect;		}	}#endif#ifdef __TRACE_AND_STATS_	static char *cDirectType[] = {	"FrmDirectSAD", "FldDirectSAD" };	static char *cWinner[] = { "FrmDirect\n", "FrmAve\n", "FrmBak\n", "FrmFwd\n", "FldDirect\n", "FldAve\n", "FldBak\n", "FldFwd\n" };	if(bColocatedMBExist)      m_pbitstrmOut->trace (iSADDirect, cDirectType[pmbmdRef->m_bFieldMV]);	m_pbitstrmOut->trace (cWinner[(Int)pmbmd->m_mbType + 4*pmbmd->m_bFieldMV]);#if 0				// Put all MV candidates in trace file	Int iMV[10];	iMV[0] = pmvForward[0].m_vctTrueHalfPel.x; iMV[1] = pmvForward[0].m_vctTrueHalfPel.y;	iMV[2] = pmvForward[1].m_vctTrueHalfPel.x; iMV[3] = pmvForward[1].m_vctTrueHalfPel.y;	iMV[4] = pmvForward[2].m_vctTrueHalfPel.x; iMV[5] = pmvForward[2].m_vctTrueHalfPel.y;	iMV[6] = pmvForward[3].m_vctTrueHalfPel.x; iMV[7] = pmvForward[3].m_vctTrueHalfPel.y;	iMV[8] = pmvForward[4].m_vctTrueHalfPel.x; iMV[9] = pmvForward[4].m_vctTrueHalfPel.y;	m_pbitstrmOut->trace (iMV, 10, "FwdMV");	iMV[0] = pmvBackward[0].m_vctTrueHalfPel.x; iMV[1] = pmvBackward[0].m_vctTrueHalfPel.y;	iMV[2] = pmvBackward[1].m_vctTrueHalfPel.x; iMV[3] = pmvBackward[1].m_vctTrueHalfPel.y;	iMV[4] = pmvBackward[2].m_vctTrueHalfPel.x; iMV[5] = pmvBackward[2].m_vctTrueHalfPel.y;	iMV[6] = pmvBackward[3].m_vctTrueHalfPel.x; iMV[7] = pmvBackward[3].m_vctTrueHalfPel.y;	iMV[8] = pmvBackward[4].m_vctTrueHalfPel.x; iMV[9] = pmvBackward[4].m_vctTrueHalfPel.y;	m_pbitstrmOut->trace (iMV, 10, "BakMV");#endif#endif // __TRACE_AND_STATS_	pmbmd->m_bhas4MVForward  = FALSE;	pmbmd->m_bhas4MVBackward = FALSE;	return iSADnobias;}//end of INTERLACED//INTERLACED// new changesInt CVideoObjectEncoder::motionEstMB_BVOP_InterlacedWithShape (	CoordI x, CoordI y, 	CMotionVector* pmvForward, CMotionVector* pmvBackward,	CMBMode* pmbmd,	const CMBMode* pmbmdRef, const CMotionVector* pmvRef,	const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,	Bool bColocatedMBExist){	assert (pmbmd->m_rgTranspStatus [0] == PARTIAL);	Int iSAD, iSADnobias, iFieldSAD, iSADFrmMB[3];	MBType mbtype;	iSADFrmMB[0] = blkmatch16WithShape(pmvForward, x, y,x,y, sad16x16At0WithShape (ppxlcRef0MBY,pmbmd),		ppxlcRef0MBY, m_puciRefQZoom0, pmbmd, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);	pmvForward->computeTrueMV ();	pmvForward->computeMV (); // to make pmv unique	iSADFrmMB[1] = blkmatch16WithShape(pmvBackward, x, y,x,y, sad16x16At0WithShape (ppxlcRef1MBY,pmbmd),		ppxlcRef1MBY, m_puciRefQZoom1, pmbmd, m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample,1);	pmvBackward->computeTrueMV ();	pmvBackward->computeMV (); // to make pmv unique	iSADFrmMB[2] = interpolateAndDiffY_WithShape(pmvForward, pmvBackward, x, y		, &m_rctRefVOPY0, &m_rctRefVOPY1);#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSADFrmMB, 3, "S

⌨️ 快捷键说明

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