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