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