x264_macroblock_cache_load()函数分析

学习使用,转载,多谢作者!

http://chuanzhang.425.blog.163.com/blog/static/1143198872010231575430/

功能:完成将已编码数据参数和待编码数据装入到h->mb.cache中,下图是BUF中存储的数据在以MB为单位的时候的存储顺序

 

x264_macroblock_cache_load()函数分析_第1张图片

 

----------------------计算各种类型宏块的位置-------------------------------

int i_mb_xy = i_mb_y * h->mb.i_mb_stride + i_mb_x;

--得到MB位置,其中h->mb.i_mb_stride为原始数据以MB为单位的宽度

 

int i_mb_4x4 = 4*(i_mb_y * h->mb.i_b4_stride + i_mb_x);

--得到4x4MB位置,其中h->mb.i_b4_stride为原始数据以4x4MB为单位的宽度

 

int i_mb_8x8 = 2*(i_mb_y * h->mb.i_b8_stride + i_mb_x);

----得到8x8MB位置,其中h->mb.i_b8_stride为原始数据以8x8MB为单位的宽度

 

int i_top_y = i_mb_y - (1 << h->mb.b_interlaced);

--得到当前MB上一个MB的Y坐标

 

int i_top_xy = i_top_y * h->mb.i_mb_stride + i_mb_x;

--得到当前MB上面一个MB的位置

 

int i_top_4x4 = (4*i_top_y+3) * h->mb.i_b4_stride + 4*i_mb_x;

--得到当前4x4MB上面一个4x4MB的位置

int i_top_8x8 = (2*i_top_y+1) * h->mb.i_b8_stride + 2*i_mb_x;

--得到当前8x8MB上面一个8x8MB的位置

 

 

----------------------------装入周围宏块的参数---------------------------------

    --装入TOP-MB的相关参数

        h->mb.i_mb_type_top = i_top_type= h->mb.type[i_top_xy];

--得到TOP-MB的类型

        h->mb.cache.i_cbp_top = h->mb.cbp[i_top_xy];

--得到TOP-MB的CBP

        h->mb.i_neighbour |= MB_TOP;

--标注当前MB的TOP-MB可用

MEM4(&h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8]) = MEM4(&h->mb.intra4x4_pred_mode[i_top_xy][0]);

--装入TOP-MB临近当前MB的4个4X4子块的预测模式

        MEM4(&h->mb.cache.non_zero_count[x264_scan8[0] - 8]) = MEM4(&h->mb.non_zero_count[i_top_xy][12]);

--装入TOP-MB临近当前MB的nzc编码值

    }

    else

    {--没有有效的TOP-MB,则相关参数设置为不可用

        h->mb.i_mb_type_top = -1;

        h->mb.cache.i_cbp_top = -1;

        /* load intra4x4 */

        h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] =

        h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] =

        h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] =

        h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = -1;

        /* load non_zero_count */

        h->mb.cache.non_zero_count[x264_scan8[0] - 8] =

        h->mb.cache.non_zero_count[x264_scan8[1] - 8] =

        h->mb.cache.non_zero_count[x264_scan8[4] - 8] =

        h->mb.cache.non_zero_count[x264_scan8[5] - 8] =

        h->mb.cache.non_zero_count[x264_scan8[16+0] - 8] =

        h->mb.cache.non_zero_count[x264_scan8[16+1] - 8] =

        h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 8] =

        h->mb.cache.non_zero_count[x264_scan8[16+4+1] - 8] = 0x80;

    }

--装入LEFT-MB相关参数

--装入MB_TOPRIGHT相邻MB的信

--装入MB_TOPLEFT相邻MB的信

 

--------------------------装入编码图像块和参考图像数据----------------------------------

--搬移重建数据到参考数据位置,见《宏块的原始编码数据和重建数据的存储结构》中的说明

  行方向的参考数据未搬移

 

--调用x264_macroblock_load_pic_pointers()函数

完成以下功能:

1、   设置象素分量行宽度,指扩展之后的宽度

2、   h->fenc->plane[i][i_pix_offset]中将原始数据读到h->mb.pic.p_fenc[i]中

3、   将行参考数据搬移到h->mb.pic.p_fdec[i]数组中,在数组中的偏移量将宏块的原始编码数据和重建数据的存储结构》中的说明

4、   从参考图像中得到对应于当前MB的参考宏块数据指针,存储到h->mb.pic.p_fref[0][j][k]中,其中0表示为前向参考图像,J表示是第几个参考图像,K表示为不同的象素分量,推测[0]->Y,[1/2/3]为滤波后的,[4]->cr,[5]->cb

你可能感兴趣的:(x264_macroblock_cache_load()函数分析)