📄 motionestimation.cpp
字号:
uiBestSad = uiSad;
dx = 0;
dy = iStep;
}
}
bContinue = ( dx != 0 || dy !=0 );
if( bContinue )
{
dxOld = dx;
dyOld = dy;
x += dx;
y += dy;
pucSearch = pucRef + x + y * iStride;
}
}
}
iStep = 1;
iStepStride = iStep * iStride;
{
Int dx = 0;
Int dy = 0;
if( dxOld != 1 && -x <= cSearchRect.iNegHorLimit - iStep )
{
if( dyOld != 1 && -y <= cSearchRect.iNegVerLimit - iStep)
{
m_cXDSS.pYSearch = pucSearch - iStepStride - iStep;
uiSad = m_cXDSS.Func( &m_cXDSS );
uiSad += xGetCost( x - iStep, y - iStep );
if( uiBestSad > uiSad )
{
uiBestSad = uiSad;
dx = -iStep;
dy = -iStep;
}
}
if( dyOld != -1 && y < cSearchRect.iPosVerLimit - iStep)
{
m_cXDSS.pYSearch = pucSearch + iStepStride - iStep;
uiSad = m_cXDSS.Func( &m_cXDSS );
uiSad += xGetCost( x - iStep, y + iStep );
if( uiBestSad > uiSad )
{
uiBestSad = uiSad;
dx = -iStep;
dy = iStep;
}
}
}
if( dxOld != -1 && x < cSearchRect.iPosHorLimit - iStep)
{
if( dyOld != 1 && -y <= cSearchRect.iNegVerLimit - iStep)
{
m_cXDSS.pYSearch = pucSearch - iStepStride + iStep;
uiSad = m_cXDSS.Func( &m_cXDSS );
uiSad += xGetCost( x + iStep, y - iStep );
if( uiBestSad > uiSad )
{
uiBestSad = uiSad;
dx = iStep;
dy = -iStep;
}
}
if( dyOld != -1 && y < cSearchRect.iPosVerLimit - iStep)
{
m_cXDSS.pYSearch = pucSearch + iStepStride + iStep;
uiSad = m_cXDSS.Func( &m_cXDSS );
uiSad += xGetCost( x + iStep, y + iStep );
if( uiBestSad > uiSad )
{
uiBestSad = uiSad;
dx = iStep;
dy = iStep;
}
}
}
bContinue = ( dx != 0 || dy !=0 );
if( bContinue )
{
x += dx;
y += dy;
pucSearch = pucRef + x + y * iStride;
}
}
ruiSAD = uiBestSad - xGetCost( x, y );
rcMv.setHor( x );
rcMv.setVer( y );
DO_DBG( m_cXDSS.pYSearch = pucRef + y * iStride + x );
AOF_DBG( ruiSAD == ( uiSad = m_cXDSS.Func( &m_cXDSS ) ) );
}
#define TZ_SEARCH_CONFIGURATION \
const Int iRaster = 3; /* TZ soll von aussen 黚ergeben werden */ \
const Bool bTestOtherPredictedMV = 1; \
const Bool bTestZeroVector = 1; \
const Bool bTestZeroVectorStar = 0; \
const Bool bTestZeroVectorStop = 0; \
const Bool bFirstSearchDiamond = 1; /* 1 = xTZ8PointDiamondSearch 0 = xTZ8PointSquareSearch */ \
const Bool bFirstSearchStop = 0; \
const UInt uiFirstSearchRounds = 3; /* first search stop X rounds after best match (must be >=1) */ \
const Bool bEnableRasterSearch = 1; \
const Bool bAlwaysRasterSearch = 0; /* ===== 1: BETTER but factor 2 slower ===== */ \
const Bool bRasterRefinementEnable = 0; /* enable either raster refinement or star refinement */ \
const Bool bRasterRefinementDiamond = 0; /* 1 = xTZ8PointDiamondSearch 0 = xTZ8PointSquareSearch */ \
const Bool bStarRefinementEnable = 1; /* enable either star refinement or raster refinement */ \
const Bool bStarRefinementDiamond = 1; /* 1 = xTZ8PointDiamondSearch 0 = xTZ8PointSquareSearch */ \
const Bool bStarRefinementStop = 0; \
const UInt uiStarRefinementRounds = 2; /* star refinement stop X rounds after best match (must be >=1) */ \
__inline
Void MotionEstimation::xTZSearchHelp( IntTZSearchStrukt& rcStrukt, const Int iSearchX, const Int iSearchY, const UChar ucPointNr, const UInt uiDistance )
{
#if 0 //degug
std::cout << "Pruefpunkt "
<< " PX:" << std::setw(4) << std::setfill(' ') << iSearchX
<< " PY:" << std::setw(4) << std::setfill(' ') << iSearchY
<< " Dis:" << std::setw(6) << std::setfill(' ') << uiDistance << std::endl;
#endif
m_cXDSS.pYSearch = rcStrukt.pucYRef + iSearchY * rcStrukt.iYStride + iSearchX;
m_cXDSS.pUSearch = rcStrukt.pucURef + (iSearchY>>1) * rcStrukt.iCStride + (iSearchX>>1);
m_cXDSS.pVSearch = rcStrukt.pucVRef + (iSearchY>>1) * rcStrukt.iCStride + (iSearchX>>1);
UInt uiSad = m_cXDSS.Func( &m_cXDSS );
uiSad += MotionEstimationCost::xGetCost( iSearchX, iSearchY );
if( rcStrukt.uiBestSad > uiSad )
{
rcStrukt.uiBestSad = uiSad;
rcStrukt.iBestX = iSearchX;
rcStrukt.iBestY = iSearchY;
rcStrukt.uiBestDistance = uiDistance;
rcStrukt.uiBestRound = 0;
rcStrukt.ucPointNr = ucPointNr;
}
}
__inline
Void MotionEstimation::xTZ2PointSearch( IntTZSearchStrukt& rcStrukt, SearchRect rcSearchRect )
{ // 2 point search, // 1 2 3
// check only the 2 untested points // 4 0 5
// around the start point // 6 7 8
Int iStartX = rcStrukt.iBestX;
Int iStartY = rcStrukt.iBestY;
switch( rcStrukt.ucPointNr )
{
case 1:
{
if ( (iStartX - 1) >= -rcSearchRect.iNegHorLimit )
{
xTZSearchHelp( rcStrukt, iStartX - 1, iStartY, 0, 2 );
}
if ( (iStartY - 1) >= -rcSearchRect.iNegVerLimit )
{
xTZSearchHelp( rcStrukt, iStartX, iStartY - 1, 0, 2 );
}
}
break;
case 2:
{
if ( (iStartY - 1) >= -rcSearchRect.iNegVerLimit )
{
if ( (iStartX - 1) >= -rcSearchRect.iNegHorLimit )
{
xTZSearchHelp( rcStrukt, iStartX - 1, iStartY - 1, 0, 2 );
}
if ( (iStartX + 1) <= rcSearchRect.iPosHorLimit )
{
xTZSearchHelp( rcStrukt, iStartX + 1, iStartY - 1, 0, 2 );
}
}
}
break;
case 3:
{
if ( (iStartY - 1) >= -rcSearchRect.iNegVerLimit )
{
xTZSearchHelp( rcStrukt, iStartX, iStartY - 1, 0, 2 );
}
if ( (iStartX + 1) <= rcSearchRect.iPosHorLimit )
{
xTZSearchHelp( rcStrukt, iStartX + 1, iStartY, 0, 2 );
}
}
break;
case 4:
{
if ( (iStartX - 1) >= -rcSearchRect.iNegHorLimit )
{
if ( (iStartY + 1) <= rcSearchRect.iPosVerLimit )
{
xTZSearchHelp( rcStrukt, iStartX - 1, iStartY + 1, 0, 2 );
}
if ( (iStartY - 1) >= -rcSearchRect.iNegVerLimit )
{
xTZSearchHelp( rcStrukt, iStartX - 1, iStartY - 1, 0, 2 );
}
}
}
break;
case 5:
{
if ( (iStartX + 1) <= rcSearchRect.iPosHorLimit )
{
if ( (iStartY - 1) >= -rcSearchRect.iNegVerLimit )
{
xTZSearchHelp( rcStrukt, iStartX + 1, iStartY - 1, 0, 2 );
}
if ( (iStartY + 1) <= rcSearchRect.iPosVerLimit )
{
xTZSearchHelp( rcStrukt, iStartX + 1, iStartY + 1, 0, 2 );
}
}
}
break;
case 6:
{
if ( (iStartX - 1) >= -rcSearchRect.iNegHorLimit )
{
xTZSearchHelp( rcStrukt, iStartX - 1, iStartY , 0, 2 );
}
if ( (iStartY + 1) <= rcSearchRect.iPosVerLimit )
{
xTZSearchHelp( rcStrukt, iStartX, iStartY + 1, 0, 2 );
}
}
break;
case 7:
{
if ( (iStartY + 1) <= rcSearchRect.iPosVerLimit )
{
if ( (iStartX - 1) >= -rcSearchRect.iNegHorLimit )
{
xTZSearchHelp( rcStrukt, iStartX - 1, iStartY + 1, 0, 2 );
}
if ( (iStartX + 1) <= rcSearchRect.iPosHorLimit )
{
xTZSearchHelp( rcStrukt, iStartX + 1, iStartY + 1, 0, 2 );
}
}
}
break;
case 8:
{
if ( (iStartX + 1) <= rcSearchRect.iPosHorLimit )
{
xTZSearchHelp( rcStrukt, iStartX + 1, iStartY, 0, 2 );
}
if ( (iStartY + 1) <= rcSearchRect.iPosVerLimit )
{
xTZSearchHelp( rcStrukt, iStartX, iStartY + 1, 0, 2 );
}
}
break;
default:
{
AF();
}
break;
} // switch( rcStrukt.ucPointNr )
}
__inline
Void MotionEstimation::xTZ8PointSquareSearch( IntTZSearchStrukt& rcStrukt, SearchRect rcSearchRect,
const Int iStartX, const Int iStartY, const Int iDist )
{ // 8 point search, // 1 2 3
// search around the start point // 4 0 5
// with the required distance // 6 7 8
AOT_DBG( iDist == 0 );
const Int iTop = iStartY - iDist;
const Int iBottom = iStartY + iDist;
const Int iLeft = iStartX - iDist;
const Int iRight = iStartX + iDist;
rcStrukt.uiBestRound += 1;
if ( iTop >= -rcSearchRect.iNegVerLimit ) // check top
{
if ( iLeft >= -rcSearchRect.iNegHorLimit ) // check top left
{
xTZSearchHelp( rcStrukt, iLeft, iTop, 1, iDist );
}
// top middle
xTZSearchHelp( rcStrukt, iStartX, iTop, 2, iDist );
if ( iRight <= rcSearchRect.iPosHorLimit ) // check top right
{
xTZSearchHelp( rcStrukt, iRight, iTop, 3, iDist );
}
} // check top
if ( iLeft >= -rcSearchRect.iNegHorLimit ) // check middle left
{
xTZSearchHelp( rcStrukt, iLeft, iStartY, 4, iDist );
}
if ( iRight <= rcSearchRect.iPosHorLimit ) // check middle right
{
xTZSearchHelp( rcStrukt, iRight, iStartY, 5, iDist );
}
if ( iBottom <= rcSearchRect.iPosVerLimit ) // check bottom
{
if ( iLeft >= -rcSearchRect.iNegHorLimit ) // check bottom left
{
xTZSearchHelp( rcStrukt, iLeft, iBottom, 6, iDist );
}
// check bottom middle
xTZSearchHelp( rcStrukt, iStartX, iBottom, 7, iDist );
if ( iRight <= rcSearchRect.iPosHorLimit ) // check bottom right
{
xTZSearchHelp( rcStrukt, iRight, iBottom, 8, iDist );
}
} // check bottom
}
__inline
Void MotionEstimation::xTZ8PointDiamondSearch( IntTZSearchStrukt& rcStrukt, SearchRect rcSearchRect,
const Int iStartX, const Int iStartY, const Int iDist )
{ // 8 point search, // 1 2 3
// search around the start point // 4 0 5
// with the required distance // 6 7 8
AOT_DBG( iDist == 0 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -