x264_macroblock_analyse模块分析-3

来源:互联网 发布:js div加载html页面 编辑:程序博客网 时间:2024/06/06 03:17

5void x264_me_refine_qpel( x264_t *h, x264_me_t *m )


该函数一开始得到半象素、1/4象素搜索的次数(菱形小模板),分别为hpelq hpel,然后调用refine_subpel(),去看看!

if( hpel_iters )    {        int mx = x264_clip3( m->mvp[0], h->mb.mv_min_spel[0], h->mb.mv_max_spel[0] );        int my = x264_clip3( m->mvp[1], h->mb.mv_min_spel[1], h->mb.mv_max_spel[1] );        if( mx != bmx || my != bmy )            COST_MV_SAD( mx, my, -1 );    }//检测MVp的小数精度。for( i = hpel_iters; i > 0; i-- )    {        odir = bdir;        omx = bmx;        omy = bmy;        COST_MV_SAD( omx, omy - 2, 0 );        COST_MV_SAD( omx, omy + 2, 1 );        COST_MV_SAD( omx - 2, omy, 2 );        COST_MV_SAD( omx + 2, omy, 3 );        if( bmx == omx && bmy == omy )            break;    }//对半象素精度进行hpel_iters次小菱形搜索。后面有1/4象素精度的qpel_iters次小模板搜索,略。

6static uint8_t *get_ref( uint8_t *src[4], int i_src_stride, uint8_t *dst,    int * i_dst_stride, int mvx,int mvy, int i_width, int i_height )

该函数得到亚象素搜索时参考块的指针。

src1src2分别指向半象素精度块。1/4搜索时需要临时插值,就是pixel_avg()函数的只能功能。

值得注意的是变量correction的作用,当作是1/4插值时的偏移量吧。N个人问过我,其实结合1/4象素插值,仔细推导一下就出来了。

7static void x264_mb_analyse_intra( x264_t *h, x264_mb_analysis_t *a, int i_cost_inter )

依次检测Intra_16x16Intra4x4Intra8x8的最佳模式。

值得注意,if(subme<=1)

h->pixf.mbcmp是求sad

else

h->pixf.mbcmp是求satd

另外,对与Intra4x4Intra8x8,此时就要进行真正的变换量化、反变换反量化、重建,因为要为后续的块做参考。而且,就算其系数值很小,也不能改变cbp,切记切记。

具体分析略。

8static inline void x264_mb_analyse_transform( x264_t *h )

就是对残差进行4x48x8satd变换,比较绝对和值,值较小对应的尺寸用于变换的尺寸。

原创粉丝点击