xTZSearch是运动估计过程中的一种整像素搜索模式,比起全搜索虽然精度下降一点,但是时间复杂度会降低太多,所以运动估计过程中的整像素搜索一般都使用TZSearch。
TZSearch的搜过流程如下:
- 确定起始搜索点。
- 以步长1开始,以菱形模板在搜索范围内进行搜索,其中步长以2的整数次幂的形式递增,选出率失真代价最小的点作为该步骤的搜索结果。
- 若步骤2选出的最优点对应的步长为1,则需要在该点周围进行两点搜索
- 若步骤2选出的最优点对应的步长大于某个阈值,则以该最优点为中心,在一定范围内做全搜索,选择率失真代价最小的作为最优点。
- 以步骤4得到的最优点为起始点,重复步骤2-4。直到相邻两次细化搜索得到的最优点一致时停止。此时得到最优匹配点和mv
cStruct存储了匹配模板像素和搜索区域像素,rcMv是AMVP选择的最优mvp
Void InterSearch::xTZSearch( const PredictionUnit& pu,
IntTZSearchStruct& cStruct,
Mv& rcMv,
Distortion& ruiSAD,
const Mv* const pIntegerMv2Nx2NPred,
const Bool bExtendedSettings,
const Bool bFastSettings)
{
const bool bUseRasterInFastMode = true; //toggle this to further reduce runtime
const Bool bUseAdaptiveRaster = bExtendedSettings;
const Int iRaster = (bFastSettings && bUseRasterInFastMode) ? 8 : 5;
const Bool bTestZeroVector = true && !bFastSettings;
const Bool bTestZeroVectorStart = bExtendedSettings;
const Bool bTestZeroVectorStop = false;
const Bool bFirstSearchDiamond = true; // 1 = xTZ8PointDiamondSearch 0 = xTZ8PointSquareSearch
const Bool bFirstCornersForDiamondDist1 = bExtendedSettings;
const Bool bFirstSearchStop = m_pcEncCfg->getFastMEAssumingSmootherMVEnabled();
const UInt uiFirstSearchRounds = bFastSettings ? (bUseRasterInFastMode?3:2) : 3; // first search stop X rounds after best match (must be >=1)
const Bool bEnableRasterSearch = bFastSettings ? bUseRasterInFastMode : true;
const Bool bAlwaysRasterSearch = bExtendedSettings; // true: BETTER but factor 2 slower
const Bool bRasterRefinementEnable = false; // enable either raster refinement or star refinement
const Bool bRasterRefinementDiamond = false; // 1 = xTZ8PointDiamondSearch 0 = xTZ8PointSquareSearch
const Bool bRasterRefinementCornersForDiamondDist1 = bExtendedSettings;
const Bool bStarRefinementEnable = true; // enable either star refinement or raster refinement
const Bool bStarRefinementDiamond = true; // 1 = xTZ8PointDiamondSearch 0 = xTZ8PointSquareSearch
const Bool bStarRefinementCornersForDiamondDist1 = bExtendedSettings;
const Bool bStarRefinementStop = false || bFastSettings;
const UInt uiStarRefinementRounds = 2; // star refinement stop X rounds after best match (must be >=1)
const Bool bNewZeroNeighbourhoodTest = bExtendedSettings;
//一些参数的初始化
Int iSearchRange = m_iSearchRange;
clipMv( rcMv, pu.cu->lumaPos(), *pu.cs->sps );
rcMv.divideByPowerOf2(2); //rcMv右移两位
// init TZSearchStruct
cStruct.uiBestSad = MAX_UINT; //最优失真设为最大
//
m_cDistParam.maximumDistortionForEarlyExit = cStruct.uiBestSad;
m_pcRdCost->setDistParam( m_cDistParam