当前位置: 代码迷 >> 综合 >> H264/AVC 宏块层
  详细解决方案

H264/AVC 宏块层

热度:96   发布时间:2023-12-21 07:14:48.0

宏块层(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进行熵编码。

残差系数的传输示意图如下所示: