[置顶] x264_mb_predict_mv_16x16 函数分析

void x264_mb_predict_mv_16x16( x264_t *h, int i_list, int i_ref, int16_t mvp[2] )
{
    int     i_refa = h->mb.cache.ref[i_list][X264_SCAN8_0 - 1];			//!< a块参考帧序号
    int16_t *mv_a  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 1];			//!< a块的运动矢量
    int     i_refb = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8];			//!< b块参考帧序号
    int16_t *mv_b  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8];			//!< b块的运动矢量
    int     i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 + 4];		//!< c块参考帧序号
    int16_t *mv_c  = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8 + 4];		//!< c块的运动矢量

    int i_count;

    if( i_refc == -2 )	//!< unavailable
    {
        i_refc = h->mb.cache.ref[i_list][X264_SCAN8_0 - 8 - 1];	//!< d块(左上)的参考帧序号
        mv_c   = h->mb.cache.mv[i_list][X264_SCAN8_0 - 8 - 1];	//!< d块的运动矢量
    }

    i_count = 0;	//!< 统计当前宏块所参考的参考帧序号与邻块所参考的参考帧序号相同数
    if( i_refa == i_ref ) i_count++;
    if( i_refb == i_ref ) i_count++;
    if( i_refc == i_ref ) i_count++;

    if( i_count > 1 )	//!< 相同数大于1时,直接取这三个邻块的运动矢量的中值作为预测运动矢量
        x264_median_mv( mvp, mv_a, mv_b, mv_c );
    else if( i_count == 1 )	//!< 只有一个邻块与其相同时,预测运动矢量设置为该邻块的运动矢量
    {
        if( i_refa == i_ref )
            *(uint32_t*)mvp = *(uint32_t*)mv_a;
        else if( i_refb == i_ref )
            *(uint32_t*)mvp = *(uint32_t*)mv_b;
        else
            *(uint32_t*)mvp = *(uint32_t*)mv_c;
    }
	//!< 没有邻块与其相同的两种情况
    else if( i_refb == -2 && i_refc == -2 && i_refa != -2 ) //!< 只有a块是存在的,则预测运动矢量设置为该邻块的运动矢量
        *(uint32_t*)mvp = *(uint32_t*)mv_a;
    else	//!< b块和c块至少有一个是存在的,则取这三个邻块的运动矢量的中值作为预测运动矢量
        x264_median_mv( mvp, mv_a, mv_b, mv_c );
}
(转载请注明出处。)

你可能感兴趣的:(x264,h.264,h.264)