h264-数据分层结构
overview
【H264/AVC 句法和语义详解】(二):h264码流格式与NALU详解一
Bitstream
编码标记
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表示表示这组语法元素不存在。