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;

 

 

 

 

 

posted on 2012-04-26 11:43  hatreds  阅读(725)  评论(0编辑  收藏  举报