1 本文词汇约定
宏块:H264编码基本单元,16x16像素(或采样)构成
块: 由8x8像素(或采样)构成的单位
子块: 由4x4像素(或采样)构成的单位
2 帧内亮度预测模式
H264规范中,宏块有4种帧内亮度预测模式,模式编号为0,1,2,3;块与子块分别有9种帧内亮度预测模式,模式编号从0至9,即0,1,2,.......,8。具体不细说了,可查H264标准。下文以子块为例说明其亮度预测模式如何编码进码流中的。
3 子块亮度预测模式编码的句法元素
prev_intra4x4_pred_mode_flag:是否使用该子块的上左子块亮度预测模式编号的最小值,在计算出该子块的最佳亮度预测模式后,若基编号与该子块上左子块亮度预测模式编号的最小值相等,prev_intra4x4_pred_mode_flag为1,否则为0。
rem_intra4x4_pred_mode:prev_intra4x4_pred_mode_flag为0时,指示计算出的该子块的最佳亮度预测模式编号或该子块的最佳亮度预测模式编号减1。
4 子块亮度预测模式编码的句法元素赋值的伪代码过程
for( luma4x4BlkIdx=0; luma4x4BlkIdx<16; luma4x4BlkIdx++ ) { MinModeBetwennLeftAndUpSubBlock[luma4x4BlkIdx] = (如果左边子块或上边子块不可用,比如跨片片界或为非帧内编码模式) ? 2 : Min(MinModeOfLeftSubBlock,MinModeOfUpSubBlock); BestMode[luma4x4BlkIdx] = 计算子块的最佳亮度预测模式(); if(BestMode[luma4x4BlkIdx] == MinModeBetwennLeftAndUpSubBlock[luma4x4BlkIdx]) { prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] = 1; } else { prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] = 0; } if(!prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ]) { if(BestMode[luma4x4BlkIdx] < MinModeBetwennLeftAndUpSubBlock[luma4x4BlkIdx]) { rem_intra4x4_pred_mode[ luma4x4BlkIdx ] = BestMode[luma4x4BlkIdx]; } else { rem_intra4x4_pred_mode[ luma4x4BlkIdx ] = BestMode[luma4x4BlkIdx] - 1;//标注4 } } }
5 为什么要计算MinModeBetwennLeftAndUpSubBlock
每个4×4 块帧内亮度预测模式编号必须编码传给解码器以便解码。该信息可能需大量比特表示,但邻
的帧内模式通常是相关的。例如,A、B 、E 分别为左边、上边和当前块,如果 A 和B 预测模式
式1 ,E 的最佳预测模式很可能也为模式 1 。所以通常利用这种关联性编码 4×4 帧内亮度预测模式编号。
6 体会H264之博大精深
帧内亮度预测模式有9种,其编号为0,1,......,8,其范围上界(8)用2进制数表示需要4位,通过标注4可将rem_intra4x4_pred_mode的值的范围的上界限定为7,从而3位即可表达。少了一位,H264就是通过这样的巧妙设计达到提升编码效率的目的的。