对x264_macroblock_cache_load的理解

  1. X264版本: 2004/06/03
  2. 函数作用:

将编码该宏块所需的信息加载到mb.pic、mb.cache两个结构体中,记录相邻宏块的存在性。

  1. 函数过程:
    1. 初始化坐标信息,这些坐标信息将在下面用作下标。
    2. 加载mb.pic:实质上是加载待编宏块的像素值、宏块在帧内预测时所需的相邻像素值、建立参考帧列表中同一位置宏块的地址列表。
    3. 加载mb.cache:加载存在的相邻宏块的属性,如宏块类型、预测模式、参考帧号、运动向量、运动向量差等。
    4. 记录16x16宏块中16个4x4块的可用邻块。
  2. 一些细节说明:
    1. mp.pic.p_fenc与mp.pic.p_fdec的数据存储格式

    mp.pic.p_fenc[3]分别存储待编宏块的Y/U/V成分,其内存表示如下图所示。图中,Y/B/R分别代表Y/U/V的一个4X4像素点阵。

YYYY

YYYY

YYYY

YYYY

BBRR

BBRR

    mp.pic.p_fdec[3]分别存储待解码宏块的Y/U/V成分,还有解码时需要的相邻像素值,其内存表示如下图所示(图出处暂缺)。图中,小写代表相邻像素值,大写代表待解码像素值。

对x264_macroblock_cache_load的理解

  1. x264_scan8

    x264_scan8是一个偏移量查找表。0-15:宏块中16个4x4亮度块的偏移位置;16-19:宏块中4个4x4Cb块的偏移位置;20-23:宏块中4个Cr块的偏移位置。x264_scan8将在mb.cache的很多成员里做下标索引值。

对x264_macroblock_cache_load的理解

  1. 坐标说明

    请见 http://qiudw1020.blog.163.com/blog/static/120913456200991811025859/

  1. 记录可用邻块的执行过程说明

先对照宏块里面块的编码数序看

对x264_macroblock_cache_load的理解

1h->mb.i_neighbour4[0] =h->mb.i_neighbour8[0] = (h->mb.i_neighbour & (MB_TOP|MB_LEFT|MB_TOPLEFT)) | ((h->mb.i_neighbour & MB_TOP) ? MB_TOPRIGHT : 0);

  0左上右上参考块都不确定.但是为什么把TOPRIGHT单独列出来呢,如上图位置关系,0块就是当TOP有效时,TOPRIGHT才有效。以下同理。

(2)h->mb.i_neighbour4[4] =h->mb.i_neighbour4[1] = MB_LEFT | ((h->mb.i_neighbour & MB_TOP) ? (MB_TOP|MB_TOPLEFT|MB_TOPRIGHT) : 0);

41参考块确定,而左上右上参考块都不确定

(3)h->mb.i_neighbour4[2] =

h->mb.i_neighbour4[8] =

h->mb.i_neighbour4[10] =

h->mb.i_neighbour8[2] = MB_TOP|MB_TOPRIGHT | ((h->mb.i_neighbour & MB_LEFT) ? (MB_LEFT|MB_TOPLEFT) : 0);

  2810右上参考块确定,而左上参考块都不确定

(4)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;

这里有点让我看不懂,71315好理解,71315左上参考块都确定,这里不写右上(71315的右上和0的右上是不同的,宏块编码顺序和块的编码顺序也是一样的,0的右上是右上角的宏块,而71315的右上是右边的宏块。右边的宏块总是在左边的宏块之后编码。如下图宏块1在宏块2之前编码,宏块3在宏块2之后编码。) 311有点让人看不懂,311左上右上参考块都确定,为什么和71315放一起呢? 如果看下编码顺序就不难发现了,3右上是4,而4是在3之后编码。所以3右上参考块是不确定的,也就将371315放在一起了。(11同理)

(5)h->mb.i_neighbour4[5] =h->mb.i_neighbour8[1] = MB_LEFT | (h->mb.i_neighbour & MB_TOPRIGHT) | ((h->mb.i_neighbour & MB_TOP) ? MB_TOP|MB_TOPLEFT : 0);

  5参考块确定,左上右上参考块都不确定

(6) 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;

你可能感兴趣的:(cache)