📄 umc_vc1_dec_mv_adv.cpp
字号:
{
MV_px[0] = MVPred.AMVPred[blk_num]->mv[0][0];
MV_py[0] = MVPred.AMVPred[blk_num]->mv[0][1];
}
validPredictors++;
}
if(MVPred.BMVPred[blk_num])
{
if(MVPred.FieldMB[blk_num][1])
{
MV_px[1] = (MVPred.BMVPred[blk_num]->mv[0][0] + MVPred.BMVPred[blk_num]->mv_bottom[0][0] + 1)>>1;
MV_py[1] = (MVPred.BMVPred[blk_num]->mv[0][1] + MVPred.BMVPred[blk_num]->mv_bottom[0][1] + 1)>>1;
}
else
{
MV_px[1] = MVPred.BMVPred[blk_num]->mv[0][0];
MV_py[1] = MVPred.BMVPred[blk_num]->mv[0][1];
}
validPredictors++;
}
if(MVPred.CMVPred[blk_num])
{
if(MVPred.FieldMB[blk_num][2])
{
MV_px[2] = (MVPred.CMVPred[blk_num]->mv[0][0] + MVPred.CMVPred[blk_num]->mv_bottom[0][0] + 1)>>1;
MV_py[2] = (MVPred.CMVPred[blk_num]->mv[0][1] + MVPred.CMVPred[blk_num]->mv_bottom[0][1] + 1)>>1;
}
else
{
MV_px[2] = MVPred.CMVPred[blk_num]->mv[0][0];
MV_py[2] = MVPred.CMVPred[blk_num]->mv[0][1];
}
validPredictors++;
}
//computing frame predictors
if (validPredictors > 1)
{
// 2 or 3 predictors are available
*pPredMVx = (Ipp16s)median3(MV_px);
*pPredMVy = (Ipp16s)median3(MV_py);
}
else
{
// 1 or 0 predictor is available
*pPredMVx = MV_px[0]+MV_px[1]+MV_px[2];
*pPredMVy = MV_py[0]+MV_py[1]+MV_py[2];
}
}
// ---- ---- ---- ----
// | B | C | | C | B | (LAST MB in row)
// ---- ---- ---- or ---- ----
// | A |Cur | | A |Cur |
// ---- ---- ---- ----
void PredictInterlaceFrame1MV(VC1Context* pContext)
{
VC1MVPredictors MVPred;
VC1MB* pCurrMB = pContext->m_pCurrMB;
Ipp32u LeftTopRightPositionFlag = pCurrMB->LeftTopRightPositionFlag;
Ipp32s width = pContext->m_pSingleMB->widthMB;
VC1MB *pA = NULL, *pB = NULL, *pC = NULL;
memset(&MVPred,0,sizeof(VC1MVPredictors));
//A predictor
if(VC1_IS_NO_LEFT_MB(LeftTopRightPositionFlag))
{
pA=(pContext->m_pCurrMB - 1);
if(!pA->IntraFlag)
{
if(VC1_GET_MBTYPE(pA->mbType) == VC1_MB_1MV_INTER || VC1_GET_MBTYPE(pA->mbType) == VC1_MB_2MV_INTER)
MVPred.AMVPred[0] = &pA->m_pBlocks[0];
else
MVPred.AMVPred[0] = &pA->m_pBlocks[1];
MVPred.FieldMB[0][0] = VC1_IS_MVFIELD(pA->mbType);
}
}
if (VC1_IS_NO_TOP_MB(LeftTopRightPositionFlag))
{
//B predictor
pB=(pContext->m_pCurrMB - width);
if(!pB->IntraFlag)
{
if(VC1_GET_MBTYPE(pB->mbType) == VC1_MB_4MV_INTER)
MVPred.BMVPred[0] = &pB->m_pBlocks[2];
else
MVPred.BMVPred[0] = &pB->m_pBlocks[0];
MVPred.FieldMB[0][1] = VC1_IS_MVFIELD(pB->mbType);
}
//C predictor
if (VC1_IS_NO_RIGHT_MB(LeftTopRightPositionFlag))
{
//this block is not last in row
pC=(pContext->m_pCurrMB - width + 1);
if(!pC->IntraFlag)
{
if(VC1_GET_MBTYPE(pC->mbType) == VC1_MB_4MV_INTER)
MVPred.CMVPred[0] = &pC->m_pBlocks[2];
else
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
MVPred.FieldMB[0][2] = VC1_IS_MVFIELD(pC->mbType);
}
}
else
{
//this block is last in row
pC=(pContext->m_pCurrMB - width -1);
if(!pC->IntraFlag)
{
if(VC1_GET_MBTYPE(pC->mbType) == VC1_MB_4MV_INTER)
MVPred.CMVPred[0] = &pC->m_pBlocks[3];
else if (VC1_GET_MBTYPE(pC->mbType) == VC1_MB_4MV_FIELD_INTER)
MVPred.CMVPred[0] = &pC->m_pBlocks[1];
else
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
MVPred.FieldMB[0][2] = VC1_IS_MVFIELD(pC->mbType);
}
}
}
memcpy(&pContext->MVPred,&MVPred,sizeof(VC1MVPredictors));
}
void PredictInterlace4MVFrame_Adv(VC1Context* pContext)
{
VC1MVPredictors MVPred;
VC1MB* pCurrMB = pContext->m_pCurrMB;
Ipp32u LeftTopRightPositionFlag = pCurrMB->LeftTopRightPositionFlag;
Ipp32s width = pContext->m_pSingleMB->widthMB;
VC1MB *pA = NULL, *pB = NULL, *pC = NULL;
memset(&MVPred,0,sizeof(VC1MVPredictors));
// A predictor
if(VC1_IS_NO_LEFT_MB(LeftTopRightPositionFlag))
{
pA=(pCurrMB - 1); //candidate for blocks 0 and 2
if(!pA->IntraFlag)
{
if(VC1_GET_MBTYPE(pA->mbType) == VC1_MB_1MV_INTER || VC1_GET_MBTYPE(pA->mbType) == VC1_MB_2MV_INTER)
{
//block 0
MVPred.AMVPred[0] = &pA->m_pBlocks[0];
//block 2
MVPred.AMVPred[2] = &pA->m_pBlocks[0];
}
else if(VC1_GET_MBTYPE(pA->mbType) == VC1_MB_4MV_INTER)
{
//block 0
MVPred.AMVPred[0] = &pA->m_pBlocks[1];
//block 2
MVPred.AMVPred[2] = &pA->m_pBlocks[3];
}
else
{
//block 0
MVPred.AMVPred[0] = &pA->m_pBlocks[1];
//block 2
MVPred.AMVPred[2] = &pA->m_pBlocks[1];
}
MVPred.FieldMB[0][0] = VC1_IS_MVFIELD(pA->mbType);
MVPred.FieldMB[2][0] = MVPred.FieldMB[0][0];
}
}
if(VC1_IS_NO_TOP_MB(LeftTopRightPositionFlag))
{
// B predictor
pB=(pCurrMB - width);
if(!pB->IntraFlag)
{
if(VC1_GET_MBTYPE(pB->mbType) == VC1_MB_1MV_INTER || VC1_GET_MBTYPE(pB->mbType) == VC1_MB_2MV_INTER)
{
//block 0
MVPred.BMVPred[0] = &pB->m_pBlocks[0];
//block 1
MVPred.BMVPred[1] = &pB->m_pBlocks[0];
}
else if(VC1_GET_MBTYPE(pB->mbType) == VC1_MB_4MV_INTER)
{
//block 0
MVPred.BMVPred[0] = &pB->m_pBlocks[2];
//block 1
MVPred.BMVPred[1] = &pB->m_pBlocks[3];
}
else
{
//block 0
MVPred.BMVPred[0] = &pB->m_pBlocks[0];
//block 1
MVPred.BMVPred[1] = &pB->m_pBlocks[1];
}
MVPred.FieldMB[0][1] = VC1_IS_MVFIELD(pB->mbType);
MVPred.FieldMB[1][1] = MVPred.FieldMB[0][1];
}
// C predictor
if (VC1_IS_NO_RIGHT_MB(LeftTopRightPositionFlag))
{
//this block is not last in row
pC=(pCurrMB - width + 1);
if(!pC->IntraFlag)
{
if(VC1_GET_MBTYPE(pC->mbType) != VC1_MB_4MV_INTER)
{
//block 0
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
//block 1
MVPred.CMVPred[1] = &pC->m_pBlocks[0];
}
else
{
//block 0
MVPred.CMVPred[0] = &pC->m_pBlocks[2];
//block 1
MVPred.CMVPred[1] = &pC->m_pBlocks[2];
}
MVPred.FieldMB[0][2] = VC1_IS_MVFIELD(pC->mbType);
MVPred.FieldMB[1][2] = MVPred.FieldMB[0][2];
}
}
else
{
//this block is last in row
pC=(pCurrMB - width -1);
if(!pC->IntraFlag)
{
if(VC1_GET_MBTYPE(pC->mbType) == VC1_MB_1MV_INTER || VC1_GET_MBTYPE(pC->mbType) == VC1_MB_2MV_INTER)
{
//block 0
MVPred.CMVPred[0] = &pC->m_pBlocks[0];
//block 1
MVPred.CMVPred[1] = &pC->m_pBlocks[0];
}
else if(VC1_GET_MBTYPE(pC->mbType) == VC1_MB_4MV_INTER)
{
//block 0
MVPred.CMVPred[0] = &pC->m_pBlocks[3];
//block 1
MVPred.CMVPred[1] = &pC->m_pBlocks[3];
}
else
{
//block 0
MVPred.CMVPred[0] = &pC->m_pBlocks[1];
//block 1
MVPred.CMVPred[1] = &pC->m_pBlocks[1];
}
MVPred.FieldMB[0][2] = VC1_IS_MVFIELD(pC->mbType);
MVPred.FieldMB[1][2] = MVPred.FieldMB[0][2];
}
}
}
MVPred.AMVPred[1] = &pCurrMB->m_pBlocks[0];
MVPred.BMVPred[2] = &pCurrMB->m_pBlocks[0];
MVPred.CMVPred[2] = &pCurrMB->m_pBlocks[1];
MVPred.AMVPred[3] = &pCurrMB->m_pBlocks[2];
MVPred.BMVPred[3] = &pCurrMB->m_pBlocks[0];
MVPred.CMVPred[3] = &pCurrMB->m_pBlocks[1];
memcpy(&pContext->MVPred,&MVPred,sizeof(VC1MVPredictors));
}
void PredictInterlace4MVField_Adv(VC1Context* pContext)
{
VC1MVPredictors MVPred;
VC1MB* pCurrMB = pContext->m_pCurrMB;
Ipp32u LeftTopRightPositionFlag = pCurrMB->LeftTopRightPositionFlag;
Ipp32s width = pContext->m_pSingleMB->widthMB;
VC1MB *pA = NULL, *pB = NULL, *pC = NULL;
memset(&MVPred,0,sizeof(VC1MVPredictors));
// 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:
{
MVPred.AMVPred[0] = &pA->m_pBlocks[0];
MVPred.AMVPred[2] = &pA->m_pBlocks[0];
}
break;
case VC1_MB_2MV_INTER:
{
MVPred.AMVPred[0] = &pA->m_pBlocks[0];
MVPred.AMVPred[2] = &pA->m_pBlocks[0];
MVPred.FieldMB[2][0] = 1;
}
break;
case VC1_MB_4MV_INTER:
{
MVPred.AMVPred[0] = &pA->m_pBlocks[1];
MVPred.AMVPred[2] = &pA->m_pBlocks[3];
}
break;
case VC1_MB_4MV_FIELD_INTER:
{
MVPred.AMVPred[0] = &pA->m_pBlocks[1];
MVPred.AMVPred[2] = &pA->m_pBlocks[1];
MVPred.FieldMB[2][0] = 1;
}
break;
default:
pA=NULL;
break;
}
}
}
if(VC1_IS_NO_TOP_MB(LeftTopRightPositionFlag))
{
// B predictor
pB=(pCurrMB - width);
if(!pB->IntraFlag)
{
switch(VC1_GET_MBTYPE(pB->mbType))
{
case VC1_MB_1MV_INTER:
{
MVPred.BMVPred[0] = &pB->m_pBlocks[0];
MVPred.BMVPred[1] = &pB->m_pBlocks[0];
MVPred.BMVPred[2] = &pB->m_pBlocks[0];
MVPred.BMVPred[3] = &pB->m_pBlocks[0];
}
break;
case VC1_MB_2MV_INTER:
{
MVPred.BMVPred[0] = &pB->m_pBlocks[0];
MVPred.BMVPred[1] = &pB->m_pBlocks[0];
MVPred.BMVPred[2] = &pB->m_pBlocks[0];
MVPred.BMVPred[3] = &pB->m_pBlocks[0];
MVPred.FieldMB[2][1] = 1;
MVPred.FieldMB[3][1] = 1;
}
break;
case VC1_MB_4MV_INTER:
{
MVPred.BMVPred[0] = &pB->m_pBlocks[2];
MVPred.BMVPred[1] = &pB->m_pBlocks[3];
MVPred.BMVPred[2] = &pB->m_pBlocks[2];
MVPred.BMVPred[3] = &pB->m_pBlocks[3];
}
break;
case VC1_MB_4MV_FIELD_INTER:
{
MVPred.BMVPred[0] = &pB->m_pBlocks[0];
MVPred.BMVPred[1] = &pB->m_pBlocks[1];
MVPred.BMVPred[2] = &pB->m_pBlocks[0];
MVPred.BMVPred[3] = &pB->m_pBlocks[1];
MVPred.FieldMB[2][1] = 1;
MVPred.FieldMB[3][1] = 1;
}
break;
default:
pB=NULL;
break;
}
}
// C predictor
if (VC1_IS_NO_RIGHT_MB(LeftTopRightPositionFlag))
{
//this block is not last in row
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -