在這里和下一級別的分析中有必要先講一下這個h->mb.cache(沒法講,就是cache!)。
x264_macroblock_cache_load將參考幀中某位置的(重建后)數據保存進cache,供參考和反復使用。
x264_macroblock_cache_save在分析和編碼后將當前塊寫進cache。
在這些操作里面會有一個很讓人看不懂得地方,這時候需要知道它保存時按照什么保存的。x264設計了一個相當nice的一塊內存來存放,并且為其編配了一個索引,這樣又能直觀的理解,又能節省空間增加效率。索引如下:
?
static const int x264_scan8[16+2*4+3] =
{
?? ?/* 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,
?? ?/* Luma DC */
?? ?4+5*8,
?? ?/* Chroma DC */
?? ?5+5*8, 6+5*8
};
?
cache中所有數據的存放都是按照上圖中位置存放的,黃色和綠色是當前編碼的Luma(Y) 和chroma(UV),而白色部分是從list0/1中取出參考幀,并且在x264_macroblock_cache_load時將對應塊存放到這個空間里面去。cache里面包含一切有用的信息,這個設計真的很贊的!!