zl程序教程

您现在的位置是:首页 >  其他

当前栏目

HEVC代码追踪(十一。九):运动估计/补偿之xTZ2PointSearch

代码 追踪 十一 运动 估计 HEVC 补偿
2023-09-14 08:57:58 时间
p /p pre code_snippet_id= 539592 snippet_file_name= blog_20141202_1_5458888 name= code >

__inline Void TEncSearch::xTZ2PointSearch( TComPattern* pcPatternKey, IntTZSearchStruct rcStruct, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB )

 Int iSrchRngHorLeft = pcMvSrchRngLT- getHor();

 Int iSrchRngHorRight = pcMvSrchRngRB- getHor();

 Int iSrchRngVerTop = pcMvSrchRngLT- getVer();

 Int iSrchRngVerBottom = pcMvSrchRngRB- getVer();

 // 2 point search, // 1 2 3

 // check only the 2 untested points // 4 0 5

 // around the start point // 6 7 8

//! 注意到,这里的1,3,6,8实际上是搜索步长iDist==2的时候由iDist 1进行赋值的,实际距离以1计算,

//! 在前面经过xTZ8PointSearch确定最佳步长为1后,会在这里对以最佳点为中心、周围没搜索过的点进行运动估计

 Int iStartX = rcStruct.iBestX;

 Int iStartY = rcStruct.iBestY;

 switch( rcStruct.ucPointNr )//! 主要思想是根据该最佳点的位置处理未搜索过的点

 case 1:

 if ( (iStartX - 1) = iSrchRngHorLeft )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX - 1, iStartY, 0, 2 );//! 左

 if ( (iStartY - 1) = iSrchRngVerTop )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iStartY - 1, 0, 2 );//! 上

 break;

 case 2:

 if ( (iStartY - 1) = iSrchRngVerTop )

 if ( (iStartX - 1) = iSrchRngHorLeft )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX - 1, iStartY - 1, 0, 2 );//! 左上 

 if ( (iStartX + 1) = iSrchRngHorRight )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX + 1, iStartY - 1, 0, 2 );//! 右上 

 break;

 case 3:

 if ( (iStartY - 1) = iSrchRngVerTop )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iStartY - 1, 0, 2 );//! 上

 if ( (iStartX + 1) = iSrchRngHorRight )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX + 1, iStartY, 0, 2 );//! 右

 break;

 case 4:

 if ( (iStartX - 1) = iSrchRngHorLeft )

 if ( (iStartY + 1) = iSrchRngVerBottom )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX - 1, iStartY + 1, 0, 2 );//! 左下 

 if ( (iStartY - 1) = iSrchRngVerTop )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX - 1, iStartY - 1, 0, 2 );//! 左上 

 break;

 case 5:

 if ( (iStartX + 1) = iSrchRngHorRight )

 if ( (iStartY - 1) = iSrchRngVerTop )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX + 1, iStartY - 1, 0, 2 );//! 右上 

 if ( (iStartY + 1) = iSrchRngVerBottom )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX + 1, iStartY + 1, 0, 2 );//! 右下 

 break;

 case 6:

 if ( (iStartX - 1) = iSrchRngHorLeft )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX - 1, iStartY , 0, 2 );//! 左

 if ( (iStartY + 1) = iSrchRngVerBottom )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iStartY + 1, 0, 2 );//! 下

 break;

 case 7:

 if ( (iStartY + 1) = iSrchRngVerBottom )

 if ( (iStartX - 1) = iSrchRngHorLeft )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX - 1, iStartY + 1, 0, 2 );//! 左下 

 if ( (iStartX + 1) = iSrchRngHorRight )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX + 1, iStartY + 1, 0, 2 );//! 右下 

 break;

 case 8:

 if ( (iStartX + 1) = iSrchRngHorRight )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX + 1, iStartY, 0, 2 );//! 右

 if ( (iStartY + 1) = iSrchRngVerBottom )

 xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iStartY + 1, 0, 2 );//! 下

 break;

 default:

 assert( false );

 break;

 } // switch( rcStruct.ucPointNr )

}





p /p pre name= code "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/31170">
p xTZSearch调用了2个最为主要的函数:xTZ8PointDiamondSearch和xTZ2PointSearch,值得一提的是,HM中还提供了另外一个搜索函数xTZ8PointSquareSearch,但由于实际并没有使用这个函数,且它其实跟钻石搜索只是搜索点的选择略有不同,分析起来基本上也是一样的。 /p p br /p p /p pre code_s
p /p pre code_snippet_id= 539588 snippet_file_name= blog_20141202_1_7201235 name= code "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/31172">
p /p pre name= code "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/31175">
p /p pre name= code "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/31174">
p /p pre name= code "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/31176">
p /p pre code_snippet_id= 539245 snippet_file_name= blog_20141202_1_7049848 name= code "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/31173">
p /p pre name= code "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/31177">
p 运动估计的英文名称是Motion Estimation,是视频编码和视频处理(例如去交织)中广泛使用的一种技术。 /p p br /p p 运动估计的 strong span "feed-item-img" target="_blank" href="https://developer.aliyun.com/article/31164">
p /p pre name= code "author-img" src="https://ucc.alicdn.com/avatar/img_b52c3e366f5980ae86989f8a252e3c5f.jpg?x-oss-process=image/resize,h_150,m_lfit" />