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}
阅读全文
0 0
- HEVC代码学习23:xTZ8PointDiamondSearch函数
- HEVC代码追踪(十一。七):运动估计/补偿之xTZ8PointDiamondSearch
- HEVC代码学习2:TAppEncTop::encode函数
- HEVC代码学习3:TEncTop::encode函数
- HEVC代码学习7:xPatternSearchFracDIF函数
- HEVC代码学习8:xMotionEstimation函数
- HEVC代码学习9:getInterMergeCandidates函数
- HEVC代码学习11:xCompressCU函数
- HEVC代码学习12:xCheckRDCostInter函数
- HEVC代码学习13:predInterSearch函数
- HEVC代码学习14:motionCompensation函数
- HEVC代码学习15:AMVP相关函数
- HEVC代码学习20:xPatternSearchFast函数
- HEVC代码学习21:xTZSearch函数
- HEVC代码学习22:xTZSearchHelp函数
- HEVC代码学习24:encodeResAndCalcRdInterCU函数
- HEVC代码学习25:xDecompressCU函数
- HEVC代码学习27:calcRdCost函数
- 使用docker搭建hadoop分布式集群
- 创新是落后者的权利
- OpenGL学习——入门篇 第三章 四个变换及模拟地球公转
- Server failed to start : org.apache.catalina.LifecycleException
- linux别名与快捷键
- HEVC代码学习23:xTZ8PointDiamondSearch函数
- 暑假集训日记--8.14--单调队列
- 得到 主窗口
- 响应消息的封装与转换
- 程序员,为什么写不好一份简历?
- CSU-ACM2017暑期训练16-树状数组 C
- Shell变量$#,$@,$0,$1,$2
- JAVA五种线程池的使用
- 杭电acm 1075What Are You Talking About(字典树)