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

📄 sys_encoder_motest.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	m_pbitstrmOut->trace (iSAD8, "MB_SAD8");#endif // __TRACE_AND_STATS_	iSAD8 += blockmatch8 (ppxlcCodedBlkY, pmv8, x, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);	pmv8++;// RRV modification	ppxlcCodedBlkY += (BLOCK_SIZE *m_iRRVScale);//	ppxlcCodedBlkY += BLOCK_SIZE;// ~RRV#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSAD8, "MB_SAD8");#endif // __TRACE_AND_STATS_	iSAD8 += blockmatch8 (ppxlcCodedBlkY, pmv8, blkX, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSAD8, "MB_SAD8");#endif // __TRACE_AND_STATS_	#endif // DISABLE_4MV_FOR_PVOP/* NBIT: change	iSADInter -= FAVOR_16x16;*/// RRV modification	if(m_vopmd.RRVmode.iRRVOnOff == 1)	{		iSADInter	-= iFavor32x32;		iSAD16x8	-= FAVOR_FIELD_RRV;	}	else	{		iSADInter	-= iFavor16x16;		iSAD16x8	-= FAVOR_FIELD;	}//	iSADInter -= iFavor16x16;//	iSAD16x8 -= FAVOR_FIELD;// ~RRV	if ((iSADInter <= iSAD8) && (iSADInter <= iSAD16x8)) {/* NBIT: change	    iSADInter += FAVOR_16x16;*/// RRV modification		if(m_vopmd.RRVmode.iRRVOnOff == 1)		{			iSADInter += iFavor32x32;		}		else		{			iSADInter += iFavor16x16;		}//	    iSADInter += iFavor16x16;// ~RRV		pmbmd -> m_bhas4MVForward = FALSE;		pmv -> computeTrueMV (); // compute here instead of blkmatch to save computation		pmv -> computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)		for (UInt i = 1; i < PVOP_MV_PER_REF_PER_MB; i++) {// didn't increment the last pmv          pmv[i].m_vctTrueHalfPel = pmv->m_vctTrueHalfPel;	// Save (iMVX, iMVY) for MV file          pmv[i].computeMV();        }                	}// INTERLACE	else if (iSAD16x8 <= iSAD8) { // Field-based		pmbmd -> m_bhas4MVForward = FALSE;		pmbmd -> m_bFieldMV = TRUE;		Int iTempX1, iTempY1, iTempX2, iTempY2;		if(pmbmd->m_bForwardTop) {			pmv [6].computeTrueMV ();            pmv [6].computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)			iTempX1 = pmv[6].m_vctTrueHalfPel.x;			iTempY1 = pmv[6].m_vctTrueHalfPel.y;		}		else {			pmv [5].computeTrueMV ();            pmv [5].computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)			iTempX1 = pmv[5].m_vctTrueHalfPel.x;			iTempY1 = pmv[5].m_vctTrueHalfPel.y;		}		if(pmbmd->m_bForwardBottom) {			pmv [8].computeTrueMV ();            pmv [8].computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)			iTempX2 = pmv[8].m_vctTrueHalfPel.x;			iTempY2 = pmv[8].m_vctTrueHalfPel.y;		}		else {			pmv [7].computeTrueMV ();            pmv [7].computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)			iTempX2 = pmv[7].m_vctTrueHalfPel.x;			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 (); 		}	}// ~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 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*256/24;			ioffset = iQP*256/16;		else		{			if(pmbmd -> m_bFieldMV == TRUE)			{				ioffset = iQP*256/32;			}else{				if(pmv->m_vctTrueHalfPel.x == 0 && pmv->m_vctTrueHalfPel.y == 0)					ioffset = iFavorZero*2;				else					ioffset = iQP*256/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 - FAVOR_INTER)) {*/// 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;		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;		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)/* NBIT: change			return (iSADInter + FAVORZERO);*/			return (iSADInter + iFavorZero);		else 			return iSADInter;	}}Int CVideoObjectEncoder::motionEstMB_PVOP_WithShape (	CoordI x, CoordI y, 	CMotionVector* pmv, CMBMode* pmbmd, 	const PixelC* ppxlcRefMBY){	assert (pmbmd->m_rgTranspStatus [0] == PARTIAL);	UInt nBits = m_volmd.nBits; // NBIT	Int iFavorZero = FAVORZERO;	Int iFavor16x16 = (pmbmd->m_rgNumNonTranspPixels [0] >> 1) + 1; // NBIT	Int iFavorInter = pmbmd->m_rgNumNonTranspPixels [0] << 1; // NBIT	// NBIT: addjust mode selection thresholds	if (nBits > 8) {		iFavor16x16 <<= (nBits-8);		iFavorInter <<= (nBits-8);		iFavorZero <<= (nBits-8);	} else if (nBits < 8) {		iFavor16x16 >>= (8-nBits);		iFavorInter >>= (8-nBits);		iFavorZero >>= (8-nBits);	}	Int iInitSAD = sad16x16At0WithShape (ppxlcRefMBY, pmbmd);	Int iSADInter = blkmatch16WithShape (pmv, x, y, x, y, iInitSAD, ppxlcRefMBY, m_puciRefQZoom0, pmbmd, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);	Int iSumDev = sumDevWithShape (pmbmd -> m_rgNumNonTranspPixels [0]);#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSADInter, "MB_SAD16");#endif // __TRACE_AND_STATS_// INTERLACE// New Changes	Int iSAD16x8 = 4096*256;	pmbmd -> m_bFieldMV = FALSE;	if(m_vopmd.bInterlace) {		// Field-Based Estimation		CMotionVector* pmv16x8 = pmv + 5;		const PixelC *ppxlcHalfPelRef = m_pvopcRefQ0->pixelsY()			+EXPANDY_REF_FRAME*m_iFrameWidthY + EXPANDY_REF_FRAME + x + y * m_iFrameWidthY; // 1.31.99 changes		// top to top		Int iSAD16x8top = blkmatch16x8WithShape (pmv16x8, x, y, 0, ppxlcRefMBY,			ppxlcHalfPelRef, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);		pmv16x8++;		// bot to top		Int iSAD16x8bot = blkmatch16x8WithShape (pmv16x8, x, y, 0, ppxlcRefMBY + m_iFrameWidthY,			ppxlcHalfPelRef + m_iFrameWidthY, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);		iSAD16x8=(iSAD16x8top<iSAD16x8bot) ? iSAD16x8top : iSAD16x8bot;		pmbmd->m_bForwardTop = (iSAD16x8top<iSAD16x8bot) ? 0 : 1;		pmv16x8++;		// top to bot		iSAD16x8top = blkmatch16x8WithShape (pmv16x8, x, y, MB_SIZE, ppxlcRefMBY,			ppxlcHalfPelRef, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);		pmv16x8++;		// bot to bot		iSAD16x8bot = blkmatch16x8WithShape (pmv16x8, x, y, MB_SIZE, ppxlcRefMBY + m_iFrameWidthY,			ppxlcHalfPelRef + m_iFrameWidthY, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0);		iSAD16x8 += (iSAD16x8top<iSAD16x8bot) ? iSAD16x8top : iSAD16x8bot;		pmbmd->m_bForwardBottom = (iSAD16x8top<iSAD16x8bot) ? 0 : 1;	} else {		iSAD16x8 = 4096*256;		for (Int iBlk = 5; iBlk <= 8; iBlk++) {  // 04/28/99 david ruhoff			pmv [iBlk] = pmv [0];   // fill in field info to make mv file deterministic		}	}#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSAD16x8, "MB_SAD16x8");#endif // __TRACE_AND_STATS_// end of New changes// ~INTERLACE	CoordI blkX, blkY;	Int iSAD8 = 0;	CMotionVector* pmv8 = pmv + 1;	blkX = x + BLOCK_SIZE;	blkY = y + BLOCK_SIZE;	const PixelC* ppxlcCodedBlkY = m_ppxlcCurrMBY;	const PixelC* ppxlcCodedBlkBY = m_ppxlcCurrMBBY;	// 8 x 8	iSAD8 += 		(pmbmd->m_rgTranspStatus [1] == PARTIAL) ? blockmatch8WithShape (ppxlcCodedBlkY, ppxlcCodedBlkBY, pmv8, x, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0) :		(pmbmd->m_rgTranspStatus [1] == NONE) ? blockmatch8 (ppxlcCodedBlkY, pmv8, x, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample) : 0;	pmv8++;	ppxlcCodedBlkY += BLOCK_SIZE;	ppxlcCodedBlkBY += BLOCK_SIZE;#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSAD8, "MB_SAD8");#endif // __TRACE_AND_STATS_	iSAD8 += 		(pmbmd->m_rgTranspStatus [2] == PARTIAL) ? blockmatch8WithShape (ppxlcCodedBlkY, ppxlcCodedBlkBY, pmv8, blkX, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0) :		(pmbmd->m_rgTranspStatus [2] == NONE)	? blockmatch8 (ppxlcCodedBlkY, pmv8, blkX, y, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample) : 0;	pmv8++;	ppxlcCodedBlkY += BLOCK_SIZE * MB_SIZE - BLOCK_SIZE;	ppxlcCodedBlkBY += BLOCK_SIZE * MB_SIZE - BLOCK_SIZE;#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSAD8, "MB_SAD8");#endif // __TRACE_AND_STATS_		iSAD8 += 		(pmbmd->m_rgTranspStatus [3] == PARTIAL) ? blockmatch8WithShape (ppxlcCodedBlkY, ppxlcCodedBlkBY, pmv8, x, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0) :		(pmbmd->m_rgTranspStatus [3] == NONE)	? blockmatch8 (ppxlcCodedBlkY, pmv8, x, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample) : 0;	pmv8++;	ppxlcCodedBlkY += BLOCK_SIZE;	ppxlcCodedBlkBY += BLOCK_SIZE;#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSAD8, "MB_SAD8");#endif // __TRACE_AND_STATS_		iSAD8 += 		(pmbmd->m_rgTranspStatus [4] == PARTIAL) ? blockmatch8WithShape (ppxlcCodedBlkY, ppxlcCodedBlkBY, pmv8, blkX, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample,0) :		(pmbmd->m_rgTranspStatus [4] == NONE)	? blockmatch8 (ppxlcCodedBlkY, pmv8, blkX, blkY, pmv, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample) : 0;#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSAD8, "MB_SAD8");#endif // __TRACE_AND_STATS_	// begin added by Sharp (98/9/10) prevents inter4v with one transp block	if (( pmbmd->m_rgTranspStatus [1] != ALL && pmbmd->m_rgTranspStatus [2] == ALL		&& pmbmd->m_rgTranspStatus [3] == ALL && pmbmd->m_rgTranspStatus [4] == ALL	)||		( pmbmd->m_rgTranspStatus [1] == ALL && pmbmd->m_rgTranspStatus [2] != ALL		&& pmbmd->m_rgTranspStatus [3] == ALL && pmbmd->m_rgTranspStatus [4] == ALL	)||		( pmbmd->m_rgTranspStatus [1] == ALL && pmbmd->m_rgTranspStatus [2] == ALL		&& pmbmd->m_rgTranspStatus [3] != ALL && pmbmd->m_rgTranspStatus [4] == ALL	)||		( pmbmd->m_rgTranspStatus [1] == ALL && pmbmd->m_rgTranspStatus [2] == ALL		&& pmbmd->m_rgTranspStatus [3] == ALL && pmbmd->m_rgTranspStatus [4] != ALL ))		iSAD8 = 256 * 4096;	// end added by Sharp (98/9/10)#ifdef __TRACE_AND_STATS_	m_pbitstrmOut->trace (iSAD8, "MB_SAD8");#endif // __TRACE_AND_STATS_/* NBIT: change	if ((iSADInter - ((pmbmd->m_rgNumNonTranspPixels [0] >> 1) + 1)) <= iSAD8) {*/// new changes	iSADInter -= iFavor16x16;	iSAD16x8 -= FAVOR_FIELD;	if ((iSADInter <= iSAD8)&&(iSADInter <= iSAD16x8)) {		iSADInter += iFavor16x16;// end of new changes		pmbmd -> m_bhas4MVForward = FALSE;		pmv -> computeTrueMV (); // compute here instead of blkmatch to save computation		pmv -> computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)		for (UInt i = 1; i < PVOP_MV_PER_REF_PER_MB; i++) // didn't increment the last pmv			pmv [i] = *pmv;	}// INTERLACE	// new changes	else if (iSAD16x8 <= iSAD8) { // Field-based		pmbmd -> m_bhas4MVForward = FALSE;		pmbmd -> m_bFieldMV = TRUE;		Int iTempX1, iTempY1, iTempX2, iTempY2;		if(pmbmd->m_bForwardTop) {			pmv [6].computeTrueMV ();			pmv [6].computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)			iTempX1 = pmv[6].m_vctTrueHalfPel.x;			iTempY1 = pmv[6].m_vctTrueHalfPel.y;		}		else {			pmv [5].computeTrueMV ();			pmv [5].computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)			iTempX1 = pmv[5].m_vctTrueHalfPel.x;			iTempY1 = pmv[5].m_vctTrueHalfPel.y;		}		if(pmbmd->m_bForwardBottom) {			pmv [8].computeTrueMV ();			pmv [8].computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)			iTempX2 = pmv[8].m_vctTrueHalfPel.x;			iTempY2 = pmv[8].m_vctTrueHalfPel.y;		}		else {			pmv [7].computeTrueMV ();			pmv [7].computeMV ();     // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)			iTempX2 = pmv[7].m_vctTrueHalfPel.x;

⌨️ 快捷键说明

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