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

📄 mv.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{	static Bool rgbInBound [3];	rgbInBound [0] = FALSE;	rgbInBound [1] = FALSE;	rgbInBound [2] = FALSE;	Int nInBound = 0;	CVector vctCandMV [3];	UInt i;	for (i = 0; i < 3; i++)	{		vctCandMV [i].x = 0;		vctCandMV [i].y = 0;	}	Bool bLeftBndry, bRightBndry, bTopBndry;	Int iMBnum = VPMBnum(iXMB, iYMB);	bLeftBndry = bVPNoLeft(iMBnum, iXMB);	bTopBndry = bVPNoTop(iMBnum);	bRightBndry = bVPNoRightTop(iMBnum, iXMB);	if (pmbmd->m_bhas4MVForward == TRUE)	{		//how about backward??		switch (iBlk){		case Y_BLOCK1://	Modified for error resilient mode by Toshiba(1997-11-14)//			if (iXMB != 0 && validBlock (pmbmd - 1, gIndexOfCandBlk [iBlk] [0]))	{			if (!bLeftBndry && validBlock (pmbmd, pmbmd - 1, gIndexOfCandBlk [iBlk] [0]))	{				vctCandMV [0] = (pmv - PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [iBlk] [0]) -> trueMVHalfPel ();				rgbInBound [0] = TRUE;				nInBound++;			}			if (iYMB != 0)	{//	Modified for error resilient mode by Toshiba(1997-11-14)//				if (validBlock (pmbmd - m_iNumMBX, gIndexOfCandBlk [iBlk] [1]))	{				if (!bTopBndry && validBlock (pmbmd, pmbmd - m_iNumMBX, gIndexOfCandBlk [iBlk] [1]))	{					vctCandMV [1] = (pmv - m_iNumOfTotalMVPerRow + gIndexOfCandBlk [iBlk] [1])->trueMVHalfPel ();					rgbInBound [1] = TRUE;					nInBound++;				}//	Modified for error resilient mode by Toshiba(1997-11-14)//				if (iXMB < m_iNumMBX - 1 && validBlock (pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [iBlk] [2]))	{				if (!bRightBndry && validBlock (pmbmd, pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [iBlk] [2]))	{					vctCandMV [2] = (pmv - m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [iBlk] [2])->trueMVHalfPel ();					rgbInBound [2] = TRUE;					nInBound++;				}			}			break;		case Y_BLOCK2:			if (validBlock (pmbmd, pmbmd, gIndexOfCandBlk [iBlk] [0]))	{				vctCandMV [0] = (pmv +  gIndexOfCandBlk [iBlk] [0]) -> trueMVHalfPel ();				rgbInBound [0] = TRUE;				nInBound++;			}			if (iYMB != 0)	{//	Modified for error resilient mode by Toshiba(1997-11-14)//				if (validBlock (pmbmd - m_iNumMBX, gIndexOfCandBlk [iBlk] [1]))	{				if (!bTopBndry && validBlock (pmbmd, pmbmd - m_iNumMBX, gIndexOfCandBlk [iBlk] [1]))	{					vctCandMV [1] = (pmv - m_iNumOfTotalMVPerRow + gIndexOfCandBlk [iBlk] [1]) -> trueMVHalfPel ();					rgbInBound [1] = TRUE;					nInBound++;				}//	Modified for error resilient mode by Toshiba(1997-11-14)//				if (iXMB < m_iNumMBX - 1 && validBlock (pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [iBlk] [2]))	{				if (!bRightBndry && validBlock (pmbmd, pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [iBlk] [2]))	{					vctCandMV [2] = (pmv - m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [iBlk] [2]) -> trueMVHalfPel ();					rgbInBound [2] = TRUE;					nInBound++;				}			}			break;		case Y_BLOCK3://	Modified for error resilient mode by Toshiba(1997-11-14)//			if (iXMB != 0 && validBlock (pmbmd - 1, gIndexOfCandBlk [iBlk] [0]))	{			if (!bLeftBndry && validBlock (pmbmd, pmbmd - 1, gIndexOfCandBlk [iBlk] [0]))	{				vctCandMV [0] = (pmv - PVOP_MV_PER_REF_PER_MB +  gIndexOfCandBlk [iBlk] [0]) -> trueMVHalfPel ();				rgbInBound [0] = TRUE;				nInBound++;			}			if (validBlock (pmbmd, pmbmd, gIndexOfCandBlk [iBlk] [1]))	{				vctCandMV [1] = (pmv + gIndexOfCandBlk [iBlk] [1]) -> trueMVHalfPel ();				rgbInBound [1] = TRUE;				nInBound++;			}			if (validBlock (pmbmd, pmbmd, gIndexOfCandBlk [iBlk] [2]))	{				vctCandMV [2] = (pmv + gIndexOfCandBlk [iBlk] [2]) -> trueMVHalfPel ();				rgbInBound [2] = TRUE;				nInBound++;			}			break;		case Y_BLOCK4:			if (validBlock (pmbmd, pmbmd, gIndexOfCandBlk [iBlk] [0]))	{				vctCandMV [0] = (pmv + gIndexOfCandBlk [iBlk] [0]) -> trueMVHalfPel ();				rgbInBound [0] = TRUE;				nInBound++;			}			if (validBlock (pmbmd, pmbmd, gIndexOfCandBlk [iBlk] [1]))	{				vctCandMV [1] = (pmv + gIndexOfCandBlk [iBlk] [1]) -> trueMVHalfPel ();				rgbInBound [1] = TRUE;				nInBound++;			}			if (validBlock (pmbmd, pmbmd, gIndexOfCandBlk [iBlk] [2]))	{				vctCandMV [2] = (pmv + gIndexOfCandBlk [iBlk] [2]) -> trueMVHalfPel ();				rgbInBound [2] = TRUE;				nInBound++;			}			break;		}	}	else {//	Modified for error resilient mode by Toshiba(1997-11-14)//		if (iXMB != 0 && validBlock (pmbmd - 1, gIndexOfCandBlk [1] [0]))	{		if (!bLeftBndry && validBlock (pmbmd, pmbmd - 1, gIndexOfCandBlk [1] [0]))	{			vctCandMV [0] = (pmv - PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [0]) -> trueMVHalfPel ();			rgbInBound [0] = TRUE;			nInBound++;		}		if (iYMB != 0)   {//	Modified for error resilient mode by Toshiba(1997-11-14)//			if (validBlock (pmbmd - m_iNumMBX, gIndexOfCandBlk [1] [1]))	{			if (!bTopBndry && validBlock (pmbmd, pmbmd - m_iNumMBX, gIndexOfCandBlk [1] [1]))	{				vctCandMV [1] = (pmv - m_iNumOfTotalMVPerRow + gIndexOfCandBlk [1] [1]) -> trueMVHalfPel ();				rgbInBound [1] = TRUE;				nInBound++;			}//	Modified for error resilient mode by Toshiba(1997-11-14)//			if (iXMB < m_iNumMBX - 1 && validBlock (pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [1] [2]))	{			if (!bRightBndry && validBlock (pmbmd, pmbmd - m_iNumMBX + 1, gIndexOfCandBlk [1] [2]))	{				vctCandMV [2] = (pmv - m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [2]) -> trueMVHalfPel ();				rgbInBound [2] = TRUE;				nInBound++;			}		}	}	if (nInBound == 1)	{		for (UInt i = 0; i < 3; i++)	{			if (rgbInBound [i] == TRUE)	{				vecPred = vctCandMV [i];				return;			}		}	}	vecPred.x = medianof3 (vctCandMV [0].x, vctCandMV [1].x, vctCandMV [2].x);	vecPred.y = medianof3 (vctCandMV [0].y, vctCandMV [1].y, vctCandMV [2].y);}Bool CVideoObject::validBlock (const CMBMode* pmbmdCurr, const CMBMode* pmbmd, BlockNum blkn) const{	// block tests with mv padding	if (pmbmd->m_rgTranspStatus [0] == ALL)				return FALSE;	else if(pmbmd != pmbmdCurr)		return TRUE;	else {		if(pmbmd->m_rgTranspStatus [blkn] == ALL)			return FALSE;		else			return TRUE;	}}Void CVideoObject::findMVpredictorOfBVOP (CVector& vctPred, const CMotionVector* pmv, const CMBMode* pmbmd, Int iMBX) const  		    //for B-VOP only{	vctPred.x = vctPred.y = 0;		//intialize to 0	MBType mbtypCurr = pmbmd->m_mbType;	for (Int iMBXCandidate = iMBX - 1; iMBXCandidate >= 0; iMBXCandidate--)	{		//scan backward MBs		pmbmd--;		pmv -= 5;		if (pmbmd->m_bSkip)			return;		else if (pmbmd->m_mbType == mbtypCurr && pmbmd->m_rgTranspStatus [0] != ALL)	{			vctPred = pmv->m_vctTrueHalfPel;			return;		}	}	return;							//reach the start of the row; reset}Void CVideoObject::backwardMVFromForwardMV (								//compute back mv from forward mv and ref mv for direct mode					CMotionVector& mvBackward, const CMotionVector& mvForward,					const CMotionVector& mvRef,	CVector vctDirectDeltaMV){	assert (mvForward.iMVX != NOT_MV && mvForward.iMVY != NOT_MV);	//mv is valid	CVector vctBackward;	Int iFullInterval = m_tFutureRef - m_tPastRef;	if (vctDirectDeltaMV.x == 0)		vctBackward.x = (m_t - m_tFutureRef) * mvRef.m_vctTrueHalfPel.x / iFullInterval;	else 		vctBackward.x = mvForward.m_vctTrueHalfPel.x - mvRef.m_vctTrueHalfPel.x;	if (vctDirectDeltaMV.y == 0)		vctBackward.y = (m_t - m_tFutureRef) * mvRef.m_vctTrueHalfPel.y / iFullInterval;	else 		vctBackward.y = mvForward.m_vctTrueHalfPel.y - mvRef.m_vctTrueHalfPel.y;	mvBackward = CMotionVector (vctBackward);}CVector CVideoObject::averageOfRefMV (const CMotionVector* pmvRef, const CMBMode* pmbmdRef)	{	assert(pmvRef!=NULL);	CVector vctRef (0, 0);	Int i;	if (pmbmdRef -> m_bhas4MVForward)	{						//average		Int iDivisor = 0;		for (i = Y_BLOCK1; i <= Y_BLOCK4; i++)	{			pmvRef++;			if (pmbmdRef->m_rgTranspStatus [i] != ALL)	{				assert (pmvRef->iMVX != NOT_MV);				vctRef.x += pmvRef->m_vctTrueHalfPel.x;				vctRef.y += pmvRef->m_vctTrueHalfPel.y;				iDivisor += 1;			}		}		vctRef.x = (Int) rounded((Float) vctRef.x / iDivisor);		vctRef.y = (Int) rounded((Float) vctRef.y / iDivisor);	}	else {		vctRef = pmvRef->m_vctTrueHalfPel;		assert (pmvRef->iMVX != NOT_MV);	}	return vctRef;}Void CVideoObject::padMotionVectors (const CMBMode* pmbmd,CMotionVector *pmv){	if(pmbmd->m_rgTranspStatus[0]==ALL)		return;	if(pmbmd->m_rgTranspStatus[1]==ALL)	{		pmv[1]=(pmbmd->m_rgTranspStatus[2]!=ALL)?pmv[2]:			((pmbmd->m_rgTranspStatus[3]!=ALL)?pmv[3]:pmv[4]);	}	if(pmbmd->m_rgTranspStatus[2]==ALL)	{		pmv[2]=(pmbmd->m_rgTranspStatus[1]!=ALL)?pmv[1]:			((pmbmd->m_rgTranspStatus[4]!=ALL)?pmv[4]:pmv[3]);	}	if(pmbmd->m_rgTranspStatus[3]==ALL)	{		pmv[3]=(pmbmd->m_rgTranspStatus[4]!=ALL)?pmv[4]:			((pmbmd->m_rgTranspStatus[1]!=ALL)?pmv[1]:pmv[2]);	}	if(pmbmd->m_rgTranspStatus[4]==ALL)	{		pmv[4]=(pmbmd->m_rgTranspStatus[3]!=ALL)?pmv[3]:			((pmbmd->m_rgTranspStatus[2]!=ALL)?pmv[2]:pmv[1]);	}}

⌨️ 快捷键说明

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