八、H.264中的Slice数据和宏块结构

2024-02-19  本文已影响0人  一亩三分甜

H264H265视频编解码算法文章汇总

  1. Slice Data结构

slice header占整个slice的结构比较小,更多的是slice body

image.png

2.Slice Data结构定义

image.png image.png

从以上表格得出Slice Data游离出来的语法元素非常少,除了cabac_alignment_one_bit、mb_skip_run、mb_skip_flag、mb_field_decoding_flag、end_of_slice_flag,除此之外Slice Data中的绝大部分数据都保存在宏块结构层macroblock_layer( )中,上面除了按字节对齐的cabac_alignment_one_bit比特位之外,其他的宏块mb_skip_run、mb_skip_flag跳过,场编码标志位mb_field_decoding_flag等都是为宏块结构层macroblock_layer()来服务的。Slice Data结构的主要数据由macroblock宏块来组成的。

以上是Slice Data中除了宏块结构macroblock_layer()之外的主要内容

  1. H.264的宏块Macroblock
image.png

上图横排16个亮度像素块,竖排9个亮度像素块

宏块的构成(YUV420,luma是亮度,chroma是色度)

image.png

4.宏块的类别

  1. 宏块结构的语法元素定义
image.png image.png

mb_type,表示宏块类型,

当mb_type为I_PCM类型时,以差分的方式传递宏块内部的像素值,传递的是256个亮度pcm_sample_luma[ i ]的采样值,以及根据采样率和分辨率传递的色度pcm_sample_chroma[ i ]的采样值

image.png

当mb_type不是I_NxN类型时,分隔模式不是Intra16x16,也就是说不是帧内编码,分割的个数为4的时候,采用的是下面的sub_mb_pred(mb_type)

当为其他情况,对于帧内编码I帧的Slice来说

mb_pred(mb_type)保存宏块的预测信息和预测模式等等

image.png

此外宏块结构中还有一个很重要的residual(0,15)残差数据,这一个章节中暂时不会解析残差数据,原因在后面会讲到

在宏块结构中,也只有少部分的游离语法元素

mb_type表示宏块类型,在不同的Slice中代表不同的含义,如果当前帧为I Slice,取值范围为0-25这26个值

image.png image.png

mb_type为0时,表示I_NxN模式,其他表示16x16模式,判断mb_type是不是I_PCM时,只需要判断值是否等于25,等于25,表示I_PCM模式主要有三个语法元素

pcm_alignment_zero_bit:按照字节对齐的填充位,根据当前字节对齐情况,没有或不存在或填充若干个0

pcm_sample_luma[ i ]和pcm_sample_chroma[ i ]以差分的方式来传递像素的值

以上主要在帧间编码模式下使用,研究帧间编码时仔细考虑这部分内容

transform_size_8x8_flag:标志位,表示当前宏块是采用8x8大小的变化,还是不采用8x8而采用4x4大小的变换,采用哪种大小的快变换,由此标志位决定,此标志位在下面还会出现一次

image.png

coded_block_pattern:表示当前宏块的编码方式,元素俗称叫做cbp,非常重要的一个语法元素,当前宏块的亮度和色度分量的各个最小块的残差编码方案都由此元素决定,根据这个原色值得不同,有一下几种情况

I.对所有残差都编码

II.只对残差的直流(DC)系数进行编码

III.对残差的直流(DC)和交流(AC)都不进行编码

cbp可以分离出亮度cbp CodedBlockPatternLuma和色度cbp CodedBlockPatternChroma

CodedBlockPatternLuma = coded_block_pattern % 16

CodedBlockPatternChroma = coded_block_pattern / 16

cbp只在模式不是16x16的时候才会存在

因为如果是16x16模式,cbp实际上已经包含在mb_type里面了,根据mb_type的不同,内部隐含了cbp的值

image.png

mb_qp_delta:表示当前宏块的量化参数的偏移量,取值范围为-26~25。qp量化参数值得获取,前面pps中,可以获取到整个序列每帧图像的初始量化参数pic_init_qp,pic_init_qp_minus26 + 26可以获取到pic_init_qp表示整个序列每帧图像的初始量化参数

image.png

此外在每一帧的Slice Header中,可以找到每帧的slice_qp_delta,只对当前的Slice生效,相当于pps中的pic_init_qp,用pic_init_qp+slice_qp_delta+mb_qp_delta=最终编码宏块实际的量化参数,通过这三个值得到是整个Slice第一个MB的偏移量,后面的偏移量可以和前面这个偏移量的值取和%52 = 后面的qp量化参数

image.png

mb_pred(mb_type):目前处理的是I Slice只需要考虑下面部分内容,主要用于帧内预测结构的主要数据类型

除了intra_chroma_pred_mode帧内预测色度模式外,由两对语法元素值构成,分别带有4x4,8x8的标志,根据不同的transform size选择两种不同的值,同一时刻只能出现一种,不可能同时存在

image.png

下面部分指的是参考帧的缓存和运动矢量残差,在研究帧间预测的时候再讨论

image.png

residual( 0, 15 ):表示帧内预测的预测残差数据经过变换量化系统来保存在残差的结构中,残差结构如下

image.png

残差数据结构里面根据熵编码算法分别采用了block_cavlc和block_cabac分别用于可变长编码和算术编码,以及亮度的残差化residual_luma( i16x16DClevel, i16x16AClevel, level, level8x8,

startIdx, endIdx )和色度残差化residual_block( ChromaDCLevel[ iCbCr ], 0, 4 * NumC8x8 − 1,

4 * NumC8x8 )

if( !entropy_coding_mode_flag )

residual_block = residual_block_cavlc

else

residual_block = residual_block_cabac

residual_luma:亮度残差部分,根据熵编码的不同采用了cavlc或cabac

if( !entropy_coding_mode_flag )

residual_block = residual_block_cavlc

else

residual_block = residual_block_cabac

image.png

CAVLC熵编码结构

coeff_token

trailing_ones_sign_flag

level_prefix

level_suffix

total_zeros

描述编码算法采用的是ce(v),采用的是上下文自适应编码的语法元素

image.png image.png
上一篇 下一篇

猜你喜欢

热点阅读