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

📄 mv.c

📁 au1200 linux2.6.11 硬件解码mae驱动和maiplayer播放器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	  	if (pmbmd -> m_bhas4MVForward)  	{      pmv++;      for (k = 0; k < 4; k++)      {        dx += pmv->m_vctTrueHalfPel.x;        dy += pmv->m_vctTrueHalfPel.y;        pmv++;      }      *xRefUV = sign (dx) * (grgiMvRound16 [MP4V_ABS (dx) % 16] + (MP4V_ABS (dx) / 16) * 2);      *yRefUV = sign (dy) * (grgiMvRound16 [MP4V_ABS (dy) % 16] + (MP4V_ABS (dy) / 16) * 2);	}#ifdef ENABLE_INTERLACING	else if (pmbmd -> m_bFieldMV)	{      if(pmbmd->m_bForwardTop) {        dx = pmv [6].m_vctTrueHalfPel.x;        dy = pmv [6].m_vctTrueHalfPel.y;      }      else {        dx = pmv [5].m_vctTrueHalfPel.x;        dy = pmv [5].m_vctTrueHalfPel.y;      }      *xRefUV = ((dx & 3) ? ((dx >> 1) | 1) : (dx>>1));      *yRefUV = ((dy & 6) ? ((dy >> 1) | 2) : (dy>>1));      if(pmbmd->m_bForwardBottom) {        dx = pmv [8].m_vctTrueHalfPel.x;        dy = pmv [8].m_vctTrueHalfPel.y;      }      else {        dx = pmv [7].m_vctTrueHalfPel.x;        dy = pmv [7].m_vctTrueHalfPel.y;      }      *xRefUV1 = ((dx & 3) ? ((dx >> 1) | 1) : (dx>>1));      *yRefUV1 = ((dy & 6) ? ((dy >> 1) | 2) : (dy>>1));	}#endif	else    {      dx = pmv->m_vctTrueHalfPel.x;	  dy = pmv->m_vctTrueHalfPel.y;      *xRefUV = sign (dx) * (grgiMvRound4  [MP4V_ABS (dx) % 4] + (MP4V_ABS (dx) / 4) * 2);      *yRefUV = sign (dy) * (grgiMvRound4  [MP4V_ABS (dy) % 4] + (MP4V_ABS (dy) / 4) * 2);	}  }}Void mvLookupUVWithShape (CMBMode* pmbmd, CMotionVector* pmv, CoordI *xRefUV, CoordI *yRefUV){  Int* rgiMvRound;  Int dx = 0, dy = 0;  UInt i, uiDivisor = 0; //2 = Y->UV resolution change; another -> full pel  if (pmbmd -> m_bhas4MVForward || pmbmd -> m_mbType == DIRECT)  {    if (g_pVOL->bQuarterSample)     {      for (i = Y_BLOCK1; i < U_BLOCK; i++)	      {        pmv++;        dx += pmv->iMVX;        dy += pmv->iMVY;        uiDivisor += 4;       }    }    else     {      for (i = Y_BLOCK1; i < U_BLOCK; i++)	      {        pmv++;        dx += pmv->m_vctTrueHalfPel.x;        dy += pmv->m_vctTrueHalfPel.y;        uiDivisor += 4;      }    }    (uiDivisor == 4) ? (rgiMvRound = grgiMvRound4) : (((uiDivisor == 8) ? (rgiMvRound = grgiMvRound8) :                                                        ((uiDivisor == 12) ? (rgiMvRound = grgiMvRound12) : (rgiMvRound = grgiMvRound16))));    *xRefUV = sign (dx) * (rgiMvRound [MP4V_ABS (dx) % uiDivisor] + (MP4V_ABS (dx) / uiDivisor) * 2);    *yRefUV = sign (dy) * (rgiMvRound [MP4V_ABS (dy) % uiDivisor] + (MP4V_ABS (dy) / uiDivisor) * 2);  }  else  {    (g_pVOL->bQuarterSample) ? (dx = pmv->iMVX, dy = pmv->iMVY) : (dx = pmv->m_vctTrueHalfPel.x, dy = pmv->m_vctTrueHalfPel.y);    *xRefUV = sign (dx) * (grgiMvRound4  [MP4V_ABS (dx) % 4] + (MP4V_ABS (dx) / 4) * 2);    *yRefUV = sign (dy) * (grgiMvRound4  [MP4V_ABS (dy) % 4] + (MP4V_ABS (dy) / 4) * 2);  }}Void findMVpredGeneric (CVector *vecPred, CMotionVector* pmv, CMBMode* pmbmd, Int iBlk, Int iXMB, Int iYMB){	Int nInBound = 0, iMBnum;	Bool bLeftBndry, bRightBndry, bTopBndry;	CVector vctCandMV [3];	UInt i;	static Bool rgbInBound [3];	rgbInBound [0] = FALSE;	rgbInBound [1] = FALSE;	rgbInBound [2] = FALSE;	for (i = 0; i < 3; i++)	    {		vctCandMV [i].x = 0;		vctCandMV [i].y = 0;	}	MP4V_VPMBNUM(iMBnum, iXMB, iYMB);	MP4V_BVPNOLEFT(bLeftBndry, iMBnum, iXMB);	MP4V_BVPNOTOP(bTopBndry, iMBnum);	MP4V_BVPNORIGHTTOP(bRightBndry, 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 (!bLeftBndry)	{				vctCandMV [0] = TRUEMVHALFPEL((pmv - PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [iBlk] [0]));				rgbInBound [0] = TRUE;				nInBound++;			}			if (iYMB != 0)	{//	Modified for error resilient mode by Toshiba(1997-11-14)				if (!bTopBndry)	{					vctCandMV [1] = TRUEMVHALFPEL((pmv - g_pVO->m_iNumOfTotalMVPerRow + gIndexOfCandBlk [iBlk] [1]));					rgbInBound [1] = TRUE;					nInBound++;				}//	Modified for error resilient mode by Toshiba(1997-11-14)				if (!bRightBndry)	{					vctCandMV [2] = TRUEMVHALFPEL((pmv - g_pVO->m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [iBlk] [2]));					rgbInBound [2] = TRUE;					nInBound++;				}			}			break;		case Y_BLOCK2:			{				vctCandMV [0] = TRUEMVHALFPEL((pmv +  gIndexOfCandBlk [iBlk] [0]));				rgbInBound [0] = TRUE;				nInBound++;			}			if (iYMB != 0)	{//	Modified for error resilient mode by Toshiba(1997-11-14)				if (!bTopBndry)	{					vctCandMV [1] = TRUEMVHALFPEL((pmv - g_pVO->m_iNumOfTotalMVPerRow + gIndexOfCandBlk [iBlk] [1]));					rgbInBound [1] = TRUE;					nInBound++;				}//	Modified for error resilient mode by Toshiba(1997-11-14)				if (!bRightBndry)	{					vctCandMV [2] = TRUEMVHALFPEL((pmv - g_pVO->m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [iBlk] [2]));					rgbInBound [2] = TRUE;					nInBound++;				}			}			break;		case Y_BLOCK3://	Modified for error resilient mode by Toshiba(1997-11-14)			if (!bLeftBndry)	{				vctCandMV [0] = TRUEMVHALFPEL((pmv - PVOP_MV_PER_REF_PER_MB +  gIndexOfCandBlk [iBlk] [0]));				rgbInBound [0] = TRUE;				nInBound++;			}			{				vctCandMV [1] = TRUEMVHALFPEL((pmv + gIndexOfCandBlk [iBlk] [1]));				rgbInBound [1] = TRUE;				nInBound++;			}			{				vctCandMV [2] = TRUEMVHALFPEL((pmv + gIndexOfCandBlk [iBlk] [2]));				rgbInBound [2] = TRUE;				nInBound++;			}			break;		case Y_BLOCK4:			{				vctCandMV [0] = TRUEMVHALFPEL((pmv + gIndexOfCandBlk [iBlk] [0]));				rgbInBound [0] = TRUE;				nInBound++;			}			{				vctCandMV [1] = TRUEMVHALFPEL((pmv + gIndexOfCandBlk [iBlk] [1]));				rgbInBound [1] = TRUE;				nInBound++;			}			{				vctCandMV [2] = TRUEMVHALFPEL((pmv + gIndexOfCandBlk [iBlk] [2]));				rgbInBound [2] = TRUE;				nInBound++;			}			break;		}	}	else {//	Modified for error resilient mode by Toshiba(1997-11-14)		if (!bLeftBndry)	{			vctCandMV [0] = TRUEMVHALFPEL((pmv - PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [0]));			rgbInBound [0] = TRUE;			nInBound++;		}		if (iYMB != 0)   {//	Modified for error resilient mode by Toshiba(1997-11-14)			if (!bTopBndry)	{				vctCandMV [1] = TRUEMVHALFPEL((pmv - g_pVO->m_iNumOfTotalMVPerRow + gIndexOfCandBlk [1] [1]));				rgbInBound [1] = TRUE;				nInBound++;			}//	Modified for error resilient mode by Toshiba(1997-11-14)			if (!bRightBndry)	{				vctCandMV [2] = TRUEMVHALFPEL((pmv - g_pVO->m_iNumOfTotalMVPerRow + PVOP_MV_PER_REF_PER_MB + gIndexOfCandBlk [1] [2]));				rgbInBound [2] = TRUE;				nInBound++;			}		}	}	if (nInBound == 1)	{		for (i = 0; i < 3; i++)	{			if (rgbInBound [i] == TRUE)	{				*vecPred = vctCandMV [i];				return;			}		}	}	MP4V_MEDIANOF3 ((vecPred->x), (vctCandMV [0].x), (vctCandMV [1].x), (vctCandMV [2].x));	MP4V_MEDIANOF3 ((vecPred->y), (vctCandMV [0].y), (vctCandMV [1].y), (vctCandMV [2].y));}//compute back mv from forward mv and ref mv for direct modeVoid backwardMVFromForwardMV (CMotionVector *mvBackward, CMotionVector *mvForward, CMotionVector *mvRef, CVector vctDirectDeltaMV){	CVector vctBackward;	Int iFullInterval;	assert (mvForward->iMVX != NOT_MV && mvForward->iMVY != NOT_MV);	//mv is valid  iFullInterval = g_pVO->m_tFutureRef - g_pVO->m_tPastRef;  (vctDirectDeltaMV.x == 0 && iFullInterval) ? (vctBackward.x = (g_pVO->m_t - g_pVO->m_tFutureRef) * mvRef->m_vctTrueHalfPel.x / iFullInterval) :                              (vctBackward.x = mvForward->m_vctTrueHalfPel.x - mvRef->m_vctTrueHalfPel.x);  (vctDirectDeltaMV.y == 0 && iFullInterval) ? (vctBackward.y = (g_pVO->m_t - g_pVO->m_tFutureRef) * mvRef->m_vctTrueHalfPel.y / iFullInterval) :                              (vctBackward.y = mvForward->m_vctTrueHalfPel.y - mvRef->m_vctTrueHalfPel.y);    mvBackward->m_vctTrueHalfPel = vctBackward;    mvBackward->iMVX = mvBackward->m_vctTrueHalfPel.x / 2;    mvBackward->iMVY = mvBackward->m_vctTrueHalfPel.y / 2;    mvBackward->iHalfX = mvBackward->m_vctTrueHalfPel.x - mvBackward->iMVX * 2;    mvBackward->iHalfY = mvBackward->m_vctTrueHalfPel.y - mvBackward->iMVY * 2;}

⌨️ 快捷键说明

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