H.264/AVC 三种配置和帧内预测

上篇讲了H.264中的宏块、片和帧,以及它们之间的关系。这篇我们介绍一下H.264所使用的帧内预测,就像上篇中介绍的,帧内预测是H.264的一大特点,并且它和帧内编码的区别,我们上文中也已经讲到。与前面几篇所述的内容一样,了解H.264的帧内预测,同样也是为了理解H.264的句法和语义打基础,也对理解各H.264的编解码器大有帮助。

1、H.264/AVC的三种配置

在开始讲帧内预测之前,我们先补充一点上篇没讲到的内容,那就是H.264的三种配置。上篇中,我们曾给出像片和宏块的关系表,如下图:

H.264/AVC 三种配置和帧内预测_第1张图片
像片与宏块的关系

我们注意到,第三列Profiles,为各像片隶属的配置,为什么会有这一区别呢?那是因为,H.264定义了三种不同的配置,编解码器实现每一种配置,都可以完成H.264的编解码。三种配置如下:

H.264/AVC 三种配置和帧内预测_第2张图片
H.264/AVC的三种配置

可以看到,三种配置分别为:基本配置、主流配置、扩展配置。上图展示了三种配置之间的关系,和各自支持的编码方法。其中基本配置是扩展配置的子集,而I像片、P像片和CAVLC,是各种配置都会用到的编码方法。

进行这三种划分,主要是考虑到H.264的各种应用场合的不同。它们各自的应用场合如:

(1)基本配置: 这种配置看名称也可以猜到,它具有基本的编解码性能和抗错能力,主要应用在低延时的电视会议,和可视电话中。这里的抗错能力是指,解码器在传输过程中,对出现的错误数据位流的一种应对能力。这种能力通常为:错误检测、重新传输、错误校正和其他错误处理措施。

(2)主流配置: 可以看到它在I像片帧内预测和P像片帧间预测的基础上,加了B像片的帧间编码功能,而且还增加使用了加权预测的帧间编码。同时使用CABAC也是它的特点,应用场合为质量要求比较高的电视广播和HD DVD等方面。

(3)扩展配置: 看这种配置主要看它不支持什么,它不支持隔行扫描和CABAC。而相对于另外两种配置,它引入了可以进行码流切换的SP和SI像片,以及数据分割。所以它的主要应用为,用户网络状态各异的网络播放等方面。

要提一句的是,虽然上面我们说H.264的配置分为三种,不过在较新的H.264版本中,第四种配置已经产生,它被称为高级配置。这种配置在近几年才出,而且还在不断修订,在实际的各编解码器中也没用到,所以我们并不介绍。

2、H.264/AVC的帧内预测

(1)帧内预测概况

在H.264的编解码中,帧内预测是个很重要的组成部分,就像我们在上篇中讲到的,H.264的16x16的宏块,可以从两个方向进行划分,并最小可以划分成4x4的子块。所以帧内预测和帧间预测中,4x4是编解码处理的最小块单位,这不仅减小了帧内预测的预测误差,也提高了帧间预测移动矢量的计算精度。

不过有一点需要明确的是,帧内预测,并不是在帧内进行,而是在同一个像片中进行,它是在同一个像片中,从过去编码(编码端从像素数据到H.264裸流)后重构(解码端从H.264裸流到像素数据,并使用数据恢复图像序列)的相邻块,对当前块(即待编码的块)进行预测的过程。

所以帧内预测,我们可以理解为“片内预测”,但是依然说成是帧内预测。而使用帧内预测的块编码、宏块编码、像片编码、帧编码都称为帧内编码。

帧内预测的数据处理,和之前标准中的P帧和B帧的处理一样,都是使用预测得到的预测值,与像素实际的样本值相减,从而得到像素残差(也叫预测误差),然后对残差数据进行变换和编码。

(2)帧内预测的预测模式

上面我们说,子块最小可为4x4,但并不是说,帧内预测全部是使用4x4的子块进行预测。在H.264规定中,预测块的大小可以为4x4、8x8、16x16。并且预测块大小的使用,基于样本的不同也不同。比如对于亮度样本,预测块大小可以为4x4、8x8、16x16。而色度块,则使用8x8和4x4的色度块。

既然块大小确定了,那该怎么进行预测呢?这就涉及到它们的预测模式,而预测模式也根据块大小和样本的不同进行划分。

比如对于亮度样本,8x8和4x4的亮度块,使用的是相同的9种预测模式,而16x16的亮度块使用4种预测模式。对于色度块,8x8和4x4的两种(Cb、Cr)色度块,使用相同的4种预测模式。

