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

📄 motest.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			iTempY2 = pmv[7].m_vctTrueHalfPel.y;		}		iSADInter = iSAD16x8 + FAVOR_FIELD;		Int iTemp;		for (UInt i = 1; i < 5; i++) {			iTemp = iTempX1 + iTempX2;			pmv [i].m_vctTrueHalfPel.x = (iTemp & 3) ? ((iTemp>>1) | 1) : (iTemp>>1);			iTemp = iTempY1 + iTempY2;			pmv [i].m_vctTrueHalfPel.y = (iTemp & 3) ? ((iTemp>>1) | 1) : (iTemp>>1);			pmv[i].computeMV (); 		}	}	//end of new changes// ~INTERLACE	else {		pmv [1].computeTrueMV ();		pmv [2].computeTrueMV ();		pmv [3].computeTrueMV ();		pmv [4].computeTrueMV ();		pmv [1].computeMV ();		pmv [2].computeMV ();		pmv [3].computeMV ();		pmv [4].computeMV ();		pmbmd -> m_bhas4MVForward = TRUE;		iSADInter = iSAD8;	}// GMC	pmbmd -> m_bMCSEL = FALSE;	if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE){		Int iNb = pmbmd->m_rgNumNonTranspPixels [0] ;		Int iMSADG = 4096*256;		PixelC* ppxlcRefforgme = (PixelC*) m_pvopcRefQ0->pixelsY () ;		iMSADG = globalme (x,y,ppxlcRefforgme);#ifdef __TRACE_AND_STATS_		m_pbitstrmOut->trace (iMSADG, "MB_GMC");#endif // __TRACE_AND_STATS_		Int ioffset, iQP=m_uiGMCQP; // GMC_V2 *m_rgiQPpred;		if(pmbmd -> m_bhas4MVForward == TRUE)			ioffset = iQP*iNb/16;			//ioffset = iQP*iNb/24;		else		{			if(pmbmd -> m_bFieldMV == TRUE)			{				ioffset = iQP*iNb/32;			}else{				if(pmv->m_vctTrueHalfPel.x == 0 && pmv->m_vctTrueHalfPel.y == 0)					ioffset = iFavor16x16*2;				else					ioffset = iQP*iNb/64;			}		}		if((iMSADG - ioffset) <= iSADInter)		{			iSADInter = iMSADG;			pmbmd -> m_dctMd = INTER;			pmbmd -> m_bFieldMV = FALSE;			pmbmd -> m_bhas4MVForward = FALSE;			pmbmd -> m_bMCSEL = TRUE;			Int iPmvx, iPmvy, iHalfx, iHalfy;			globalmv (iPmvx, iPmvy, iHalfx, iHalfy,				x,y,m_vopmd.mvInfoForward.uiRange,m_volmd.bQuarterSample);			*pmv = CMotionVector (iPmvx, iPmvy);			pmv -> iHalfX = iHalfx;			pmv -> iHalfY = iHalfy;			pmv -> computeTrueMV ();			pmv -> computeMV ();			for (UInt i = 1; i < PVOP_MV_PER_REF_PER_MB; i++)				pmv[i] = *pmv;		}		else		{			pmbmd -> m_bMCSEL = FALSE;		}	}// ~GMC/* NBIT: change	if (iSumDev < (iSADInter - (pmbmd->m_rgNumNonTranspPixels [0] << 1))) {*/// GMC	Int iIntraOffset;	if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)		iIntraOffset = iFavorInter;		//iIntraOffset = iFavorInter/2;	else		iIntraOffset = iFavorInter;// ~GMC	if (iSumDev < (iSADInter - iIntraOffset)) { // GMC		pmbmd -> m_bSkip = FALSE;		pmbmd -> m_dctMd = INTRA;// new changes		pmbmd -> m_bFieldMV = FALSE;// GMC		pmbmd -> m_bMCSEL = FALSE;// ~GMC		memset (pmv, 0, PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));		return ((m_uiRateControl==RC_MPEG4) ? sumAbsCurrMB () : 0);	}	else {		pmbmd -> m_dctMd = INTER;// new changes		if (pmbmd->m_bhas4MVForward == FALSE			&& pmbmd -> m_bFieldMV == FALSE// GMC			&& pmbmd -> m_bMCSEL == FALSE// ~GMC			&& pmv->m_vctTrueHalfPel.x == 0 && pmv->m_vctTrueHalfPel.y == 0)			return (iSADInter + iFavorZero);		else 			return iSADInter;	}}CMotionVector rgmvDirectBack [5];CMotionVector rgmvDirectForward [5];Int CVideoObjectEncoder::motionEstMB_BVOP (	CoordI x, CoordI y, 	CMotionVector* pmvForward, CMotionVector* pmvBackward,	CMBMode* pmbmd,	const CMBMode* pmbmdRef, const CMotionVector* pmvRef,	const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,	Bool bColocatedMBExist){  //for QuarterPel mwi 21JUL98    const CMotionVector* pmvRefBlk = pmvRef;    CMotionVector* pmvDirectForward = rgmvDirectForward;    CMotionVector* pmvDirectBack = rgmvDirectBack;    //~for QuarterPel mwi 21JUL98 	Int iInitSAD = sad16x16At0 (ppxlcRef0MBY) + FAVORZERO;	Int iSADForward = blkmatch16 (pmvForward, x, y, x, y, iInitSAD, ppxlcRef0MBY, m_puciRefQZoom0, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);	pmvForward->computeTrueMV ();	pmvForward->computeMV ();	Int iSADDirect = 1000000000;	CVector vctRefScaled;	// TPS FIX	// QuarterPel mwi 21JUL98	// 	if (bColocatedMBExist && pmbmdRef->m_bhas4MVForward == FALSE &&	// 		(m_volmd.volType != ENHN_LAYER || ( m_vopmd.iRefSelectCode != 1 && m_vopmd.iRefSelectCode != 2))) {	if (bColocatedMBExist &&      (m_volmd.volType != ENHN_LAYER || ( m_vopmd.iRefSelectCode != 1 && m_vopmd.iRefSelectCode != 2))) {	  iSADDirect = directSAD(x, y, pmbmd, pmbmdRef, pmvRef);	  Int iPartInterval = m_t - m_tPastRef;		  Int iFullInterval = m_tFutureRef - m_tPastRef;	  for (Int iBlkNo=1; iBlkNo<=4; iBlkNo++) {	    pmvDirectForward++;	    pmvDirectBack++;	    pmvRefBlk++;	        	    vctRefScaled = pmvRefBlk->trueMVHalfPel () * iPartInterval;        	    vctRefScaled.x /= iFullInterval;	    vctRefScaled.y /= iFullInterval;	    //set up forward vector; 	    pmvDirectForward->m_vctTrueHalfPel.x = vctRefScaled.x + pmbmd->m_vctDirectDeltaMV.x;	    pmvDirectForward->m_vctTrueHalfPel.y = vctRefScaled.y + pmbmd->m_vctDirectDeltaMV.y;	    pmvDirectForward->computeMV ();	    //set up backward vector	    backwardMVFromForwardMV (rgmvDirectBack [iBlkNo], rgmvDirectForward [iBlkNo], *pmvRefBlk, pmbmd->m_vctDirectDeltaMV);	  }// GMC		if(pmbmdRef->m_bMCSEL)			iSADDirect -= FAVORZERO;		else		if (pmbmd->m_vctDirectDeltaMV.x == 0 && pmbmd->m_vctDirectDeltaMV.y == 0)        		iSADDirect -= FAVORZERO;	}// ~GMC	  //		Int iPartInterval = m_t - m_tPastRef;		//initialize at MVDB = 0	  //vctRefScaled = pmvRef->trueMVHalfPel () * iPartInterval;	  //Int iFullInterval = m_tFutureRef - m_tPastRef;		//        //for QuarterPel mwi 21JUL98		//        iSADDirect = 0;      		//        Int iBlkNo;		//        for (iBlkNo=1; iBlkNo<=4; iBlkNo++) {		//          pmvDirectForward++;		//          pmvDirectBack++;		//          pmvRefBlk++;		//        		//          vctRefScaled = pmvRefBlk->trueMVHalfPel () * iPartInterval;        		//          vctRefScaled.x /= iFullInterval;		//          vctRefScaled.y /= iFullInterval;		//          //set up initial forward vector; 		//          pmvDirectForward->m_vctTrueHalfPel.x = vctRefScaled.x; //trueHalfPel!!		//          pmvDirectForward->m_vctTrueHalfPel.y = vctRefScaled.y;		//          pmvDirectForward->computeMV ();		//          //set up initial backward vector		//          pmbmd->m_vctDirectDeltaMV = pmvDirectForward->m_vctTrueHalfPel - vctRefScaled; //		//          backwardMVFromForwardMV (rgmvDirectBack [iBlkNo], rgmvDirectForward [iBlkNo], *pmvRefBlk, pmbmd->m_vctDirectDeltaMV);		//          //compute initial sad		//          iSADDirect += interpolateAndDiffY8 (rgmvDirectForward, rgmvDirectBack, x, y, iBlkNo,		//                                              &m_rctRefVOPY0, &m_rctRefVOPY1) - FAVORZERO;		//        }        // 		vctRefScaled.x /= iFullInterval;				//truncation as per vm        // 		vctRefScaled.y /= iFullInterval;				//truncation as per vm        // 		//set up initial forward vector;         // 		rgmvDirectForward->iMVX = vctRefScaled.x / 2;        // 		rgmvDirectForward->iMVY = vctRefScaled.y / 2;        // 		rgmvDirectForward->iHalfX = 0;        // 		rgmvDirectForward->iHalfY = 0;        // 		rgmvDirectForward->computeTrueMV ();        // 		//set up initial backward vector        // 		pmbmd->m_vctDirectDeltaMV = rgmvDirectForward->m_vctTrueHalfPel - vctRefScaled;	//mvdb not necessaryly 0 due to truncation of half pel         // 		backwardMVFromForwardMV (rgmvDirectBack [0], rgmvDirectForward [0], *pmvRef, pmbmd->m_vctDirectDeltaMV);        // 		//compute initial sad        // 		iSADDirect = interpolateAndDiffY (rgmvDirectForward, rgmvDirectBack, x, y,        // 			&m_rctRefVOPY0, &m_rctRefVOPY1) - FAVORZERO;        // 		//set up inital position in ref frame        // 		Int iXInit = x + rgmvDirectForward->iMVX;        // 		Int iYInit = y + rgmvDirectForward->iMVY;        // 		const PixelC* ppxlcInitRefMBY = m_pvopcRefQ0->pixelsY () + m_rctRefFrameY.offset (iXInit, iYInit);        // 		//compute forward mv and sad; to be continue in iSADMin==iSADDirect        // 		iSADDirect = blkmatch16 (rgmvDirectForward, iXInit, iYInit, x, y, iSADDirect, ppxlcInitRefMBY,        // 	       	m_puciRefQZoom0, m_vopmd.iDirectModeRadius, m_volmd.bQuarterSample) - FAVOR_DIRECT;        // 		rgmvDirectForward->computeTrueMV ();        // 		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;        // ~for QuarterPel mwi 21JUL98			iInitSAD = sad16x16At0 (ppxlcRef1MBY) + FAVORZERO;	Int iSADBackward = blkmatch16 (pmvBackward, x, y, x, y, iInitSAD, ppxlcRef1MBY, m_puciRefQZoom1, m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample);	pmvBackward->computeTrueMV ();	pmvBackward->computeMV ();	Int iSADInterpolate = interpolateAndDiffY (		pmvForward, pmvBackward,		x, y, &m_rctRefVOPY0, &m_rctRefVOPY1	);	Int iSADMin = minimum (iSADDirect, iSADForward, iSADBackward, iSADInterpolate);		if(m_bCodedFutureRef==FALSE)		iSADMin = iSADForward; // force forward mode		Int iBlk;	if (iSADMin == iSADDirect) {		pmbmd->m_mbType = DIRECT;		//compute backward mv		//pmvForward [0]  = rgmvDirectForward  [0];		//pmvBackward [0] = rgmvDirectBack [0];		for (iBlk = 0; iBlk <= 4; iBlk++) {		  pmvForward [iBlk] = rgmvDirectForward [iBlk];		  pmvBackward [iBlk] = rgmvDirectBack [iBlk];		}	}	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;}// for spatial scalability onlyInt CVideoObjectEncoder::motionEstMB_BVOP (	CoordI x, CoordI y, 	CMotionVector* pmvForward, CMotionVector* pmvBackward,	CMBMode* pmbmd,	const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY){	Int iInitSAD = sad16x16At0 (ppxlcRef0MBY);	Int iSADForward = blkmatch16 (pmvForward, x, y,x,y, iInitSAD, ppxlcRef0MBY, m_puciRefQZoom0, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);	pmvForward->computeTrueMV ();	pmvForward->computeMV ();	//	Int iSADDirect = 1000000000;	iInitSAD = sad16x16At0 (ppxlcRef1MBY);	Int iSADBackward = iInitSAD;	*pmvBackward = CMotionVector (0,0);	pmvBackward->computeTrueMV ();	pmvBackward->computeMV ();	Int iSADInterpolate = interpolateAndDiffY (pmvForward, pmvBackward, x, y,			&m_rctRefVOPY0, &m_rctRefVOPY1);	Int iSADMin=0;	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;}Int CVideoObjectEncoder::motionEstMB_BVOP_WithShape (	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 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 ();	pmvForward->computeMV ();	Int iSADDirect = 1000000000;	CVector vctRefScaled;	if (bColocatedMBExist && pmbmdRef->m_bhas4MVForward == FALSE && 		(m_volmd.volType != ENHN_LAYER || ( m_vopmd.iRefSelectCode != 1 && m_vopmd.iRefSelectCode != 2))) {		Int iPartInterval = m_t - m_tPastRef;		//initialize at MVDB = 0		vctRefScaled = pmvRef->trueMVHalfPel () * iPartInterval;		Int iFullInterval = m_tFutureRef - m_tPastRef;		vctRefScaled.x /= iFullInterval;						//truncation as per vm		vctRefScaled.y /= iFullInterval;						//truncation as per vm		//set up initial forward vector; 		rgmvDirectForward->iMVX = vctRefScaled.x / 2;		rgmvDirectForward->iMVY = vctRefScaled.y / 2;		rgmvDirectForward->iHalfX = 0;		rgmvDirectForward->iHalfY = 0;		rgmvDirectForward->computeTrueMV ();		rgmvDirectForward->computeMV ();		//set up initial backward vector		pmbmd->m_vctDirectDeltaMV = rgmvDirectForward->m_vctTrueHalfPel - vctRefScaled;	//mvdb not necessaryly 0 due to truncation of half pel 		backwardMVFromForwardMV (rgmvDirectBack [0], rgmvDirectForward [0], *pmvRef, pmbmd->m_vctDirectDeltaMV);		//compute initial sad		iSADDirect = interpolateAndDiffY_WithShape (rgmvDirectForward, rgmvDirectBack, x, y,			&m_rctRefVOPY0, &m_rctRefVOPY1) - FAVORZERO;;		//set up inital position in ref frame		Int iXInit = x + rgmvDirectForward->iMVX;		Int iYInit = y + rgmvDirectForward->iMVY;		const PixelC* ppxlcInitRefMBY = m_pvopcRefQ0->pixelsY () + m_rctRefFrameY.offset (iXInit, iYInit);		//compute forward mv and sad; to be continue in iSADMin==iSADDirect		Int isave = m_iMVFileUsage;                       // 04/28/99 david ruhoff

⌨️ 快捷键说明

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