• 5_9 ___2 mc函数


    同样追本朔源上面那个load里面有一个mc的拷贝函数这里进行分析

    x264_mc_init( h->param.cpu, &h->mc );

     

    //函数声明以及要找的函数  mc_copy_w16是以宏定义方式来声明的

    void x264_mc_init( int cpu, x264_mc_functions_t *pf ) 

     pf->copy[PIXEL_16x16] = mc_copy_w16;

     

    宏定义

    #define MC_COPY(W) \

    static void mc_copy_w##W( pixel *dst, intptr_t i_dst, pixel *src, intptr_t i_src, int i_height ) \

    { \

        mc_copy( src, i_src, dst, i_dst, W, i_height ); \

    }

    MC_COPY( 16 )

     

    展开  可以用函数名字中的字符作为函数体中参数,貌似就宏定义可以

    Static void mc_copy_w16()

    {

    Mc_copy(src, i_src, dst, i_dst, W, i_height);

    }

     

    第一个是源地址,第二个是偏移步长,上一次函数名字中的字符是为了分配空间,高度是为了循环赋值,第一个参数是原本像素指针,然后加上第二个参数作为步长,来进行循环的赋值

    Memcpy将 src赋值到dst  p_fencsrc stride16  dstp_fenc_planestride 1984

    static void mc_copy( pixel *src, intptr_t i_src_stride, pixel *dst, intptr_t i_dst_stride, int i_width, int i_height )

    {

        for( int y = 0; y < i_height; y++ )

        {

            memcpy( dst, src, i_width * sizeof(pixel) );

     

            src += i_src_stride;

            dst += i_dst_stride;

        }

    }

     

     h->mc.copy[PIXEL_16x16]( h->mb.pic.p_fenc[i], FENC_STRIDE, h->mb.pic.p_fenc_plane[i], i_stride2, 16 );

    回到这个最开始的调用函数,这里有点不明白,的步长竟然不一样,以前一直以为一样的

    FENC_STRIDE 16  FDEC_STRIDE 32

    接上面一个分析,将刚才fenc_plane中偏移好的地址复制到p_fenc中。这是初始地址,然后宏块高度是16,可以想到就是将方形宏块变成了线性宏块,一次复制了16个像素。

    至此编码部分指针偏移完全结束

     

  • 相关阅读:
    gitlab使用
    小程序顶部导航栏标题不居中
    mpvue中使用vant-weapp
    原生js实现轮播图
    vue无法检测数组的变动
    vue报错TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function
    vue绑定style使用需要添加浏览器引擎前缀的 CSS 属性
    《孙子算经》之"物不知数"题:中国剩余定理
    Java大数处理类:BigInteger类和BigDecimal类
    【转】操作系统典型调度算法
  • 原文地址:https://www.cnblogs.com/hatreds/p/2491582.html
Copyright © 2020-2023  润新知