功能:完成將已編碼數據參數和待編碼數據裝入到h->mb.cache中,下圖是BUF中存儲的數據在以MB為單位的時候的存儲順序
x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把當前宏塊的up宏塊和left宏塊的intra4x4_pred_mode,non_zero_count加載進來,放到一個數組里面,這個數組用來直接得到當前宏塊的左側和上面宏塊的相關值.要想得到當前塊的預測值,要先知道上面,左面的預測值,它的目的是替代getneighbour函數
----------------------計算各種類型宏塊的位置-------------------------------
int i_mb_xy = i_mb_y * h->mb.i_mb_stride + i_mb_x;
--得到MB位置,其中h->mb.i_mb_stride為原始數據以MB為單位的寬度
?
int i_mb_4x4 = 4*(i_mb_y * h->mb.i_b4_stride + i_mb_x);
--得到4x4MB位置,其中h->mb.i_b4_stride為原始數據以4x4MB為單位的寬度
?
int i_mb_8x8 = 2*(i_mb_y * h->mb.i_b8_stride + i_mb_x);
----得到8x8MB位置,其中h->mb.i_b8_stride為原始數據以8x8MB為單位的寬度
?
int i_top_y = i_mb_y - (1 << h->mb.b_interlaced);
--得到當前MB上一個MB的Y坐標
?
int i_top_xy = i_top_y * h->mb.i_mb_stride + i_mb_x;
--得到當前MB上面一個MB的位置
?
int i_top_4x4 = (4*i_top_y+3) * h->mb.i_b4_stride + 4*i_mb_x;
--得到當前4x4MB上面一個4x4MB的位置
int i_top_8x8 = (2*i_top_y+1) * h->mb.i_b8_stride + 2*i_mb_x;
--得到當前8x8MB上面一個8x8MB的位置
?
?
----------------------------裝入周圍宏塊的參數---------------------------------
??? --裝入TOP-MB的相關參數
?????? h->mb.i_mb_type_top = i_top_type= h->mb.type[i_top_xy];
--得到TOP-MB的類型
??????? h->mb.cache.i_cbp_top = h->mb.cbp[i_top_xy];
--得到TOP-MB的CBP
??????? h->mb.i_neighbour |= MB_TOP;
--標注當前MB的TOP-MB可用
MEM4(&h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8]) = MEM4(&h->mb.intra4x4_pred_mode[i_top_xy][0]);
--裝入TOP-MB臨近當前MB的4個4X4子塊的預測模式
??????? MEM4(&h->mb.cache.non_zero_count[x264_scan8[0] - 8]) = MEM4(&h->mb.non_zero_count[i_top_xy][12]);
--裝入TOP-MB臨近當前MB的nzc編碼值
??? }
??? else
??? {--沒有有效的TOP-MB,則相關參數設置為不可用
?????? h->mb.i_mb_type_top = -1;
??????? h->mb.cache.i_cbp_top = -1;
??????? /* load intra4x4 */
??????? h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] =
??????? h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] =
??????? h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] =
??????? h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = -1;
??????? /* load non_zero_count */
??????? h->mb.cache.non_zero_count[x264_scan8[0] - 8] =
??????? h->mb.cache.non_zero_count[x264_scan8[1] - 8] =
??????? h->mb.cache.non_zero_count[x264_scan8[4] - 8] =
??????? h->mb.cache.non_zero_count[x264_scan8[5] - 8] =
??????? h->mb.cache.non_zero_count[x264_scan8[16+0] - 8] =
??????? h->mb.cache.non_zero_count[x264_scan8[16+1] - 8] =
??????? h->mb.cache.non_zero_count[x264_scan8[16+4+0] - 8] =
??????? h->mb.cache.non_zero_count[x264_scan8[16+4+1] - 8] = 0x80;
??? }
--裝入LEFT-MB相關參數
--裝入MB_TOPRIGHT相鄰MB的信
--裝入MB_TOPLEFT相鄰MB的信
?
--------------------------裝入編碼圖像塊和參考圖像數據----------------------------------
--搬移重建數據到參考數據位置,見《宏塊的原始編碼數據和重建數據的存儲結構》中的說明
行方向的參考數據未搬移
?
--調用x264_macroblock_load_pic_pointers()函數
完成以下功能:
?
1 ?? 設置象素分量行寬度,指擴展之后的寬度
2?? 從h->fenc->plane[i][i_pix_offset]中將原始數據讀到h->mb.pic.p_fenc[i]中
3、?? 將行參考數據搬移到h->mb.pic.p_fdec[i]數組中,在數組中的偏移量將《宏塊的原始編碼數據和重建數據的存儲結構》中的說明
4、?? 從參考圖像中得到對應于當前MB的參考宏塊數據指針,存儲到h->mb.pic.p_fref[0][j][k]中,其中0表示為前向參考圖像,J表示是第幾個參考圖像,K表示為不同的象素分量,推測[0]->Y,[1/2/3]為濾波后的,[4]->cr,[5]->cb;
?
------------------------運動向量、參考圖像裝入---------
?