本章討論的代碼主要位于common/predict.c中。
x264_macroblock_cache_load函數(shù)在每個(gè)宏塊解碼之前初始化某些狀態(tài),在x264_slice_write函數(shù)的宏塊處理循環(huán)中被調(diào)用。 i_mb_xy: 當(dāng)前宏塊的索引 i_mb_4x4: 當(dāng)前宏塊中第一個(gè)4x4塊的索引 i_mb_8x8: 當(dāng)前宏塊中第一個(gè)8x8塊的索引 i_top_y: 上方宏塊的y索引 i_top_xy: 上方宏塊的索引 i_top_4x4: 當(dāng)前宏塊中第一個(gè)4x4塊上方的4x4塊的索引 i_top_8x8: 當(dāng)前宏塊中第一個(gè)8x8塊上方的8x8塊的索引 這里首先初始化和當(dāng)前宏塊毗鄰的已解碼塊。
這里用到x264_scan8,它指示如下掃描結(jié)構(gòu): 0 1 2 3 4 5 6 7
0 1 0 1 0 1 4 5 2 2 3 2 3 6 7 3 8 9 C D 4 0 1 A B E F 5 2 3 在空缺部分恰好可以填入相應(yīng)宏塊的毗鄰塊。
以下逐個(gè)各種分析預(yù)測(cè)情況:
對(duì)于16x16的塊:
predict_16x16 共7種預(yù)測(cè)模式:H, V, DC, P, LEFT, TOP, 128 predict_16x16_h 用左側(cè)相鄰16x16塊的右側(cè)像素沿水平方向覆蓋 predict_16x16_v 用上方相鄰16x16塊的底行像素沿豎直方向覆蓋 predict_16x16_p 右上左下均值預(yù)測(cè)覆蓋(注意均值生成) predict_16x16_dc 用左側(cè)邊沿和上方邊沿的均值作為DC預(yù)測(cè)值進(jìn)行單一覆蓋 predict_16x16_dc_left 只用左側(cè)邊沿進(jìn)行DC單一覆蓋 predict_16x16_dc_top 只用上方邊沿進(jìn)行DC單一覆蓋 predict_16x16_dc_128 用128進(jìn)行單一覆蓋 對(duì)于8x8的色差塊:
predict_8x8c_dc_128 用128進(jìn)行單一覆蓋 predict_8x8c_dc_left 上下兩個(gè)4行分別以對(duì)應(yīng)左邊沿4個(gè)像素均值單一覆蓋 predict_8x8c_dc_top 左右兩個(gè)4列分別以對(duì)應(yīng)上邊沿4個(gè)像素均值單一覆蓋 predict_8x8c_dc s0 s1 s2 b0 b1 s3 b2 b3 s?是邊沿4像素組 4個(gè)4x4塊分別用s0,s2均值,s1均值,s3均值和s1,s3均值單一覆蓋 predict_8x8c_h 用左側(cè)相鄰8x8塊的右邊沿像素沿水平方向覆蓋 predict_16x16_v 用上方相鄰16x16塊的底行像素沿豎直方向覆蓋 predict_8x8c_p 右上左下均值預(yù)測(cè)覆蓋(注意均值生成) 對(duì)于4x4的塊:(這是H264文檔經(jīng)常拿來(lái)作demo的)
predict_4x4_dc_128 用128進(jìn)行單一覆蓋 predict_4x4_dc_left 用左邊沿4個(gè)像素均值單一覆蓋 predict_4x4_dc_top 用上邊沿4個(gè)像素均值單一覆蓋 predict_4x4_dc 用左側(cè)和上方邊沿共8個(gè)像素均值單一覆蓋 predict_4x4_h 用左側(cè)相鄰4x4塊的右邊沿像素沿水平方向覆蓋 predict_4x4_v 用上方相鄰4x4塊的底行像素沿豎直方向覆蓋 predict_4x4_ddl 右上至左下預(yù)測(cè)覆蓋(注意均值生成) predict_4x4_ddr 左上至右下預(yù)測(cè)覆蓋(注意均值生成) predict_4x4_vr 左上到右下(偏下)預(yù)測(cè)覆蓋(注意均值生成) predict_4x4_hd 左上到右下(偏右)預(yù)測(cè)覆蓋(注意均值生成) predict_4x4_vl 右上到左下(偏下)預(yù)測(cè)覆蓋(注意均值生成) predict_4x4_hu 左下到右上(偏右)預(yù)測(cè)覆蓋(注意均值生成) 對(duì)于8x8亮度塊:
edge中存放 predict_8x8_dc_128 用128進(jìn)行單一覆蓋 predict_8x8_dc_left 用左側(cè)塊邊沿8個(gè)像素均值單一覆蓋 predict_8x8_dc_top 用上方塊邊沿8個(gè)像素均值單一覆蓋 predict_8x8_dc 用左側(cè)塊和上方塊邊沿共16個(gè)像素均值單一覆蓋 predict_8x8_h 用左側(cè)邊沿預(yù)測(cè)覆蓋 predict_8x8_v 用上方邊沿預(yù)測(cè)覆蓋 predict_8x8_ddl 右上到左下預(yù)測(cè)覆蓋(注意均值生成) predict_8x8_ddr 左上到右下預(yù)測(cè)覆蓋(注意均值生成) predict_8x8_vr 左上到右下(偏下)預(yù)測(cè)覆蓋(注意均值生成) predict_8x8_hd 左上到右下(偏右)預(yù)測(cè)覆蓋(注意均值生成) predict_8x8_vl 右上到左下(偏下)預(yù)測(cè)覆蓋(注意均值生成) predict_8x8_hu 左下到右上(偏右)預(yù)測(cè)覆蓋(注意均值生成) 以上“注意均值生成”指預(yù)測(cè)值一般由起點(diǎn)決定,起點(diǎn)由反向延長(zhǎng)線確定,起點(diǎn)2倍權(quán)重和兩側(cè)點(diǎn)構(gòu)成均值。
例如45度均值為以起始點(diǎn)對(duì)應(yīng)45度位置的點(diǎn)作為中心(2倍權(quán)重),其兩側(cè)點(diǎn)作為補(bǔ)充形成的均值 文章出處:飛諾網(wǎng)(www.):http://dev./course/3_program/jdkf/200798/70791.html
|
|
來(lái)自: lyz1985 > 《我的圖書(shū)館》