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个像素。

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

 

posted on 2012-05-09 13:12  hatreds  阅读(209)  评论(0编辑  收藏  举报