H264/AVC-slice data解析

slice header解析
slice data主要存放了该slice所有宏块信息以及残差数据。

slice data语法结构

在这里插入图片描述
slice data解析流程如下:

  1. 获取当前宏块位置CurMbAddr;
  2. 如果当前slice不是I slice,则存在skip 宏块。因此需要根据熵编码类型解析skip宏块标记。
    1)对于cavlc,mb_skip_run表示当前宏块与上一宏块位置的差值,如果差值大于1,则梁洪快间存在skip宏块;
    2)对于cabac,每一个宏块都存在一个mb_skip_flag表示该宏块是否为skip宏块;
  3. 解析宏块层信息
  4. 判断是否还有更多数据,如果有更多数据,则继续解码下一个宏块信息,否则该slice解码结束。
    在这里插入图片描述

宏块层语法结构

在这里插入图片描述
宏块层的解析步骤如下:

1.解析mb_type

mb_type表示宏块类型,具体可参考文章宏块类型

2. 解析I_PCM数据

如果当前宏块为I_PCM宏块,则解码的pcm_sample数据为重建后的宏块数据,不需要再进行后续的变换、预测、和重建,但需要执行的blocking。解析完当前宏块的pcm_sample数据后,该宏块语法解析结束。

3. 解析预测模式

3.1 解析可以分成4个8x8块的非I宏块(P_8x8/p_8x8ref0/B_8x8)预测模式

通过sub_mb_pred语法解析每个8x8 子块信息,包括每个8x8块类型sub_mb_type、每个8x8块参考帧索引 ref_idx_l0和ref_idx_l1 以及8x8块内每一个划分块的mvd;
假设一个8x8块划分为4个4x4块,则编码的信息包括一个sub_mb_type, 1组参考帧索引(ref_idx_l0/ref_idx_l1)和8组mvd(4个分块亮度、色度分量分别编码)。亮度分量和色度分量共用参考帧索引,但mvd不一样。
在这里插入图片描述

3.2 解析I宏块预测模式

  • Intra_16x16的预测模式由mb_type决定,不需要额外编码
  • Intra_4x4/Intra_8x8为节省码流,需要通过相邻块计算当前块预测模式,只编码了prev_pred_mode_flag和rem_pred_mode这两个变量。
    计算过程可以简单描述为:
    1)从相邻块mbAddrA和mbAddrB的预测模式中选取较小的一个作为预先定义模式。
    2)如果prev_pred_mode_flag为1,则预先定义模式就是当前块的预测模式;
    3)如果标志位prev_pred_mode_flag为0,则根据码流中解析出的语法元素 rem_pred_mode判断。如果rem_intra4x4_pred_mode的值小于预定义模式的值则选用rem_pred_mode;如果大于等于预定义模式,则当前块的预测模式设为rem_pred_mode + 1。
    在这里插入图片描述

3.3 解析其他P/B宏块预测方式

根据当前16x16宏块的划分块个数,解析每个子块的参考帧索引和mvd。亮度分量和色度分量共用参考帧索引,但mvd不一样。
在这里插入图片描述

4. 解析残差数据

根据cbp信息解析残差数据,子块对应的cbp大于0,该子块才存在残差数据,否则数据全为0.
在这里插入图片描述
在baseline profile下,只支持4x4大小DCT变换,所以宏块按照4x4大小划分残差块。对于平坦区域,以8x8大小做DCT变换压缩率会更高,因此从main profile开始引入了变量transform_size_8x8_flag用于表示该宏块使用8x8大小DCT变换。
残差系数包括DC系数和AC系数.

4.1 解析Intra_16x16亮度块

Intra_16x16宏块亮度块编码时,先划分为16个4x4块,分别对4x4块做DCT变换量化后,把16个DC系数提取出来组成一个4x4大小的DC块,再对DC块做hadarmad变换。
在这里插入图片描述

解码流程如下:

  1. 解析16个DC系数,反扫描,反hadamard变换,反量化
    其中16个DC系数的扫描顺序与4x4块扫描顺序一致,如下图所示,因此解码过程需要反扫描后再反hadard变换
    在这里插入图片描述

  2. 解析每个4x4块中15个AC系数,与DC系数组成4x4块参数,反量化,反变换得到残差数据块

4.2 解析transform_size_8x8_flag=1的亮度块

transform_size_8x8_flag=1,说明该块使用的DCT变换为8x8大小,所以16x16亮度块划分为4个8x8块。
其解码流程根据熵编码分为两种情况如下:

  1. CABAC
    1)解析每个8x8块的1个DC系数和63个AC系数;
    2) 对8x8系数块反量化反变换得到残差系数块
  2. CAVLC
    由于CAVLC熵编码一次只能支持16个参数编码,所以对于8x8残差数据块也必须分成4个4x4分别进行熵编码。8x8块划分方式为交错存放,比如8x8块第一个参数作为第一个4x4块的第一个参数,8x8块第二个参数作为第二个4x4块的第一个参数,8x8块第三个参数作为第三个4x4块的第一个参数…
    在这里插入图片描述
    1)解析每个4x4块的系数,把4个4x4块系数组成一个8x8块
    2)对8x8系数块反量化反变换得到残差系数块

4.3 解析色度分量块

色度块编码时,先将2个8x8色度块分别划分为4个4x4块,分别对4x4块做DCT变换量化后,把4个DC系数提取出来组成一个2x2大小的DC块,再对DC块做hadarmad变换。
在这里插入图片描述
解码流程如下:

  1. 解析4个DC系数,反hadamard变换
  2. 解析每个4x4块中15个AC系数,与DC系数组成4x4块参数,反量化,反变换得到残差数据块

4.4 其他情况

其他情况则是把16x16亮度块先划分为16个4x4块,分别对4x4块做DCT变换量化。
其解码流程如下:
1)解析每个4x4块的1个DC系数和15个AC系数;
2) 对4x4系数块反量化反变换得到残差系数块

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值