4-28 对于 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的时候可以看到 在上面函数中添加字符可以显示出来。

 

posted on 2012-04-28 16:10  hatreds  阅读(816)  评论(0编辑  收藏  举报