本章讨论的代码主要位于common/predict.c中。
x264_macroblock_cache_load函数在每个宏块解码之前初始化某些状态,在x264_slice_write函数的宏块处理循环中被调用。
i_mb_xy: 当前宏块的索引
i_mb_4x4: 当前宏块中第一个4x4块的索引
i_mb_8x8: 当前宏块中第一个8x8块的索引
i_top_y: 上方宏块的y索引
i_top_xy: 上方宏块的索引
i_top_4x4: 当前宏块中第一个4x4块上方的4x4块的索引
i_top_8x8: 当前宏块中第一个8x8块上方的8x8块的索引
这里首先初始化和当前宏块毗邻的已解码块。
这里用到x264_scan8,它指示如下扫描结构:
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
在空缺部分恰好可以填入相应宏块的毗邻块。
以下逐个各种分析预测情况:
对于16x16的块:
predict_16x16
共7种预测模式:H, V, DC, P, LEFT, TOP, 128
predict_16x16_h
用左侧相邻16x16块的右侧像素沿水平方向覆盖
predict_16x16_v
用上方相邻16x16块的底行像素沿竖直方向覆盖
predict_16x16_p
右上左下均值预测覆盖(注意均值生成)
predict_16x16_dc
用左侧边沿和上方边沿的均值作为DC预测值进行单一覆盖
predict_16x16_dc_left
只用左侧边沿进行DC单一覆盖
predict_16x16_dc_top
只用上方边沿进行DC单一覆盖
predict_16x16_dc_128
用128进行单一覆盖
对于8x8的色差块:
predict_8x8c_dc_128
用128进行单一覆盖
predict_8x8c_dc_left
上下两个4行分别以对应左边沿4个像素均值单一覆盖
predict_8x8c_dc_top
左右两个4列分别以对应上边沿4个像素均值单一覆盖
predict_8x8c_dc
s0 s1
s2 b0 b1
s3 b2 b3
s?是边沿4像素组
4个4x4块分别用s0,s2均值,s1均值,s3均值和s1,s3均值单一覆盖
predict_8x8c_h
用左侧相邻8x8块的右边沿像素沿水平方向覆盖
predict_16x16_v
用上方相邻16x16块的底行像素沿竖直方向覆盖
predict_8x8c_p
右上左下均值预测覆盖(注意均值生成)
对于4x4的块:(这是H264文档经常拿来作demo的)
predict_4x4_dc_128
用128进行单一覆盖
predict_4x4_dc_left
用左边沿4个像素均值单一覆盖
predict_4x4_dc_top
用上边沿4个像素均值单一覆盖
predict_4x4_dc
用左侧和上方边沿共8个像素均值单一覆盖
predict_4x4_h
用左侧相邻4x4块的右边沿像素沿水平方向覆盖
predict_4x4_v
用上方相邻4x4块的底行像素沿竖直方向覆盖
predict_4x4_ddl
右上至左下预测覆盖(注意均值生成)
predict_4x4_ddr
左上至右下预测覆盖(注意均值生成)
predict_4x4_vr
左上到右下(偏下)预测覆盖(注意均值生成)
predict_4x4_hd
左上到右下(偏右)预测覆盖(注意均值生成)
predict_4x4_vl
右上到左下(偏下)预测覆盖(注意均值生成)
predict_4x4_hu
左下到右上(偏右)预测覆盖(注意均值生成)
对于8x8亮度块:
edge中存放
predict_8x8_dc_128
用128进行单一覆盖
predict_8x8_dc_left
用左侧块边沿8个像素均值单一覆盖
predict_8x8_dc_top
用上方块边沿8个像素均值单一覆盖
predict_8x8_dc
用左侧块和上方块边沿共16个像素均值单一覆盖
predict_8x8_h
用左侧边沿预测覆盖
predict_8x8_v
用上方边沿预测覆盖
predict_8x8_ddl
右上到左下预测覆盖(注意均值生成)
predict_8x8_ddr
左上到右下预测覆盖(注意均值生成)
predict_8x8_vr
左上到右下(偏下)预测覆盖(注意均值生成)
predict_8x8_hd
左上到右下(偏右)预测覆盖(注意均值生成)
predict_8x8_vl
右上到左下(偏下)预测覆盖(注意均值生成)
predict_8x8_hu
左下到右上(偏右)预测覆盖(注意均值生成)
以上“注意均值生成”指预测值一般由起点决定,起点由反向延长线确定,起点2倍权重和两侧点构成均值。
例如45度均值为以起始点对应45度位置的点作为中心(2倍权重),其两侧点作为补充形成的均值。
H.264标准规定,首先由macroblock层的mb_type导出intra块的预测类型macroblock prediction mode,其中包含子块尺度信息,有4x4,8x8和16x16三种。4x4和8x8按照标准由变换尺寸区分,4x4是最常用的模式。
在确定预测类型之后,对于含16个子块的4x4模式,每个子块的预测模式(即上述讨论)由标准规定的判决算法给出:
<...>