在这些预测模式中,只要理解了亮度样本的4x4和8x8的9种预测模式,那么其他的也就好理解了。而这9种预测模式也很好理解,下面我们根据4x4的亮度块进行详细介绍。

1)4x4亮度预测模式

要理解4x4的预测模式,得首先知道它们的位置,如下图所示:

H.264/AVC 三种配置和帧内预测_第3张图片
4x4亮度块预测标记

在图中,小写字母a-p为待编码的4x4亮度块,它上边和左边的大写字母A-M,为已编码和重构的样本。在预测的时候,4x4的亮度块的样本值,就是根据这A-M的样本值来预测的。当然啦,在预测的时候,A-M并不一定都可用,这个时候可以使用当前片的其他样本进行预测。而如果E-H样本不存在,则可以使用D代替。

确定了参考像素和4x4的亮度块之后,就可以进行预测啦,规定的9种预测模式如下:

H.264/AVC 三种配置和帧内预测_第4张图片
4x4亮度块帧内预测模式

以模式0为例,图中箭头向下,这表示每个箭头方向上的样本预测值,分别使用箭头初始端也即A、B、C、D的值。这个时候,4x4亮度块的第一列,a、e、i、m的样本预测值等于A的样本值。同理,第二列b、f、j、n使用B的样本值。

模拟1与模式0类似,只不过方向换成了水平方向。而模式2使用的是平均值模式(也称DC模式),即a-p的样本预测值都使用(A+B+C+D+I+J+K+L)/8

剩余的模式3-8,注意到它们的预测方向与垂直或水平方向都有偏角,它们的预测值,为A-M的加权平均值。

对于模式3和模式4,偏角为45度,位于同一个箭头上的预测样本值相同。在模式4里,对于a样本预测值,它的加权平均值为round(I/4+M/2+A/4),而d的样本预测值,可用round(B/4+C/2+D/4)计算。round代表四舍五入

同样的,对于模式5-8,也可用加权平均值计算,但是因为箭头偏角既不是45度,也不是水平或垂直,所以位于同一个箭头上的预测样本值,并不相同。

既然4x4亮度块,有这9种预测模式,那在实际编码中,该使用哪种预测模式呢?

答案是,当然得根据预测效果来看啦。那预测效果怎么度量呢?那就得看,使用哪种预测模式,得到的预测值,与原始的样本值的差值最小。

在实际的应用中,通常通过计算预测块中,各个样本预测值与原始样本值的差,然后再计算绝对误差的和SAD(sum of absolute different)或SAE(sum of absolute errors)来表示,或计算均方误差MSE(mean square error)。然后通过比较各种预测模式的SAD或SAE或MSE,值最小的就代表预测精度最高。

比如下图:

H.264/AVC 三种配置和帧内预测_第5张图片
4x4亮度预测结果

这是9种预测模式下的预测结果,可以看到这时预测模式7的SAE值最小,理论上最接近原始样本值,事实上也确实如此。下图就是原始的样本:

H.264/AVC 三种配置和帧内预测_第6张图片
原始样本值(右下角)

需要注意的是,虽然在这个4x4亮度预测块中,预测模式7更适合它,但是在换个预测块,答案就不一定了。意思是哪种预测模式比较合适,是跟预测块周围的样本值有关的。

2)16x16亮度预测模式

16x16亮度预测模式对应的4中预测模式如下:

H.264/AVC 三种配置和帧内预测_第7张图片
16x16亮度预测模式

如图所示,模式0和模式1,与4x4亮度预测模式的模式0和模式1相同。模式2(DC预测)中,每个样本的预测值,为相应的顶部和左边样本值和的平均值。模式3使用的是平面预测,这是一种使用顶部和左边样本值,进行空间插值法来得到的样本预测值。

3)8x8色度预测模式

对于色度,8x8和4x4的色度块,都指定了相同的4种预测模式,分别为模式0(DC预测),模式1(水平),模式2(垂直),模式3(平面),这几个预测模式和16x16亮度预测模式的含义相同,只是顺序变了而已。

这就是H.264的帧内预测,值得一提的是,全篇下来,我们并没有介绍更细节的东西,只是大致说了预测值以哪些样本值进行参考而已。实际上,在块中各个样本预测值,都是以所属宏块为参照来计算的,比如在宏块中的位置也即坐标,通过坐标可以严格确定,某个样本预测值的计算方式。

这在H.264的官方文档中,有详细规定。所以这篇鉴定来说,属于帧内预测的入门,后面介绍句法和语义时,我们还会针对样本预测值的计算,单独写一篇,希望读者了解。

参考资料:
https://www.vcodex.com/h264avc-intra-precition/

你可能感兴趣的:(视频编解码,H264,基本配置,主流配置,扩展配置,帧内预测)