HEVC代码学习23:xTZ8PointDiamondSearch函数

来源:互联网 发布:5g网络是什么的基础 编辑:程序博客网 时间:2024/05/20 18:04

今天来学习xTZ8PointDiamondSearch函数。
xTZ8PointDiamondSearch是xTZSearch调用的一个重要函数,实现的是菱形模板搜索。

xTZ8PointDiamondSearch的菱形模板如下图:
这里写图片描述

理论可以见之前帧间预测的运动估计-搜索算法部分,这里不再赘述。
http://blog.csdn.net/lin453701006/article/details/54340405

xTZ8PointDiamondSearch主要工作流程如下:
1、iDist搜索步长为1时,参考下图。0为当前位置,对2,4,5,7位置(即菱形顶点)进行搜索。这些点都在范围内,则都搜索,否则只搜索在范围内的点。
这里写图片描述
2、iDist搜索步长小于等于8时,需要搜索顶点及各顶点间的中点。这些点都在范围内,则都搜索,否则只搜索在范围内的点。
3、iDist搜索步长大于8时,需要搜索顶点及各顶点间的1/4、1/2、3/4处的点。这些点都在范围内,则都搜索,否则只搜索在范围内的点。

搜索时调用xTZSearchHelp找到最优点信息并更新最有代价。
xTZSearchHelp具体见http://blog.csdn.net/lin453701006/article/details/77149953

