zoukankan      html  css  js  c++  java
  • 428 对于 mb_cmp_init函数中一些宏定义的展开 x264_encoder_open中

    h->pixf.intra_mbcmp_x3_16x16( p_src, p_dst, a->i_satd_i16x16_dir );

     

    //in  mbcmp_init( x264_t *h )

    h->pixf.intra_mbcmp_x3_16x16 = satd ? h->pixf.intra_satd_x3_16x16 : h->pixf.intra_sad_x3_16x16;

     

    pixf->intra_sad_x3_16x16  = x264_intra_sad_x3_16x16;

    pixf->intra_satd_x3_16x16 = x264_intra_satd_x3_16x16;

     

     

    到这里就可以定位就要找到 x264_intra_satd_x3_16x16 其他的暂且不管

     

    Pixel.c中找到这个宏定义

    //#define INTRA_MBCMP( mbcmp, size, pred1, pred2, pred3, chroma, cpu, cpu2 )

    下面有这么个调用

    INTRA_MBCMP(satd, 16x16, v, h, dc, ,, _c);

    展开这个

    void x264_satd_x3_16x16()

    {

    1.   x264_predict_16x16_satd_v_c();     

    res[0] = x264_pixel_satd_16x16_c();

    2.   x264_predict_16x16_satd_h_c();

    res[1] = x264_pixel_satd_16x16_c();

    3.   x264_predict_16x16_dc_dc_c();

    res[2] = x264_pixel_satd_16x16_c();

    }

    函数123可以在predcit_16x16_init中找到定义。

     

    现在就是要找到最后一个 x264_predict_16x16_c() 这个函数

     

    仍是在pixel.c中找到这一个宏定义

    1.SATD_X_DECL7( _mmx2 )

    根据下面2展开后

    SATD_X_DECL6(_mmx2)

    SATD_X (4x4 ,_mmx2)

     

    然后STDX_DECL6(_mmx2)展开

    SATD_X(16x16,_mmx2)

    SATD_X(16x8, _mmx2)

    SATD_X(8x16 ,_mmx2)

    SATD_X(8x8  ,_mmx2)

    SATD_X(8x4  ,_mmx2)

    SATD_X(4x8  ,_mmx2)  

    SATD_X(4X4  ,_mmx2)   上面本来有哪个添加上这就是 SATD_X_DECL7 下面详细分析

     

     

     

     

    2.#define SATD_X_DECL7( cpu )\

    SATD_X_DECL6( cpu )\

    SATD_X( 4x4, cpu )

     

    3.#define SATD_X_DECL6( cpu )\

    SATD_X( 16x16, cpu )\

    SATD_X( 16x8, cpu )\

    SATD_X( 8x16, cpu )\

    SATD_X( 8x8, cpu )\

    SATD_X( 8x4, cpu )\

    SATD_X( 4x8, cpu )

     

    4.#define SATD_X( size, cpu ) \

    static void x264_pixel_satd_x3_##size##cpu( pixel *fenc, pixel *pix0, pixel *pix1, pixel *pix2,\

                                                intptr_t i_stride, int scores[3] )\

    {\

        scores[0] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix0, i_stride );\

        scores[1] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix1, i_stride );\

        scores[2] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix2, i_stride );\

    }\

    static void x264_pixel_satd_x4_##size##cpu( pixel *fenc, pixel *pix0, pixel *pix1, pixel *pix2, pixel *pix3,\

                                                intptr_t i_stride, int scores[4] )\

    {\

        scores[0] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix0, i_stride );\

        scores[1] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix1, i_stride );\

        scores[2] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix2, i_stride );\

        scores[3] = x264_pixel_satd_##size##cpu( fenc, FENC_STRIDE, pix3, i_stride );\

    }

     

    5.SATD_X(16x16,_mmx2)

    SATD_X(16x8, _mmx2)

    SATD_X(8x16 ,_mmx2)

    SATD_X(8x8  ,_mmx2)

    SATD_X(8x4  ,_mmx2)

    SATD_X(4x8  ,_mmx2)  

    SATD_X(4X4  ,_mmx2)  

    这个是上面分析的宏定义 其实都一样  降第一个放入SATD_X放入定义可以看到

     

     

     

     

    SATD_X(16x8, _mmx2)

    static void x264_pixel_satd_x4_##size##cpu

    static void x264_pixel_satd_x3_##size##cpu

     

    Static void x264_pixel_satd_x4_16x16_mmx2

    Satic void x264_pixel_satd_x3_16x16_mmx2

     

    6.继续向上一个宏定义

    #define PIXEL_SATD_C( w, h, sub )\

    static int x264_pixel_satd_##w##x##h( pixel *pix1, intptr_t i_pix1, pixel *pix2, intptr_t i_pix2 )\

     

    后面有调用

    PIXEL_SATD_C( 16, 16, x264_pixel_satd_8x4 )

    PIXEL_SATD_C( 16, 8,  x264_pixel_satd_8x4 )

    PIXEL_SATD_C( 8,  16, x264_pixel_satd_8x4 )

    PIXEL_SATD_C( 8,  8,  x264_pixel_satd_8x4 )

    PIXEL_SATD_C( 4,  16, x264_pixel_satd_4x4 )

    PIXEL_SATD_C( 4,  8,  x264_pixel_satd_4x4 )

     

    这里仍然是只带入一个

    X264_pixel_satd_16x16();

     

    最后调用到这个

    static NOINLINE int x264_pixel_satd_8x4( pixel *pix1, intptr_t i_pix1, pixel *pix2, intptr_t i_pix2 )

     

    在编译参数中添加上 --no-asm的时候可以看到 在上面函数中添加字符可以显示出来。

     

  • 相关阅读:
    MyBatis学习总结(一)——MyBatis快速入门
    Maven学习总结(五)——聚合与继承
    Maven学习总结(四)——Maven核心概念
    Maven学习总结(三)——使用Maven构建项目
    Maven学习总结(二)——Maven项目构建过程练习
    python登陆github
    反爬虫
    urllib url解析学习
    python3使用urllib获取set-cookies
    python数据存储技巧
  • 原文地址:https://www.cnblogs.com/hatreds/p/2475322.html
Copyright © 2011-2022 走看看