H264-数据分层结构

h264-数据分层结构

overview

在这里插入图片描述

【H264/AVC 句法和语义详解】(二):h264码流格式与NALU详解一

Bitstream

编码标记
在这里插入图片描述

在这里插入图片描述
JM相关代码

NALU层

在这里插入图片描述
上边的操作是将EBSP转化为RBSP就是删除其中的0x03.

【H264/AVC 句法和语义详解】(三):NALU详解二(EBSP、RBSP与SODB)
参考JM代码
nal_ref_idc 不等于0说明 NAL unit包含了一个SPS, 或者SPS扩展,SPS子集,PPS, 参考图像的slice,参考图像的slice分区数据,或者一个参考图像的前缀数据。
等于0时,表示NAL单元包含一个slice或者slice 数据分区,这个slice或者slice数据分区是非参考帧的一部分。
对于SPS, SPS 扩展,SPS 子集,PPS, nal_ref_idc 不能等于0。
当在一个NAL 中nal_ref_idc 等于0 ,nal_unit_type取1~4时,对于这样的图像,所有的NAL nal_unit_type 为1 ~4时,nal_ref_idc 都要等于0。
nal_unit_type 为5时,nal_ref_idc 不能为0
nal_unit_type 为 6,9,10,11,12 时,nal_ref_idc 必须为0

nal_unit_type
rbsp 类型表如下(分为包含slice的NALU,和非slice的NALU)
在这里插入图片描述
JM nalu分类处理

图像数据的NALU

包含IDR Slice的NALU
在这里插入图片描述

非IDR slice的NALU
在这里插入图片描述

slice layer

一个Slice包含一帧图像的部分或全部数据,换言之,一帧视频图像可以编码为一个或若干个Slice。一个Slice最少包含一个宏块,最多包含整帧图像的数据。在不同的编码实现中,同一帧图像中所构成的Slice数目不一定相同。

在H.264中设计Slice的目的主要在于防止误码的扩散。因为不同的slice之间,其解码操作是独立的。某一个slice的解码过程所参考的数据(例如预测编码)不能越过slice的边界。

Slice data partition RBSP semantics

Slice layer without partitioning RBSP semantics

	slice layer RBSP 不开启分区时,slice = slice header + slice data

nal_unit_type == 5 ,nal_unit_type == 1 使用非IDR图像的编码条带 slice_layer_without_partitioning_rbsp( )处理接下来的语法元素。

slice 类型

在这里插入图片描述
在I slice中只包含I宏块,不能包含P或B宏块;在P和B slice中,除了相应的P和B类型宏块之外,还可以包含I类型宏块。

Slice 组成

在这里插入图片描述

slice_header()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

I帧的Slice Slice_header

在这里插入图片描述
first_mb_in_slice :表示第一个宏块的地址
slice_type:表示slice的编码类型
pic_parameter_set_id: 指定使用的图像参数集
field_pic_flag:等于1 表示该条带是一个编码场的条带。field_pic_flag 等于0 表示该条带是一个编码帧的条带
bottom_field_flag 等于1表示该条带是一个编码底场的一部分。bottom_field_flag 等于0表示该slice是一个编码的顶场
idr_pic_id 标识一个IDR图像。连续的两个idr_pic_id是不同的。idr_pic_id的取值范围是0到65535.
cabac_init_idc 用于基于上下文的算数编码的初始化
slice_qp_delta 说明了 Q P Y QP_{Y} QPY的初始值, Q P Y QP_{Y} QPY用于slice中的所有宏块。初始slice QP的计算公式如下:
Q P Y = 26 + p p s . p i c _ i n i t _ m i n u s 26 + s l i c e _ q p _ d e l t a QP_{Y}= 26 + pps.pic\_init\_minus26 + slice\_qp\_delta QPY=26+pps.pic_init_minus26+slice_qp_delta
disable_deblocking_filter_idc
说明去方块滤波是否是disabled在穿过某些block边缘的时候。当这个这个元素不存在是,它默认是0.

slice_data()

在这里插入图片描述

macroblock_layer( )

在这里插入图片描述

mb_pred( mb_type )

在这里插入图片描述

sub_mb_pred( mb_type )

在这里插入图片描述

residual( startIdx, endIdx )

在这里插入图片描述

residual_block_cavlc( coeffLevel, startIdx, endIdx, maxNumCoeff )

在这里插入图片描述
在这里插入图片描述

sps

在这里插入图片描述
在这里插入图片描述
chroma_format_idc
chroma_format_idc
bit_depth_luma_minus8
bit_depth_chroma_minus8
qpprime_y_zero_transform_bypass_flag
seq_scaling_matrix_present_flag
放大系数矩阵是否在sps中提供,当seq_scaling_matrix_present_flag为0时,0~5的放大矩阵由Flat_4x4_16获得,6 ~11的放大矩阵由Flat_8x8_16获得。其中:
在这里插入图片描述

pic_order_cnt_type: 决定picture order count的解码方式,它的值为0-2.
log2_max_frame_num_minus4:对max_frame_num取log2后减去4的值,用来进行与frame_num变量相关的计算

frame_mbs_only_flag 等于1表示编码的视频序列是一个编码帧只包含帧宏块
mb_adaptive_frame_field_flag 帧场宏块切换标志 表示在一张图片中存在帧场切换
变量 MbaffFrameFlag = ( mb_adaptive_frame_field_flag && !field_pic_flag )

pps

在这里插入图片描述
在这里插入图片描述

num_slice_groups_minus1 条带组数目
关于多片组 h264 slice_group_map_type
transform_8x8_mode_flag 是否使用8x8变换标志
为0不使用8x8变换,为1使用8x8变换,不存在时该值默认为0.
deblocking_filter_control_present_flag
去方块滤波控制标志,1表示在sliceheader中存在一组描述去方块滤波的语法元素。0表示表示这组语法元素不存在。

参考

H264系列十七 Slice(条带或片层)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值