将编码该宏块所需的信息加载到mb.pic、mb.cache两个结构体中,记录相邻宏块的存在性。
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_scan8是一个偏移量查找表。0-15:宏块中16个4x4亮度块的偏移位置;16-19:宏块中4个4x4Cb块的偏移位置;20-23:宏块中4个Cr块的偏移位置。x264_scan8将在mb.cache的很多成员里做下标索引值。
请见 http://qiudw1020.blog.163.com/blog/static/120913456200991811025859/
先对照宏块里面块的编码数序看
(1)h->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);
4、1的左参考块确定,而上、左上、右上参考块都不确定
(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);
2、8、10的上、右上参考块确定,而左、左上参考块都不确定
(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;
这里有点让我看不懂,7、13、15好理解,7、13、15左、上、左上参考块都确定,这里不写右上(7、13、15的右上和0的右上是不同的,宏块编码顺序和块的编码顺序也是一样的,0的右上是右上角的宏块,而7、13、15的右上是右边的宏块。右边的宏块总是在左边的宏块之后编码。如下图宏块1在宏块2之前编码,宏块3在宏块2之后编码。) 3、11有点让人看不懂,3、11左、上、左上、右上参考块都确定,为什么和7、13、15放一起呢? 如果看下编码顺序就不难发现了,3右上是4,而4是在3之后编码。所以3右上参考块是不确定的,也就将3和7、13、15放在一起了。(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;