zoukankan      html  css  js  c++  java
  • 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个像素。

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

     

  • 相关阅读:
    HTML5实现音频播放
    百度编辑器UEditor常用设置函数大全
    .Net一般处理程序来实现用户名的验证
    软件设计师13-数据库设计
    软件设计师12-数据流图
    百度云BCC安装WordPress镜像
    Java获取客户端真实IP地址
    软件设计师11-面向对象技术
    百度云BCC主机宝镜像
    软件设计师10-系统开发模型
  • 原文地址:https://www.cnblogs.com/hatreds/p/2491582.html
Copyright © 2011-2022 走看看