日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

x264_macroblock_cache_load()

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 x264_macroblock_cache_load() 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

功能:完成將已編碼數據參數和待編碼數據裝入到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

?

------------------------運動向量、參考圖像裝入---------

?

總結

以上是生活随笔為你收集整理的x264_macroblock_cache_load()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。