• 426 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;

     

     

  • 相关阅读:
    OOP、DI、IOC的情爱恩仇录
    NuGet:添加EntityFramework
    DataGrid之DataGridComboBoxColumn,DataGridCheckBoxColumn,DataGridHyperlinkColumn,DataGridTextColumn
    JohnSon:动态创建模块选项卡
    maf实例
    MVVM理解之逐步重构成为MVVM模式,比MVC的独到之处
    我学Unity系列1:Unity和Mef的比较
    微软一站式代码资料
    匿名方法,泛型委托,Lambda表达式
    关于JS表单验证(转)
  • 原文地址:https://www.cnblogs.com/hatreds/p/2473343.html
Copyright © 2020-2023  润新知