TEncSearch::xTZSearch 函数:进行整像素估计,输入原始图像的感兴趣区(当前块pcPatternKey)参考帧的坐标(piRefY),步长(iRefStride),搜索范围(iSearchRange),输出运动矢量(iBestX,iBestY)与代价(ruiSAD).
参考帧的搜索块(cStruct)起始坐标作为是iRefY,在搜索块中不断找出一个匹配块(相对起始坐标为(X,Y),大小与当前块相同)与当前块做SAD,得出代价(SAD+将向量编码进去的代价)最小的块,其相对起始地址(X,Y)作为最后所要求的运动矢量(iBestX,iBestY),其中SAD也存储下来.
注意:(X,Y)既是参考帧搜索区域中的相对起始地址,也是匹配块相对于当前块的运动矢量.
主要的搜索过程如下:(摘自CJL_CDSN_Blog)
1. 搜索预测得到的mv所指向的点:中值预测mv,当前PU的左,上及右上PU的mv,还有零运动矢量(0,0)
2. 在步骤1中找到匹配误差最小的点作为接下来搜索的起始点
3. 步长从1开始,以2的指数递增,进行8点钻石搜索,该步骤中可以设置搜索的最大次数(以某个步长遍历一遍就算1次)
4. 如果步骤3搜索得到的最佳步长为1,则需要以该最佳点为起点做1次两点钻石搜索,因为前面8点搜索的时候,这个最佳点的8个邻点会有两个没有搜索到