1. 引言
在H264的帧内预测选择了最佳预测模式后,需要对选择的每个4x4帧内预测模式进行编码成信号,以便后面传输给解码器。但是一个图像帧的4x4块很多,这样会需要大量比特来表示。考虑到相邻的4x4块本身是强相关的,因此它们的帧内预测模式也是强相关的。利用这个特性,我们可以对图像帧的预测模式进行压缩编码输出,从而在保证相同质量的情况下,达到降低视频码率的目的。
下面分别从编码器和解码器的角度对H264的帧内预测模式的编解码过程进行详细说明。
2. 编码原理解析
对于下图的4x4的编码块,其中A和B是帧内参考块,而E是预测块,假设A和B的预测模式都是1,那么我们可以这么认为,E的预测模式大概率上也是1。
利用这个特性,H264标准做了如下规定,E块的最有可能帧内预测编码模式是min(A,B),也就是取A和B两个块的已知预测模式的最小值。当然有可能E是左上角的块,那么它的邻居A和B块是不存在的,那么H264标准规定了虚拟的A和B块的预测模式是2,也就是说E的最有可能预测模式编码是2(注:预测模式2是DC直流预测模式)。
得到了最有可能预测模式,然后和E块实际选择的最佳预测模式进行对比,如果两者正好相等,那么编码器就输出一个叫做prev_intra4×4_pred_mode的标记值占1个bit,并且该bit为1,因此这种情况下E的预测模式只要1个bit就可以表示了。
那么,如果最有可能预测模式和E块的实际选择的最佳预测模式不相等呢?编码器就输出prev_intra4×4_pred_mode的标记值为0,表示后面还需要有补充信息来提示实际采用的是哪个预测模式。
因为4x4块的帧内预测模式有9种,除掉刚刚已经有一个和最有可能预测模式相同的情况在这里已经可以排除掉了,剩下还有8种预测模式需要编码,那么至少需要3个bit。下面来介绍如何对这剩余的8种预测模式进行编码。举个例子:
假设E的最有可能预测模式为2,那么对于实际的预测模式做如下映射,如果实际预测模式<2,那么就输出实际预测模式;如果实际预测模式>2,那么就输出实际预测模式-1;如果实际预测模式=2呢?当然,在这里已经不可能出现这种情况了。这样子,就可以把[0,9) 的预测模式编码在后续的3个bit里面了。以刚刚这个例子为例,整理了各种实际预测值对应的最终输出编码:
最有可能预测模式 | 实际预测模式 | 最终编码输出值 | 最终编码输出对应的二进制编码 |
---|---|---|---|
2 | 0 | 0 | 000 |
2 | 1 | 1 | 001 |
2 | 3 | 2 | 002 |
2 | 4 | 3 | 003 |
2 | 5 | 4 | 004 |
2 | 6 | 5 | 005 |
2 | 7 | 6 | 006 |
2 | 8 | 7 | 007 |
在标准中,表格里对应的最终编码输出值
把它记作了rem_intra4×4_pred_mode。
可以看到,对于每个预测模式,最终最大还是需要4个bit来进行编码。但是我们要知道的是,因为相邻块的相关性,所以往往只要输出一个prev_intra4×4_pred_mode=1的bit就可以表示预测模式了,这样就大大压缩的编码所需的bit数量。
3. 解码原理解析
根据以上的编码原理,可以想到如下解码过程。首先,读如一个bit,这个bit就是prev_intra4×4_pred_mode,如果为1,那么就采用最大可能预测模式作为实际预测模式,而最大可能预测模式是可以通过已经解码的左边和上面的两个4x4块可以推导出来的。
prev_intra4×4_pred_mode,如果为0,同样需要先推导出最大可能预测模式,接着就是读取连续三个bit,如果这三个bit对应的整数值<最大可能预测模式,那么就输出这三个bit的整数值作为实际预测模式,否则就输出三个bit的整数值+1作为实际预测模式。
以上就是H264帧内编码模式的压缩编码和解码过程。