一、宏块的定义
宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。
一个宏块 = 一个16*16的亮度像素 + 一个8×8Cb + 一个8×8Cr彩色像素块组成。(YCbCr 是属于 YUV 家族的一员,在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量)
二、在序列中的位置
三、宏块包含的信息
四、elecard示例宏块信息
在elecard,选中一个宏块,可以获取到左图所示的位置、相对首宏块的偏移位置、大小、宏块类型等信息。
五、H264协议宏块格式定义
按照macroblock_layer的语法结构上看,宏块能粗略分成三种结构:PCM、sub_mb_pred(子宏块预测)、mb_pred(宏块预测)。另外,虽然skip宏块并不在macroblock内描述,它也是宏块的一种结构。
1、mb_type
在一个宏块中,最开始的语法元素为宏块的类型:mb_type。从表中我们可以看出,根据mb_type的值是否等于I_PCM,整个解析方法分为两大类:PCM类型和非PCM类型。
当这个宏块为I_PCM模式时,宏块中以差分编码的形式保存宏块原始的像素值。此时存在如下几个语法元素:
pcm_alignment_zero_bit:填充位,用比特0来填充直到按字节对齐;
pcm_sample_luma:256个亮度分量的差分像素值;
pcm_sample_chroma:若干个色度分量的差分像素值,实际数量由码流的颜色格式指定。例如对于最常用的4:2:0格式的视频,共有128个色度像素值。
2、mb_pred
宏块预测的语法结构,宏块预测与子宏块预测的语法结构是相斥的,一个宏块的组成结构要么采用的是宏块预测的结构,要么4个子宏块都是子宏块的预测结构。
3、sub_mb_pred
子宏块预测的语法结构,子宏块为8x8大小的宏块,也就是说一个宏块有4个子宏块,在这个语法结构的内部会进行4次子宏块预测。
4、coded_block_pattern
语法元素常简称做cbp,用于表示当前宏块内的4个8×8子块编码对其中的哪个的残差系数进行编码。值得注意的是该语法元素仅仅在宏块为非I_16x16模式时才存在,因为在I_16x16模式时cbp的有关信息已经在mb_type中体现。
5、mb_qp_delta
表示宏块层的量化参数偏移值,取值范围为[-26, 25]。我们在前面已经在PPS中获取了整个序列的量化参数初始值(由pic_init_qp_minus26计算),在slice header中获取slice层的量化参数偏移slice_qp_delta,因此每一个slice第一个宏块的量化参数可通过下面的公式计算:
QP=pic_init_qp_minus26 + 26 + slice_qp_delta + mb_qp_delta
6、residual
像素残差编码的语法结构。