x264_scan8分析

x264_scan8分析
? 看到有好几次,有朋友问到 x264_scan8这个表格储存的是什么资料。开始的时候,的确让人费解,越看越糊涂。
在很多地方都直接或者间接通过这个表格来保存资料。比如:
h->mb.cache.intra 4x 4_pred_mode[ x264_scan8[0] - 8] = h->mb.intra 4x 4_pred_mode[i_top_xy][0];
h->mb.cache.intra 4x 4_pred_mode[ x264_scan8[1] - 8] = h->mb.intra 4x 4_pred_mode[i_top_xy][1];
h->mb.cache.intra 4x 4_pred_mode[ x264_scan8[ 4] - 8] = h->mb.intra 4x 4_pred_mode[i_top_xy][2];
h->mb.cache.intra 4x 4_pred_mode[ x264_scan8[5] - 8] = h->mb.intra 4x 4_pred_mode[i_top_xy][3];
很多地方都是通过 x264_scan8找到数组的下标,那么这个 x264_scan8表格是如何定义的呢,
我们看
static const int x264_scan8[16+2*4] =
{
     /* Luma */
     4+1*8, 5+1*8, 4+2*8, 5+2*8,
     6+1*8, 7+1*8, 6+2*8, 7+2*8,
     4+3*8, 5+3*8, 4+4*8, 5+4*8,
     6+3*8, 7+3*8, 6+4*8, 7+4*8,      /* Cb */
     1+1*8, 2+1*8,
     1+2*8, 2+2*8,      /* Cr */
     1+4*8, 2+4*8,
     1+5*8, 2+5*8,
};
/*
    0 1 2 3 4 5 6 7
0
1    B B    L L L L
2    B B    L L L L
3          L L L L
4    R R    L L L L
5    R R
*/ 这个注释很好的说明了,这个表格是存储的是 4x 4块,YUV 420得3分量的扫描序号,从图上看
这个扫描共有6X8= 48个数据,实际上YUV 420只有16+8=2 44X 4块,那么其他的空间用来干什么呢。
事实上,第0行,第0列,第3列,第3行都有空块.这些空块用来存储什么呢,通过分析,用来存储当前宏块
的top宏块,left宏块的 4X 4子块的扫描,比如 x264_scan8[0],代表第一个Luma的扫描,扫描序为12,
位于上图表格的( 4,1)处,(5,1)处是第二个Luma,扫描序为13,位于 x264_scan8[1],(6,1)处这时候扫描序号是1 4,位于 x264_scan8[ 4],
(7,1)扫描序号是15位于 x264_scan8[5].所以 x264_scan8[0], x264_scan8[1], x264_scan8[ 4], x264_scan8[5],代表整个宏块的
第一行的 4X 4块的扫描序号,由于我们在帧内亮度,色度预测,帧间运动矢量预测的时候,都要运用top,left侧的子块
做Left,top,或者中值预测.所以上面空出来的扫描序号用来存储top,或者left宏块的边缘子块( 4X 4)扫描。比如( 4,0)~(7,0)存储当前
宏块的top宏块下边缘的扫描(对Luma)。其他的Cb,Cr分量依次类推。
到此 x264_scan8表格分析完成,结论:存储的是当前宏块各个分量 4X 4块在8X6表格中的扫描序号。

你可能感兴趣的:(x264_scan8分析)