📄 mv.c
字号:
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 + -