宏块层(macroblock layer)包含解码单个宏块所需的所有语法元素,见下图:
- mb_type:表示宏块编码类型,I, SI, P或B,以及关于宏块预测和编码的进一步信息(例如尺寸)。I宏块可以出现在任何片类型中,并且在编码时不引用任何其他片。SI宏块仅在SI片中出现。P宏块可以出现在P或SP片中,并利用一个预测参考进行帧间编码。B宏块出现在B片中,并利用一个或两个预测参考进行帧间编码。注:对于P或B片中的skip宏块,并不传输mbtype,当在片数据层中提示skip宏块时,这些宏块的mb_type就会被推断出来。
- transform_size_8x8_flag:仅在High Profile的码流中出现,表示亮度块会进行8x8的整数变换,而不是264默认的4x4的整数变换。不会在16x16的I宏块中出现。
- mb_pred:对于除划分尺寸为8x8大小且类型为P/B之外的所有宏块,指明用于宏块的intra或inter类型。
- sub_mb_pred:对于划分尺寸为8x8大小的P/B宏块,指明用于宏块的intra或inter类型。
- coded_block_pattern:除了Intra_16x16_type外,一个宏块的单独语法元素,取值范围是0~47。下面是例子:右边二进制加粗的前两位数字表示色度的情况,没有加粗的后四位表示亮度的情况。
- delta_qp:表示量化参数(QP)的变化,或正或负。如果QP与前一个值没有变化,则delta_qp=0。
- residual_data:如果宏块中有非0系数,那么说明前面CBP就非0,这时候就需要传输residual_data。
宏块预测
宏块预测语法元素表示如何对当前宏块进行intra或inter预测。前面提到过sub_mb_pred是用于划分尺寸为8x8的P/B宏块,mb_pred是用于其他情况。宏块预测的语法元素如下图所示:
注意,sub-macroblock中的所有sub-macroblock划分共享相同的参考图片,但拥有各自的mv。
宏块中的残差数据
如果宏块中要传输残差数据,那么传输时的残差数据语法如下图所示:
传输残差数据时,数据的发送顺序是这样的:
首先,如果宏块使用intra_16x16模式,那么这个宏块的每个4x4子块的亮度的DC系数会先拼成一个4x4的矩阵进行传输。然后,宏块的亮度分量的系数再以8x8的尺寸进行传输(如果有一个8x8的块没有残差系数,那么直接跳过这个块,这些系数都是经过变换得到的)。
在亮度全都传输完毕之后,就该传输色度的系数。首先传统色度的DC系数,再传输AC系数(如果残差系数存在的话)。这些残差数据会使用CAVLC或者是CABAC进行熵编码。
残差系数的传输示意图如下所示: