x264 源码 mv_range me_range与cost_mv 缓存

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
        }
    }

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值