📄 umc_vc1_dec_mv_adv.cpp
字号:
pC=(pCurrMB - width + 1);
if(!pC->IntraFlag)
{
switch(VC1_GET_MBTYPE(pC->mbType))
{
case VC1_MB_1MV_INTER:
{
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
MVPred.CMVPred[1] = &pC->m_pBlocks[0];
MVPred.CMVPred[2] = &pC->m_pBlocks[0];
MVPred.CMVPred[3] = &pC->m_pBlocks[0];
}
break;
case VC1_MB_2MV_INTER:
{
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
MVPred.CMVPred[1] = &pC->m_pBlocks[0];
MVPred.CMVPred[2] = &pC->m_pBlocks[0];
MVPred.CMVPred[3] = &pC->m_pBlocks[0];
MVPred.FieldMB[2][2] = 1;
MVPred.FieldMB[3][2] = 1;
}
break;
case VC1_MB_4MV_INTER:
{
MVPred.CMVPred[0] = &pC->m_pBlocks[2];
MVPred.CMVPred[1] = &pC->m_pBlocks[2];
MVPred.CMVPred[2] = &pC->m_pBlocks[2];
MVPred.CMVPred[3] = &pC->m_pBlocks[2];
}
break;
case VC1_MB_4MV_FIELD_INTER:
{
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
MVPred.CMVPred[1] = &pC->m_pBlocks[0];
MVPred.CMVPred[2] = &pC->m_pBlocks[0];
MVPred.CMVPred[3] = &pC->m_pBlocks[0];
MVPred.FieldMB[2][2] = 1;
MVPred.FieldMB[3][2] = 1;
}
break;
default:
pC=NULL;
break;
}
}
}
else
{
//this block is last in row
pC=(pCurrMB - width -1);
if(!pC->IntraFlag)
{
switch(VC1_GET_MBTYPE(pC->mbType))
{
case VC1_MB_1MV_INTER:
{
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
MVPred.CMVPred[1] = &pC->m_pBlocks[0];
MVPred.CMVPred[2] = &pC->m_pBlocks[0];
MVPred.CMVPred[3] = &pC->m_pBlocks[0];
}
break;
case VC1_MB_2MV_INTER:
{
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
MVPred.CMVPred[1] = &pC->m_pBlocks[0];
MVPred.CMVPred[2] = &pC->m_pBlocks[0];
MVPred.CMVPred[3] = &pC->m_pBlocks[0];
MVPred.FieldMB[2][2] = 1;
MVPred.FieldMB[3][2] = 1;
}
break;
case VC1_MB_4MV_INTER:
{
MVPred.CMVPred[0] = &pC->m_pBlocks[3];
MVPred.CMVPred[1] = &pC->m_pBlocks[3];
MVPred.CMVPred[2] = &pC->m_pBlocks[3];
MVPred.CMVPred[3] = &pC->m_pBlocks[3];
}
break;
case VC1_MB_4MV_FIELD_INTER:
{
MVPred.CMVPred[0] = &pC->m_pBlocks[1];
MVPred.CMVPred[1] = &pC->m_pBlocks[1];
MVPred.CMVPred[2] = &pC->m_pBlocks[1];
MVPred.CMVPred[3] = &pC->m_pBlocks[1];
MVPred.FieldMB[2][2] = 1;
MVPred.FieldMB[3][2] = 1;
}
break;
default:
pC=NULL;
break;
}
}
}
}
MVPred.AMVPred[1] = &pCurrMB->m_pBlocks[0];
MVPred.AMVPred[3] = &pCurrMB->m_pBlocks[0];
MVPred.FieldMB[3][0] = 1;
memcpy(&pContext->MVPred,&MVPred,sizeof(VC1MVPredictors));
}
//2 Field MV candidate MV derivation
void PredictInterlace2MV_Field_Adv(VC1MB* pCurrMB,
Ipp16s pPredMVx[2],Ipp16s pPredMVy[2],
Ipp16s backTop, Ipp16s backBottom,
Ipp32u widthMB)
{
Ipp32u LeftTopRightPositionFlag = pCurrMB->LeftTopRightPositionFlag;
Ipp32u OppositeTopField = 0;
Ipp32u OppositeBottomField = 0;
Ipp32u SameTopField = 0;
Ipp32u SameBottomField = 0;
Ipp16s MV_px[2][3] = {0,0,0,0,0,0};
Ipp16s MV_py[2][3] = {0,0,0,0,0,0};
Ipp16s MV_px_sameField[2][3] = {0,0,0,0,0,0};
Ipp16s MV_py_sameField[2][3] = {0,0,0,0,0,0};
Ipp16s MV_px_oppField[2][3] = {0,0,0,0,0,0};
Ipp16s MV_py_oppField[2][3] = {0,0,0,0,0,0};
VC1MB *pA = NULL, *pB = NULL, *pC = NULL;
// A predictor
if(VC1_IS_NO_LEFT_MB(LeftTopRightPositionFlag))
{
pA=(pCurrMB - 1);
if(!pA->IntraFlag)
{
switch(VC1_GET_MBTYPE(pA->mbType))
{
case VC1_MB_1MV_INTER:
{
//add mv of A
//top field
MV_px[0][0] = pA->m_pBlocks[0].mv[backTop][0];
MV_py[0][0] = pA->m_pBlocks[0].mv[backTop][1];
//bottom field
MV_px[1][0] = pA->m_pBlocks[0].mv[backBottom][0];
MV_py[1][0] = pA->m_pBlocks[0].mv[backBottom][1];
}
break;
case VC1_MB_2MV_INTER:
{
//top field
//add the top field mv
MV_px[0][0] = pA->m_pBlocks[0].mv[backTop][0];
MV_py[0][0] = pA->m_pBlocks[0].mv[backTop][1];
//bottom field
//add the bottom field block mv
MV_px[1][0] = pA->m_pBlocks[0].mv_bottom[backBottom][0];
MV_py[1][0] = pA->m_pBlocks[0].mv_bottom[backBottom][1];
}
break;
case VC1_MB_4MV_INTER:
{
//top field
// add the top right block mv
MV_px[0][0] = pA->m_pBlocks[1].mv[backTop][0];
MV_py[0][0] = pA->m_pBlocks[1].mv[backTop][1];
//bottom field
//add the bottom right block mv
MV_px[1][0] = pA->m_pBlocks[3].mv[backBottom][0];
MV_py[1][0] = pA->m_pBlocks[3].mv[backBottom][1];
}
break;
case VC1_MB_4MV_FIELD_INTER:
{
//top field
//add the top right field mv
MV_px[0][0] = pA->m_pBlocks[1].mv[backTop][0];
MV_py[0][0] = pA->m_pBlocks[1].mv[backTop][1];
//bottom feild
//add the bottom right field mv
MV_px[1][0] = pA->m_pBlocks[1].mv_bottom[backBottom][0];
MV_py[1][0] = pA->m_pBlocks[1].mv_bottom[backBottom][1];
}
break;
default:
pA=NULL;
break;
}
//classifying top candidate mv
if(MV_py[0][0] & 4)
{
MV_px_oppField[0][OppositeTopField] = MV_px[0][0];
MV_py_oppField[0][OppositeTopField] = MV_py[0][0];
++OppositeTopField;
}
else
{
MV_px_sameField[0][SameTopField] = MV_px[0][0];
MV_py_sameField[0][SameTopField] = MV_py[0][0];
++SameTopField;
}
//classifying bottom candidate mv
if(MV_py[1][0] & 4)
{
MV_px_oppField[1][OppositeBottomField] = MV_px[1][0];
MV_py_oppField[1][OppositeBottomField] = MV_py[1][0];
++OppositeBottomField;
}
else
{
MV_px_sameField[1][SameBottomField] = MV_px[1][0];
MV_py_sameField[1][SameBottomField] = MV_py[1][0];
++SameBottomField;
}
}
}
if(VC1_IS_NO_TOP_MB(LeftTopRightPositionFlag))
{
// B predictor
pB=(pCurrMB - widthMB);
if(!pB->IntraFlag)
{
switch(VC1_GET_MBTYPE(pB->mbType))
{
case VC1_MB_1MV_INTER:
{
//top field
MV_px[0][1] = pB->m_pBlocks[0].mv[backTop][0];
MV_py[0][1] = pB->m_pBlocks[0].mv[backTop][1];
//bottom field
MV_px[1][1] = pB->m_pBlocks[0].mv[backBottom][0];
MV_py[1][1] = pB->m_pBlocks[0].mv[backBottom][1];
}
break;
case VC1_MB_2MV_INTER:
{
//top field
//add the top field mv
MV_px[0][1] = pB->m_pBlocks[0].mv[backTop][0];
MV_py[0][1] = pB->m_pBlocks[0].mv[backTop][1];
//bottom field
//add the bottom field mv
MV_px[1][1] = pB->m_pBlocks[0].mv_bottom[backBottom][0];
MV_py[1][1] = pB->m_pBlocks[0].mv_bottom[backBottom][1];
}
break;
case VC1_MB_4MV_INTER:
{
//top field
//add the bottom left block mv
MV_px[0][1] = pB->m_pBlocks[2].mv[backTop][0];
MV_py[0][1] = pB->m_pBlocks[2].mv[backTop][1];
//bottom field
//add the bottom left block mv
MV_px[1][1] = pB->m_pBlocks[2].mv[backBottom][0];
MV_py[1][1] = pB->m_pBlocks[2].mv[backBottom][1];
}
break;
case VC1_MB_4MV_FIELD_INTER:
{
//top field
//add the top left field mv
MV_px[0][1] = pB->m_pBlocks[0].mv[backTop][0];
MV_py[0][1] = pB->m_pBlocks[0].mv[backTop][1];
//bottom field
//add the bottom left field mv
MV_px[1][1] = pB->m_pBlocks[0].mv_bottom[backBottom][0];
MV_py[1][1] = pB->m_pBlocks[0].mv_bottom[backBottom][1];
}
break;
default:
pB=NULL;
break;
}
//classifying top candidate mv
if(MV_py[0][1] & 4)
{
MV_px_oppField[0][OppositeTopField] = MV_px[0][1];
MV_py_oppField[0][OppositeTopField] = MV_py[0][1];
++OppositeTopField;
}
else
{
MV_px_sameField[0][SameTopField] = MV_px[0][1];
MV_py_sameField[0][SameTopField] = MV_py[0][1];
++SameTopField;
}
//classifying bottom candidate mv
if(MV_py[1][1] & 4)
{
MV_px_oppField[1][OppositeBottomField] = MV_px[1][1];
MV_py_oppField[1][OppositeBottomField] = MV_py[1][1];
++OppositeBottomField;
}
else
{
MV_px_sameField[1][SameBottomField] = MV_px[1][1];
MV_py_sameField[1][SameBottomField] = MV_py[1][1];
++SameBottomField;
}
}
// C predictor
if (VC1_IS_NO_RIGHT_MB(LeftTopRightPositionFlag))
{
//this block is not last in row
pC=(pCurrMB - widthMB + 1);
if(!pC->IntraFlag)
{
switch(VC1_GET_MBTYPE(pC->mbType))
{
case VC1_MB_1MV_INTER:
{
//top field
MV_px[0][2] = pC->m_pBlocks[0].mv[backTop][0];
MV_py[0][2] = pC->m_pBlocks[0].mv[backTop][1];
//bottom field
MV_px[1][2] = pC->m_pBlocks[0].mv[backBottom][0];
MV_py[1][2] = pC->m_pBlocks[0].mv[backBottom][1];
}
break;
case VC1_MB_2MV_INTER:
{
//top field
//add the top field mv
MV_px[0][2] = pC->m_pBlocks[0].mv[backTop][0];
MV_py[0][2] = pC->m_pBlocks[0].mv[backTop][1];
//bottom field
//add the bottom field block mv
MV_px[1][2] = pC->m_pBlocks[0].mv_bottom[backBottom][0];
MV_py[1][2] = pC->m_pBlocks[0].mv_bottom[backBottom][1];
}
break;
case VC1_MB_4MV_INTER:
{
//top field
//add the bottom left block mv
MV_px[0][2] = pC->m_pBlocks[2].mv[backTop][0];
MV_py[0][2] = pC->m_pBlocks[2].mv[backTop][1];
//bottom filed
MV_px[1][2] = pC->m_pBlocks[2].mv[backBottom][0];
MV_py[1][2] = pC->m_pBlocks[2].mv[backBottom][1];
}
break;
case VC1_MB_4MV_FIELD_INTER:
{
//top field
//add the top left field block mv
MV_px[0][2] = pC->m_pBlocks[0].mv[backTop][0];
MV_py[0][2] = pC->m_pBlocks[0].mv[backTop][1];
//bottom field
MV_px[1][2] = pC->m_pBlocks[0].mv_bottom[backBottom][0];
MV_py[1][2] = pC->m_pBlocks[0].mv_bottom[backBottom][1];
}
break;
default:
pC=NULL;
break;
}
//classifying top candidate mv
if(MV_py[0][2] & 4)
{
MV_px_oppField[0][OppositeTopField] = MV_px[0][2];
MV_py_oppField[0][OppositeTopField] = MV_py[0][2];
++OppositeTopField;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -