case X264_ME_DIA://钻石搜索算法
{
/* diamond search, radius 1 */
bcost <<= 4;
int i = i_me_range;
do
{
COST_MV_X4_DIR( 0,-1, 0,1, -1,0, 1,0, costs );//计算中心的周围4个点cost
COPY1_IF_LT( bcost, (costs[0]<<4)+1 );
COPY1_IF_LT( bcost, (costs[1]<<4)+3 );
COPY1_IF_LT( bcost, (costs[2]<<4)+4 );
COPY1_IF_LT( bcost, (costs[3]<<4)+12 );
//通过与中心点比较,得出最小的cost点
if( !(bcost&15) )//如果中心点cost最小,提前结束
break;
//将bcost值移出,将上面计算中心周围4个点的编号(1,3,4,12)移到高位,
//再右移30位,得到正确的选择的周围4个点的坐标偏移
bmx -= (bcost<<28)>>30;
bmy -= (bcost<<30)>>30;
bcost &= ~15;//将低4位数据消除
} while( --i && CHECK_MVRANGE(bmx, bmy) );
bcost >>= 4;
break;
}
例如,假如选择点(0,-1),则对应(costs[0]<<4)+1, 则(bcost<<28)>>30的值为0,(bcost<<30)>>30的值为1,所以bmx -= 0;bmy -= 1;即选择坐标为(0,-1)的点。
假如选择点(1,0),则对应(costs[0]<<4)+12, 则(bcost<<28)>>30的值为-1,(bcost<<30)>>30的值为0,所以bmx -= -1;bmy -= 0;即选择坐标为(1,0)的点。
阅读(950) | 评论(0) | 转发(0) |