4-26 pixel赋值问题 mbcmp函数 宏定义
知识点
1. 宏中的 ## 和 #
首先明白宏就是替换 ## 就是连接替换中的参数
例子1
如果你有几个参数有相关作用,为了区别用param1,param2,param3表示,用这个宏可以只传递1,2,3就可以输出每一个你想要的参数
//类似于c++中多态的作用
#define TEST1(id) cout<<param##id<<endl;
void main()
{
int param1 = 1, param2 = 2, param3 = 3;
TEST1(1);
TEST1(2);
TEST1(3);
}
单个的#就是在参数两侧加上””
2.\多行的宏定义
3.缺少参数时候可以在宏里面使用##但是不可以直接缺少参数
下面这种情况不能够通过编译
#define TEST2( a, b ) cout<<a<<b
void main()
{
int e = 1,b=2;
TEST2( e, );
}
这个就可以,输出1
#define TEST( a, b ) cout<<a##b
void main()
{
int e = 1,b=2;
TEST( e, );
}
Pixel.c中的宏定义
INT8 ( satd )
INT8 ( sad )
//这a里¤?就¨ª是º?上¦?面?说¦Ì的Ì?那?种?情¨¦况? 缺¨¡À少¦¨´参?数ºy 但Ì?是º?可¨¦以°?看¡ä到Ì? 其?实º¦Ìcpu就¨ª是º?在¨²别Àe的Ì?宏¨º里¤?面?通ª¡§过y##使º1用®?的Ì?
#define INT8( name, cpu ) INT8_NAME( name, name, cpu )
#define INT8_NAME ( name1, name2, cpu ) \
INT7_NAME( name1, name2, cpu) \
pixf->name1[PIXEL_4x16] = x264_pixel_##name2##_4x16##cpu
//第二行容易理解,但是INT7_NAME 和 INT8_NAME 中相同,一直调用其他的
所以先分析INT2_NAME
#define INIT2_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_16x16] = x264_pixel_##name2##_16x16##cpu;\
pixf->name1[PIXEL_16x8] = x264_pixel_##name2##_16x8##cpu;
#define INIT4_NAME( name1, name2, cpu ) \
INIT2_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_8x16] = x264_pixel_##name2##_8x16##cpu;\
pixf->name1[PIXEL_8x8] = x264_pixel_##name2##_8x8##cpu;
#define INIT5_NAME( name1, name2, cpu ) \
INIT4_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_8x4] = x264_pixel_##name2##_8x4##cpu;
#define INIT6_NAME( name1, name2, cpu ) \
INIT5_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_4x8] = x264_pixel_##name2##_4x8##cpu;
#define INIT7_NAME( name1, name2, cpu ) \
INIT6_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_4x4] = x264_pixel_##name2##_4x4##cpu;
#define INIT8_NAME( name1, name2, cpu ) \
INIT7_NAME( name1, name2, cpu ) \
pixf->name1[PIXEL_4x16] = x264_pixel_##name2##_4x16##cpu;
//INT8(satd) 展开后
pixf->name1[PIXEL_16x16] = x264_pixel_satd_16x16;
pixf->name1[PIXEL_16x8] = x264_pixel_satd_16x8;
pixf->name1[PIXEL_8x16] = x264_pixel_satd_8x16;
//下面依次的调用到INT2_NAME
最开始调用的是 h->pixf.intra_mbcmp_x3_16x16( p_src, p_dst, a->i_satd_i16x16_dir );
初始化的时候 h->pixf.intra_mbcmp_x3_16x16 = satd ? h->pixf.intra_satd_x3_16x16 : h->pixf.intra_sad_x3_16x16;