本章讨论的代码主要位于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倍权重),其两侧点作为补充形成的均值 |
|