编码:
蓝色的前向编码流程:
以宏块为输入单位介绍优于以帧为单位介绍。
Fn为即将进行编码的宏块,由原始图像中16*16像素构成。每个宏块要么采用帧内模式编码,要么采用帧间模式编码。不管是哪种编码模式,预测宏块P都是基于重建帧生成的。在帧内模式中,预测宏块P是由当前帧经过编码、解码和重建生成的(注意,采用未经过滤波的样本uF`n来生成P)。在帧间模式中,预测宏块是通过一个或者多个参考帧经过运动补偿预测生成的。在图中,参考帧就是之前编码得到的帧F`n-1;不过,并不只是一个参考帧,每个预测宏块P都是由一个或者两个,之前或者之后的,已经经过编码和重建所生成的帧中的对应宏块所生成的。
当前宏块减去预测宏块P生成残差宏块Dn。残差宏块Dn经过变换、量化后生成X,由一系列变换量化系数组成。然后,对这些系数进行重排序和熵编码。熵编码生成的系数,附上解码宏块所需要的附加信息生成压缩比特流,(附加信息有宏块预测模式,量化步长,描述如何对宏块进行运动补偿的运动矢量信息,等等)。压缩比特流被传到网络抽象层(NAL)以发射或者储存。
粉红色的重建流程:
为了生成重建帧以编码以后的宏块,将量化后的宏块残差系数X进行解码。系数X经过反量化,反变换生成残差宏块Dn`。此时的残差宏块与原先的残差宏块Dn并不相同,原因是在量化过程中引入了失真。所以,Dn`是变形了的Dn。
预测宏块P与Dn`相加生成重建宏块uF`n(原宏块的变形了的宏块)。为了减小块效应失真,引入了专门的滤波器。滤波之后的宏块就是重建宏块F`n,一系列的重建宏块组成了参考帧。(实际上,这里的参考帧,与解码端生成的最终图像完全一致)
解码:
从NAL中,解码器取得压缩比特流。数据元素经过熵解码和重排序生成一系列量化后的系数X。经过反量化和反变换生成Dn`(与编码端的Dn`一致)。使用从比特流中解码出来的头信息,解码器生成预测宏块P,与先前在编码器中生成的预测宏块P一致。P与Dn`相加生成uF`n,然后经过滤波,生成解码宏块F`n。
从两幅图表和上面的讨论可以发现:编码器的重建流程的目的是为了确保编码端和解码端使用一致的参考帧来生成预测宏块P。如果参考帧不一致,那么编码端和解码端的预测宏块P就不一致,导致在编码端和解码端之间生成渐增的误差或者“漂移”。