mv_range和me_range都是表示的搜索范围,比如me_range=8,表示以本像素点为中心,16x16的范围内搜索。
mv_range表示是mv的范围,这两是一个意思,只是单位不同,mv_range是以1/4为单位的,me_range是以单个像素为单位的。
所以看初始化函数:
static int init_costs( x264_t *h, float *logs, int qp )
{
if( h->cost_mv[qp] )
return 0;
int mv_range = h->param.analyse.i_mv_range;
int lambda = x264_lambda_tab[qp];//
/* factor of 4 from qpel, 2 from sign, and 2 because mv can be opposite from mvp */
CHECKED_MALLOC( h->cost_mv[qp], (4*4*mv_range + 1) * sizeof(uint16_t) );// 4 半像素, 2 * 2 正反方向
h->cost_mv[qp] += 2*4*mv_range;
for( int i = 0; i <= 2*4*mv_range; i++ )
{// 每一个qp 值都计算一个 cost ,然后再做对比
h->cost_mv[qp][-i] =
h->cost_mv[qp][i] = X264_MIN( (int)(lambda * logs[i] + .5f), UINT16_MAX );
}
}
这个函数代码注释已经说明了,cost_mv数组大小为4x4xmv_range 第一个4表示h264半像素最小精度,1/4.第二个4表示为2x2,
2 表示mv方向正负,另一个2表示x,y坐标轴。
if( h->param.analyse.i_me_method >= X264_ME_ESA && !h->cost_mv_fpel[qp][0] )
{
for( int j = 0; j < 4; j++ )
{
CHECKED_MALLOC( h->cost_mv_fpel[qp][j], (4*mv_range + 1) * sizeof(uint16_t) );
h->cost_mv_fpel[qp][j] += 2*mv_range;
for( int i = -2*mv_range; i < 2*mv_range; i++ )// 初始化 cost_mv_fpel 将
h->cost_mv_fpel[qp][j][i] = h->cost_mv[qp][i*4+j];//以1/4像素单位来初始化运动mv
}
}