?? motest.cpp
字號(hào):
}
// INTERLACE
// new changes
else if (iSAD16x8 <= iSAD8) { // Field-based
pmbmd -> m_bhas4MVForward = FALSE;
pmbmd -> m_bFieldMV = TRUE;
Int iTempX1, iTempY1, iTempX2, iTempY2;
if(pmbmd->m_bForwardTop) {
pmv [6].computeTrueMV ();
pmv [6].computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
iTempX1 = pmv[6].m_vctTrueHalfPel.x;
iTempY1 = pmv[6].m_vctTrueHalfPel.y;
}
else {
pmv [5].computeTrueMV ();
pmv [5].computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
iTempX1 = pmv[5].m_vctTrueHalfPel.x;
iTempY1 = pmv[5].m_vctTrueHalfPel.y;
}
if(pmbmd->m_bForwardBottom) {
pmv [8].computeTrueMV ();
pmv [8].computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
iTempX2 = pmv[8].m_vctTrueHalfPel.x;
iTempY2 = pmv[8].m_vctTrueHalfPel.y;
}
else {
pmv [7].computeTrueMV ();
pmv [7].computeMV (); // to make pmv unique (iMVX=3+iHalfX=-1 == iMVX=2+iHalfX=+1)
iTempX2 = pmv[7].m_vctTrueHalfPel.x;
iTempY2 = pmv[7].m_vctTrueHalfPel.y;
}
iSADInter = iSAD16x8 + FAVOR_FIELD;
Int iTemp;
for (UInt i = 1; i < 5; i++) {
iTemp = iTempX1 + iTempX2;
pmv [i].m_vctTrueHalfPel.x = (iTemp & 3) ? ((iTemp>>1) | 1) : (iTemp>>1);
iTemp = iTempY1 + iTempY2;
pmv [i].m_vctTrueHalfPel.y = (iTemp & 3) ? ((iTemp>>1) | 1) : (iTemp>>1);
pmv[i].computeMV ();
}
}
//end of new changes
// ~INTERLACE
else {
pmv [1].computeTrueMV ();
pmv [2].computeTrueMV ();
pmv [3].computeTrueMV ();
pmv [4].computeTrueMV ();
pmv [1].computeMV ();
pmv [2].computeMV ();
pmv [3].computeMV ();
pmv [4].computeMV ();
pmbmd -> m_bhas4MVForward = TRUE;
iSADInter = iSAD8;
}
// GMC
pmbmd -> m_bMCSEL = FALSE;
if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE){
Int iNb = pmbmd->m_rgNumNonTranspPixels [0] ;
Int iMSADG = 4096*256;
PixelC* ppxlcRefforgme = (PixelC*) m_pvopcRefQ0->pixelsY () ;
iMSADG = globalme (x,y,ppxlcRefforgme);
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iMSADG, "MB_GMC");
#endif // __TRACE_AND_STATS_
Int ioffset, iQP=m_uiGMCQP; // GMC_V2 *m_rgiQPpred;
if(pmbmd -> m_bhas4MVForward == TRUE)
ioffset = iQP*iNb/16;
//ioffset = iQP*iNb/24;
else
{
if(pmbmd -> m_bFieldMV == TRUE)
{
ioffset = iQP*iNb/32;
}else{
if(pmv->m_vctTrueHalfPel.x == 0 && pmv->m_vctTrueHalfPel.y == 0)
ioffset = iFavor16x16*2;
else
ioffset = iQP*iNb/64;
}
}
if((iMSADG - ioffset) <= iSADInter)
{
iSADInter = iMSADG;
pmbmd -> m_dctMd = INTER;
pmbmd -> m_bFieldMV = FALSE;
pmbmd -> m_bhas4MVForward = FALSE;
pmbmd -> m_bMCSEL = TRUE;
Int iPmvx, iPmvy, iHalfx, iHalfy;
globalmv (iPmvx, iPmvy, iHalfx, iHalfy,
x,y,m_vopmd.mvInfoForward.uiRange,m_volmd.bQuarterSample);
*pmv = CMotionVector (iPmvx, iPmvy);
pmv -> iHalfX = iHalfx;
pmv -> iHalfY = iHalfy;
pmv -> computeTrueMV ();
pmv -> computeMV ();
for (UInt i = 1; i < PVOP_MV_PER_REF_PER_MB; i++)
pmv[i] = *pmv;
}
else
{
pmbmd -> m_bMCSEL = FALSE;
}
}
// ~GMC
/* NBIT: change
if (iSumDev < (iSADInter - (pmbmd->m_rgNumNonTranspPixels [0] << 1))) {
*/
// GMC
Int iIntraOffset;
if(m_uiSprite == 2 && m_vopmd.vopPredType == SPRITE)
iIntraOffset = iFavorInter;
//iIntraOffset = iFavorInter/2;
else
iIntraOffset = iFavorInter;
// ~GMC
if (iSumDev < (iSADInter - iIntraOffset)) { // GMC
pmbmd -> m_bSkip = FALSE;
pmbmd -> m_dctMd = INTRA;
// new changes
pmbmd -> m_bFieldMV = FALSE;
// GMC
pmbmd -> m_bMCSEL = FALSE;
// ~GMC
memset (pmv, 0, PVOP_MV_PER_REF_PER_MB * sizeof (CMotionVector));
return ((m_uiRateControl==RC_MPEG4) ? sumAbsCurrMB () : 0);
}
else {
pmbmd -> m_dctMd = INTER;
// new changes
if (pmbmd->m_bhas4MVForward == FALSE
&& pmbmd -> m_bFieldMV == FALSE
// GMC
&& pmbmd -> m_bMCSEL == FALSE
// ~GMC
&& pmv->m_vctTrueHalfPel.x == 0 && pmv->m_vctTrueHalfPel.y == 0)
return (iSADInter + iFavorZero);
else
return iSADInter;
}
}
CMotionVector rgmvDirectBack [5];
CMotionVector rgmvDirectForward [5];
Int CVideoObjectEncoder::motionEstMB_BVOP (
CoordI x, CoordI y,
CMotionVector* pmvForward, CMotionVector* pmvBackward,
CMBMode* pmbmd,
const CMBMode* pmbmdRef, const CMotionVector* pmvRef,
const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,
Bool bColocatedMBExist
)
{
//for QuarterPel mwi 21JUL98
const CMotionVector* pmvRefBlk = pmvRef;
CMotionVector* pmvDirectForward = rgmvDirectForward;
CMotionVector* pmvDirectBack = rgmvDirectBack;
//~for QuarterPel mwi 21JUL98
Int iInitSAD = sad16x16At0 (ppxlcRef0MBY) + FAVORZERO;
Int iSADForward = blkmatch16 (pmvForward, x, y, x, y, iInitSAD, ppxlcRef0MBY, m_puciRefQZoom0, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);
pmvForward->computeTrueMV ();
pmvForward->computeMV ();
Int iSADDirect = 1000000000;
CVector vctRefScaled;
// TPS FIX
// QuarterPel mwi 21JUL98
// if (bColocatedMBExist && pmbmdRef->m_bhas4MVForward == FALSE &&
// (m_volmd.volType != ENHN_LAYER || ( m_vopmd.iRefSelectCode != 1 && m_vopmd.iRefSelectCode != 2))) {
if (bColocatedMBExist &&
(m_volmd.volType != ENHN_LAYER || ( m_vopmd.iRefSelectCode != 1 && m_vopmd.iRefSelectCode != 2))) {
iSADDirect = directSAD(x, y, pmbmd, pmbmdRef, pmvRef);
Int iPartInterval = m_t - m_tPastRef;
Int iFullInterval = m_tFutureRef - m_tPastRef;
for (Int iBlkNo=1; iBlkNo<=4; iBlkNo++) {
pmvDirectForward++;
pmvDirectBack++;
pmvRefBlk++;
vctRefScaled = pmvRefBlk->trueMVHalfPel () * iPartInterval;
vctRefScaled.x /= iFullInterval;
vctRefScaled.y /= iFullInterval;
//set up forward vector;
pmvDirectForward->m_vctTrueHalfPel.x = vctRefScaled.x + pmbmd->m_vctDirectDeltaMV.x;
pmvDirectForward->m_vctTrueHalfPel.y = vctRefScaled.y + pmbmd->m_vctDirectDeltaMV.y;
pmvDirectForward->computeMV ();
//set up backward vector
backwardMVFromForwardMV (rgmvDirectBack [iBlkNo], rgmvDirectForward [iBlkNo], *pmvRefBlk, pmbmd->m_vctDirectDeltaMV);
}
// GMC
if(pmbmdRef->m_bMCSEL)
iSADDirect -= FAVORZERO;
else
if (pmbmd->m_vctDirectDeltaMV.x == 0 && pmbmd->m_vctDirectDeltaMV.y == 0)
iSADDirect -= FAVORZERO;
}
// ~GMC
// Int iPartInterval = m_t - m_tPastRef; //initialize at MVDB = 0
//vctRefScaled = pmvRef->trueMVHalfPel () * iPartInterval;
//Int iFullInterval = m_tFutureRef - m_tPastRef;
// //for QuarterPel mwi 21JUL98
// iSADDirect = 0;
// Int iBlkNo;
// for (iBlkNo=1; iBlkNo<=4; iBlkNo++) {
// pmvDirectForward++;
// pmvDirectBack++;
// pmvRefBlk++;
//
// vctRefScaled = pmvRefBlk->trueMVHalfPel () * iPartInterval;
// vctRefScaled.x /= iFullInterval;
// vctRefScaled.y /= iFullInterval;
// //set up initial forward vector;
// pmvDirectForward->m_vctTrueHalfPel.x = vctRefScaled.x; //trueHalfPel!!
// pmvDirectForward->m_vctTrueHalfPel.y = vctRefScaled.y;
// pmvDirectForward->computeMV ();
// //set up initial backward vector
// pmbmd->m_vctDirectDeltaMV = pmvDirectForward->m_vctTrueHalfPel - vctRefScaled; //
// backwardMVFromForwardMV (rgmvDirectBack [iBlkNo], rgmvDirectForward [iBlkNo], *pmvRefBlk, pmbmd->m_vctDirectDeltaMV);
// //compute initial sad
// iSADDirect += interpolateAndDiffY8 (rgmvDirectForward, rgmvDirectBack, x, y, iBlkNo,
// &m_rctRefVOPY0, &m_rctRefVOPY1) - FAVORZERO;
// }
// vctRefScaled.x /= iFullInterval; //truncation as per vm
// vctRefScaled.y /= iFullInterval; //truncation as per vm
// //set up initial forward vector;
// rgmvDirectForward->iMVX = vctRefScaled.x / 2;
// rgmvDirectForward->iMVY = vctRefScaled.y / 2;
// rgmvDirectForward->iHalfX = 0;
// rgmvDirectForward->iHalfY = 0;
// rgmvDirectForward->computeTrueMV ();
// //set up initial backward vector
// pmbmd->m_vctDirectDeltaMV = rgmvDirectForward->m_vctTrueHalfPel - vctRefScaled; //mvdb not necessaryly 0 due to truncation of half pel
// backwardMVFromForwardMV (rgmvDirectBack [0], rgmvDirectForward [0], *pmvRef, pmbmd->m_vctDirectDeltaMV);
// //compute initial sad
// iSADDirect = interpolateAndDiffY (rgmvDirectForward, rgmvDirectBack, x, y,
// &m_rctRefVOPY0, &m_rctRefVOPY1) - FAVORZERO;
// //set up inital position in ref frame
// Int iXInit = x + rgmvDirectForward->iMVX;
// Int iYInit = y + rgmvDirectForward->iMVY;
// const PixelC* ppxlcInitRefMBY = m_pvopcRefQ0->pixelsY () + m_rctRefFrameY.offset (iXInit, iYInit);
// //compute forward mv and sad; to be continue in iSADMin==iSADDirect
// iSADDirect = blkmatch16 (rgmvDirectForward, iXInit, iYInit, x, y, iSADDirect, ppxlcInitRefMBY,
// m_puciRefQZoom0, m_vopmd.iDirectModeRadius, m_volmd.bQuarterSample) - FAVOR_DIRECT;
// rgmvDirectForward->computeTrueMV ();
// pmbmd->m_vctDirectDeltaMV = rgmvDirectForward->m_vctTrueHalfPel - vctRefScaled;
// backwardMVFromForwardMV (rgmvDirectBack [0], rgmvDirectForward [0], *pmvRef,
// pmbmd->m_vctDirectDeltaMV);
// iSADDirect = interpolateAndDiffY (rgmvDirectForward, rgmvDirectBack, x, y,
// &m_rctRefVOPY0, &m_rctRefVOPY1);
// // GMC
// if(pmbmdRef->m_bMCSEL)
// iSADDirect -= FAVORZERO;
// else
// // ~GMC
// if (pmbmd->m_vctDirectDeltaMV.x == 0 && pmbmd->m_vctDirectDeltaMV.y == 0)
// iSADDirect -= FAVORZERO;
// ~for QuarterPel mwi 21JUL98
iInitSAD = sad16x16At0 (ppxlcRef1MBY) + FAVORZERO;
Int iSADBackward = blkmatch16 (pmvBackward, x, y, x, y, iInitSAD, ppxlcRef1MBY, m_puciRefQZoom1, m_vopmd.iSearchRangeBackward, m_volmd.bQuarterSample);
pmvBackward->computeTrueMV ();
pmvBackward->computeMV ();
Int iSADInterpolate = interpolateAndDiffY (
pmvForward, pmvBackward,
x, y, &m_rctRefVOPY0, &m_rctRefVOPY1
);
Int iSADMin = minimum (iSADDirect, iSADForward, iSADBackward, iSADInterpolate);
if(m_bCodedFutureRef==FALSE)
iSADMin = iSADForward; // force forward mode
Int iBlk;
if (iSADMin == iSADDirect) {
pmbmd->m_mbType = DIRECT;
//compute backward mv
//pmvForward [0] = rgmvDirectForward [0];
//pmvBackward [0] = rgmvDirectBack [0];
for (iBlk = 0; iBlk <= 4; iBlk++) {
pmvForward [iBlk] = rgmvDirectForward [iBlk];
pmvBackward [iBlk] = rgmvDirectBack [iBlk];
}
}
else if (iSADMin == iSADForward) {
pmbmd->m_mbType = FORWARD;
for (iBlk = 1; iBlk <= 4; iBlk++)
pmvForward [iBlk] = pmvForward [0];
}
else if (iSADMin == iSADBackward) {
pmbmd->m_mbType = BACKWARD;
for (iBlk = 1; iBlk <= 4; iBlk++)
pmvBackward [iBlk] = pmvBackward [0];
}
else {
pmbmd->m_mbType = INTERPOLATE;
for (iBlk = 1; iBlk <= 4; iBlk++) {
pmvForward [iBlk] = pmvForward [0];
pmvBackward [iBlk] = pmvBackward [0];
}
}
return iSADMin;
}
// for spatial scalability only
Int CVideoObjectEncoder::motionEstMB_BVOP (
CoordI x, CoordI y,
CMotionVector* pmvForward, CMotionVector* pmvBackward,
CMBMode* pmbmd,
const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY
)
{
Int iInitSAD = sad16x16At0 (ppxlcRef0MBY);
Int iSADForward = blkmatch16 (pmvForward, x, y,x,y, iInitSAD, ppxlcRef0MBY, m_puciRefQZoom0, m_vopmd.iSearchRangeForward, m_volmd.bQuarterSample);
pmvForward->computeTrueMV ();
pmvForward->computeMV ();
Int iSADDirect = 1000000000;
iInitSAD = sad16x16At0 (ppxlcRef1MBY);
Int iSADBackward = iInitSAD;
*pmvBackward = CMotionVector (0,0);
pmvBackward->computeTrueMV ();
pmvBackward->computeMV ();
Int iSADInterpolate = interpolateAndDiffY (pmvForward, pmvBackward, x, y,
&m_rctRefVOPY0, &m_rctRefVOPY1);
Int iSADMin=0;
if(iSADForward <= iSADBackward && iSADForward <= iSADInterpolate)
iSADMin = iSADForward;
else if (iSADBackward <= iSADInterpolate)
iSADMin = iSADBackward;
else
iSADMin = iSADInterpolate;
Int iBlk;
if (iSADMin == iSADForward) {
pmbmd->m_mbType = FORWARD;
for (iBlk = 1; iBlk <= 4; iBlk++)
pmvForward [iBlk] = pmvForward [0];
}
else if (iSADMin == iSADBackward) {
pmbmd->m_mbType = BACKWARD;
for (iBlk = 1; iBlk <= 4; iBlk++)
pmvBackward [iBlk] = pmvBackward [0];
}
else {
pmbmd->m_mbType = INTERPOLATE;
for (iBlk = 1; iBlk <= 4; iBlk++) {
pmvForward [iBlk] = pmvForward [0];
pmvBackward [iBlk] = pmvBackward [0];
}
}
return iSADMin;
}
Int CVideoObjectEncoder::motionEstMB_BVOP_WithShape (
CoordI x, CoordI y,
CMotionVector* pmvForward, CMotionVector* pmvBackward,
CMBMode* pmbmd,
const CMBMode* pmbmdRef, const CMotionVector* pmvRef,
const PixelC* ppxlcRef0MBY, const PixelC* ppxlcRef1MBY,
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -