同样追本朔源上面那个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_fenc是src stride是16 dst是p_fenc_plane,stride 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个像素。
至此编码部分指针偏移完全结束