x264 当前宏块的mvp计算

mvp全称predict mv,预测的mv。

简单来说就是当前宏块,通过周围的几个宏块的mv预测出本宏块的mv,这个是根据画面中物体移动特性来预估的。因为画面中大多都是平移的物体。

mb_analyse_inter_p16x16()-->

void x264_mb_predict_mv_16x16( x264_t *h, int i_list, int i_ref, int16_t mvp[2] )

{//参数说明,h 上下文,i_list 参考方向(0向前/1向后) i_ref 当前搜索的参考帧

    int     i_refa = h->mb.cache.ref[i_list][X264_SCAN8_0 - 1];//当前宏块左边的块的参考帧
    int16_t *mv_a  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 1];// 当前宏块左边的宏块的参考mv
    int     i_refb = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8]; //当前宏块正上方的宏块的参考帧
    int16_t *mv_b  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8];// 当前宏块正上方的参考快mv
    int     i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 + 4];//当前宏块的右上方宏块的参考帧
    int16_t *mv_c  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8 + 4];//当前宏块右上方的块的参考mv

int i_count = (i_refa == i_ref) + (i_refb == i_ref) + (i_refc == i_ref);// 判断有几个参考mv是有效的,

如果周围的参考宏块的参考帧和当前参考帧不是同一个,那这个参考的mv就没意义

    if( i_count > 1 )// 如果大于一个,则求中位数
    {
median:
        x264_median_mv( mvp, mv_a, mv_b, mv_c );
    }
    else if( i_count == 1 )// 如果等于 1 ,则直接使用这个mv
    {
        if( i_refa == i_ref )
            CP32( mvp, mv_a );
        else if( i_refb == i_ref )
            CP32( mvp, mv_b );
        else
            CP32( mvp, mv_c );
    }

}

这里就是选择mvp的过程,前面有写过一篇博客,介绍当前宏块的参考宏块搜索过程,就是从mvp的位置开始。

注意这里搜索的时候并不是从当前宏块对应的位置开始搜索的,而是从mvp的位置开始搜索的。

mvp计算还有另外几个函数,但是思路基本是这样的。

你可能感兴趣的:(音视频)