HEVC ME之 整像素TZ搜索代码分析

来源:互联网 发布:先锋乒羽淘宝商城微店 编辑:程序博客网 时间:2024/05/21 15:40

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个邻点会有两个没有搜索到

    5. 如果步骤3搜索得到的最佳步长大于某个阈值(iRaster),则以步骤2得到的点作为起点,做步长为iRaster的光栅扫描(即在运动搜索的范围内遍历所有点)

    6. 最后,在经过前面1~5歩之后,以得到的最佳点为起点,再次重复步骤3和4

    7. 保存最佳mv和SAD。


    下面针对搜索流程,对具体函数及参数予以解释:

{

    确定上下左右搜索范围;

    创建当前搜索快cStruct,起始坐标是输入的piRefY;

    

    起始点选择:

    中值预测;

    当前PU的左,上,右上三种模式的预测;

    零运动矢量预测;

       //三种模式存在m_acMvPredictors[]中,分别对应下标0/1/2

       //其中调用了  xTZSearchHelp函数,该函数输入当前块pcPatternKey,搜索块cStruct,起始地址X,Y;

       //该函数检测输入起始地址的匹配块的代价,如果比之前的最好的还要小,则将当前的(X,Y)设为最优向量

       //当前步长和代价设为最优步长和最优代价

       //以上搜索过程即是保存了其中代价最好的模式    


    第一遍钻石搜索:

    以上面选取的最佳向量点(iBestX,iBestY)为起始位置做8点钻石搜索xTZ8PointDiamondSearch;

    起始步长iDst为1,最大不超出搜索范围uiSearchRange,步长每次翻倍,搜索过程同样调用Help函数,会保存最优模式 且当以当前点为中心搜索超过3次则break ;

    以(0,0)为起始位置做8点钻石搜索;


    当上述搜索过程得到的最优步长是1时,要做2点小钻石搜索;

      小钻石搜索是为了进一步细化搜索,补充最优步长与其2倍步长搜索遗漏的两个点,以后可画图注释.


    光栅搜索:

    当上述得到的最优步长大于iRaster(HM中为5)时,进行光栅搜索;

    光栅搜索是以iRaster为步长,从左到右,从上到下遍历cStruct中的点作为起始坐标进行匹配.

    

    第二遍钻石搜索:

    光栅再求精算法,默认不运行的,而是运行下面的star再求精,该算法是按照当前的最优步长进行钻石搜索,然后步长逐步右移1位(除以2),直到0,当最优=1时再做小钻石;

       star再求精,以当前点开始,步长从1到搜索区域uiSearchRange做大钻石;如果最优为1再做小钻石;


    保存最优运动矢量MV和SAD

}


0 0
原创粉丝点击