__inline Void TEncSearch::xTZ8PointDiamondSearch( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist ){    Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();      //左边界    Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();      //右边界    Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();      //上边界    Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();      //下边界    // 8 point search,                   //   1 2 3    // search around the start point     //   4 0 5    // with the required  distance       //   6 7 8    assert ( iDist != 0 );    const Int iTop        = iStartY - iDist;        //菱形顶角2    const Int iBottom     = iStartY + iDist;    //菱形底角7    const Int iLeft       = iStartX - iDist;        //菱形左角4    const Int iRight      = iStartX + iDist;        //菱形右角5    rcStruct.uiBestRound += 1;      if ( iDist == 1 ) // iDist == 1     步长为1时,搜索2,4,5,7四个点    {        if ( iTop >= iSrchRngVerTop ) // check top        {            xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop, 2, iDist );        }        if ( iLeft >= iSrchRngHorLeft ) // check middle left        {            xTZSearchHelp( pcPatternKey, rcStruct, iLeft, iStartY, 4, iDist );        }        if ( iRight <= iSrchRngHorRight ) // check middle right        {            xTZSearchHelp( pcPatternKey, rcStruct, iRight, iStartY, 5, iDist );        }        if ( iBottom <= iSrchRngVerBottom ) // check bottom        {            xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 7, iDist );        }    }    else // if (iDist != 1)     步长不为1时    {        if ( iDist <= 8 )       //步长小于等于8        {            const Int iTop_2      = iStartY - (iDist>>1);            const Int iBottom_2   = iStartY + (iDist>>1);            const Int iLeft_2     = iStartX - (iDist>>1);            const Int iRight_2    = iStartX + (iDist>>1);            if (  iTop >= iSrchRngVerTop && iLeft >= iSrchRngHorLeft &&                iRight <= iSrchRngHorRight && iBottom <= iSrchRngVerBottom ) // check border  没有越界的情况下,搜索8个点            {                xTZSearchHelp( pcPatternKey, rcStruct, iStartX,  iTop,      2, iDist    );                xTZSearchHelp( pcPatternKey, rcStruct, iLeft_2,  iTop_2,    1, iDist>>1 );                xTZSearchHelp( pcPatternKey, rcStruct, iRight_2, iTop_2,    3, iDist>>1 );                xTZSearchHelp( pcPatternKey, rcStruct, iLeft,    iStartY,   4, iDist    );                xTZSearchHelp( pcPatternKey, rcStruct, iRight,   iStartY,   5, iDist    );                xTZSearchHelp( pcPatternKey, rcStruct, iLeft_2,  iBottom_2, 6, iDist>>1 );                xTZSearchHelp( pcPatternKey, rcStruct, iRight_2, iBottom_2, 8, iDist>>1 );                xTZSearchHelp( pcPatternKey, rcStruct, iStartX,  iBottom,   7, iDist    );            }            else // check border        存在越界的情况下,只搜索不越界的点            {                if ( iTop >= iSrchRngVerTop ) // check top                {                    xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop, 2, iDist );                }                if ( iTop_2 >= iSrchRngVerTop ) // check half top                {                    if ( iLeft_2 >= iSrchRngHorLeft ) // check half left                    {                        xTZSearchHelp( pcPatternKey, rcStruct, iLeft_2, iTop_2, 1, (iDist>>1) );                    }                    if ( iRight_2 <= iSrchRngHorRight ) // check half right                    {                        xTZSearchHelp( pcPatternKey, rcStruct, iRight_2, iTop_2, 3, (iDist>>1) );                    }                } // check half top                if ( iLeft >= iSrchRngHorLeft ) // check left                {                    xTZSearchHelp( pcPatternKey, rcStruct, iLeft, iStartY, 4, iDist );                }                if ( iRight <= iSrchRngHorRight ) // check right                {                    xTZSearchHelp( pcPatternKey, rcStruct, iRight, iStartY, 5, iDist );                }                if ( iBottom_2 <= iSrchRngVerBottom ) // check half bottom                {                    if ( iLeft_2 >= iSrchRngHorLeft ) // check half left                    {                        xTZSearchHelp( pcPatternKey, rcStruct, iLeft_2, iBottom_2, 6, (iDist>>1) );                    }                    if ( iRight_2 <= iSrchRngHorRight ) // check half right                    {                        xTZSearchHelp( pcPatternKey, rcStruct, iRight_2, iBottom_2, 8, (iDist>>1) );                    }                } // check half bottom                if ( iBottom <= iSrchRngVerBottom ) // check bottom                {                    xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 7, iDist );                }            } // check border        }        else // iDist > 8    步长大于8,ucPointNr均设为0        {            if ( iTop >= iSrchRngVerTop && iLeft >= iSrchRngHorLeft &&                iRight <= iSrchRngHorRight && iBottom <= iSrchRngVerBottom ) // check border    没有越界            {                xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop,    0, iDist );        //2                xTZSearchHelp( pcPatternKey, rcStruct, iLeft,   iStartY, 0, iDist );        //4                xTZSearchHelp( pcPatternKey, rcStruct, iRight,  iStartY, 0, iDist );        //5                xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 0, iDist );        //7                for ( Int index = 1; index < 4; index++ )       //iDist>8时,每两个顶点之间要搜索三个点                {                    Int iPosYT = iTop    + ((iDist>>2) * index);                    Int iPosYB = iBottom - ((iDist>>2) * index);                    Int iPosXL = iStartX - ((iDist>>2) * index);                    Int iPosXR = iStartX + ((iDist>>2) * index);                    xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYT, 0, iDist );                    xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYT, 0, iDist );                    xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYB, 0, iDist );                    xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYB, 0, iDist );                }            }            else // check border     存在越界的情况下,只搜索不越界的点            {                if ( iTop >= iSrchRngVerTop ) // check top                {                    xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop, 0, iDist );                }                if ( iLeft >= iSrchRngHorLeft ) // check left                {                    xTZSearchHelp( pcPatternKey, rcStruct, iLeft, iStartY, 0, iDist );                }                if ( iRight <= iSrchRngHorRight ) // check right                {                    xTZSearchHelp( pcPatternKey, rcStruct, iRight, iStartY, 0, iDist );                }                if ( iBottom <= iSrchRngVerBottom ) // check bottom                {                    xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 0, iDist );                }                for ( Int index = 1; index < 4; index++ )                {                    Int iPosYT = iTop    + ((iDist>>2) * index);                    Int iPosYB = iBottom - ((iDist>>2) * index);                    Int iPosXL = iStartX - ((iDist>>2) * index);                    Int iPosXR = iStartX + ((iDist>>2) * index);                    if ( iPosYT >= iSrchRngVerTop ) // check top                    {                        if ( iPosXL >= iSrchRngHorLeft ) // check left                        {                            xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYT, 0, iDist );                        }                        if ( iPosXR <= iSrchRngHorRight ) // check right                        {                            xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYT, 0, iDist );                        }                    } // check top                    if ( iPosYB <= iSrchRngVerBottom ) // check bottom                    {                        if ( iPosXL >= iSrchRngHorLeft ) // check left                        {                            xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYB, 0, iDist );                        }                        if ( iPosXR <= iSrchRngHorRight ) // check right                        {                            xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYB, 0, iDist );                        }                    } // check bottom                } // for ...            } // check border        } // iDist <= 8    } // iDist == 1}
原创粉丝点击