H264-变换和量化
在早期的标准中,不同的处理步骤之间有明显的边界,对原始数据(或者残差)进行域变换,然后进行量化降低系数的精度,但是在H264中边界却不明显。为了消除浮点数DCT变换造成的误差累计,使用整数DCT变换,并且将放大系数移到量化阶段进行。
在DCT变换当中,存在有无理数系数。在不同精度的机器上的编码图像和解码图像之间,或者在同一个编码器的重建图像之间,会出现误差漂移和累计。h264通过下面的两个方法解决这个问题:
- 使用核变换,是整数DCT变换,只需要使用整数和定点数运算
- 使用最少的乘法优化量化操作
基本流程
h264标准中定义了反量化,反系数放大和反变换的过程,相应的正变换没有标准化,但是可以从标准中定义的操作中推导出来。
基本变换是整数变换,整数变换是一种经过系数放大和整数近似的DCT变换,对44或者88的残差数据进行变换。直流系数变换使用哈达玛变换。最后经过系数放大和量化。解码端是这个过程的逆向过程。
亮度分量变换过程
默认处理过程
在除了下面两种情况下都使用默认处理过程。
- 16 × 16 Intra Prediction
- High profiles 8 × 8 整数变换
对1616 残差宏块内每一个44 子宏块做core transform Cf4,然后对每一个4*4宏块做Scaling和quantization Mf4,获得量化系数块,量化系数块在生成bitstream时使用标号的顺序。
逆过程如上图所示。
Intra 16 × 16 mode
如果宏块使用的是1616帧内预测模式,那么就是用上面的变换过程。使用另外的变换对44block中的直流系数进行变换。1616的残差数据经过划分成44block经过整数变换获得变换系数。从16个block中提取出DC系数组成新的44数据block,直流系数高度相关对这一部分进行重新编码能获得更好的效果,这里使用44哈达玛变换。变换后的DC系数和AC系数一起经过
经过放大和量化,在bitstream中传输顺序如标号所示。
逆过程如下图:
色度分量变换过程
4:2:0 色度分量变换过程
色度分量4:2:0格式下,一个宏块16 * 16的亮度sample对应有一个8* 8个Cb数据的宏块和8 * 8 Cr数据的宏块。
Cb Cr两个8 * 8大小的宏块,每一个划分为4个44大小的宏块,经过Cf4 整数变换,获得变换系数block,从两个88 大小的系数block中