x264_macroblock_cache_init 的分析
来源:互联网 发布:网络博客哪个平台好 编辑:程序博客网 时间:2024/05/19 12:28
int x264_macroblock_cache_init ( x264_t *h ) 这个函数主要对cache中与宏块相关的变量进行初始化,包括为它们分配对应的内存空间。在函数里,会有一些变量的赋值一开始让人摸不着头脑,经过查找资料和跟踪代码确认,现对如下变量进行解释:
int i_mb_count = h->mb.i_mb_count; //!< 一帧图像的宏块数
h->mb.i_mb_stride = h->sps->i_mb_width;//!< 以宏块为单位的每一行的跨度h->mb.i_b8_stride = h->sps->i_mb_width * 2;//!< 以8x8块为单位的每一行的跨度h->mb.i_b4_stride = h->sps->i_mb_width * 4;//!< 以4x4块为单位的每一行的跨度
接下来一组赋值需要画图说明:
上图代表的是fdec的内存存储方式,每个符号代表内存中的一个字节,符号“.”表示无用数据,大写字母代表当前宏块的数据,Y,U,V分别代表三个色彩分量,小写字母代表当前宏块的相邻像素点的数据。
对于fdec的初始化,有如下语句:
h->mb.pic.p_fdec[0] = h->mb.pic.fdec_buf + 2*FDEC_STRIDE; h->mb.pic.p_fdec[1] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE; h->mb.pic.p_fdec[2] = h->mb.pic.fdec_buf + 19*FDEC_STRIDE + 16;
代码中FDEC_STRIDE大小为32,该值就是上图内存一行的字节数(0~F,0~F)。
p_fdec[0]、p_fdec[1]、p_fdec[2]分别指向Y、U、V三个分量数据的首地址。
对于Y分量来说,第2行才是当前宏块的数据的首地址,因此要加上2*FDEC_STRIDE。
对于U分量来说,一个宏块所有Y分量数据存完后才开始存它的数据,由上图可以看出偏移量为(2+16+1)*FDEC_STRIDE。
对于V分量来说,每一行它都紧跟在相同行数的U分量后面,由上图可以看出偏移量为U分量的偏移量+16。
有了对fdec内存存储方式的了解后,回过头来看这么几句:
h->mb.pic.p_fenc[0] = h->mb.pic.fenc_buf; h->mb.pic.p_fenc[1] = h->mb.pic.fenc_buf + 16*FENC_STRIDE; h->mb.pic.p_fenc[2] = h->mb.pic.fenc_buf + 16*FENC_STRIDE + 8;
我们知道,fenc对应的是待编码的数据,而fdec对应的是解码重建的数据,是要用来作为参考的,因此它需要保存邻点的像素值,而待编码数据是不需要保存相邻点的,所以fenc中直接存储的就是当前宏块的数据,则U、V的偏移量分别为16*FENC_STRIDE、16*FENC_STRIDE + 8。
接下来看下面这么几句:
h->mb.i_neighbour4[6] = h->mb.i_neighbour4[9] = h->mb.i_neighbour4[12] = h->mb.i_neighbour4[14] = MB_LEFT|MB_TOP|MB_TOPLEFT|MB_TOPRIGHT; h->mb.i_neighbour4[3] = h->mb.i_neighbour4[7] = h->mb.i_neighbour4[11] = h->mb.i_neighbour4[13] = h->mb.i_neighbour4[15] = h->mb.i_neighbour8[3] = MB_LEFT|MB_TOP|MB_TOPLEFT;
这里解释下i_neighbour4和i_neighbour8的含义。先看下它们的定义:
unsigned int i_neighbour8[4];unsigned int i_neighbour4[16];
i_neightbour8把一个宏块分成4个8x8的子块,编号如下,用于记录它们邻块的可用性:
/*0 12 3*/
i_neightbour4把一个宏块分成16个4x4的子块,编号如下,同样用于记录它们邻块的可用性:
/*0 1 4 5 2 3 6 78 9 12 13 10 11 14 15*/
(转载请注明出处。)
- x264_macroblock_cache_init 的分析
- core 分析的分析
- 数据分析的重要性分析
- IDS的技术分析和需求分析
- 基本面分析与技术分析的关系
- spring源代码分析(1)--Resource的分析
- 领域分析&需求分析之间的区别
- nand_flash驱动的分析(框架分析)
- uboot的编译过程分析---Makefile分析
- 分析分析几个问答网站的特色
- 位置分析:商业分析的下一个热点
- LCD驱动分析:时序的分析
- LCD驱动分析(一):时序的分析
- LCD驱动分析(一):时序的分析
- CreateProcess分析之NtCreateProcessEx() 的分析
- Android的Framework分析---5 ActivityManager分析
- Android的Framework分析---5 ActivityManager分析
- LCD驱动分析(一):时序的分析
- 有关ASINetworkQueues的问题
- 如何在C、C++中动态分配二维数组
- svn 命令总结
- 【转】Android ANR分析
- Oracle SQL的优化规则:
- x264_macroblock_cache_init 的分析
- 提高班教给我的
- ZC702开发板简介
- GDI 绘图之 BitBlt 用法
- ubuntu10.04下,利用automake工具生成Makefile
- Asp.net如何使用access数据库做profile实现按照区域显示相应语言功能
- JSON在 ios上的使用
- Struts2 JQuery Plugin 使用
- SQL OBJECTPROPERTY 函数,使用详解