📄 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 + -