NAL Unit结构解析
NAL Unit包含NAL Header 和 NAL Body
NAL Header: 一个字节,包括:
- forbidden_zero_bit: 0禁止位,1bit;
- nal_ref_idc:参考索引,代表当前NAL Unit重要性,2bit;
- nal_unit_type: NAL Unit类型,5bit;
NAL Unit的头很简单,下面看看body
- NAL Body包含了有效负载数据及其封装
- NAL Body自外向内的封装共3层
- 第一层:EBSP–扩展字节序列载荷
- 第二层:RBSP–原始字节序列载荷
- 第三层:SODB–数据字节流
EBSP (Extended Byte String Payload)
- 等同于NAL Body数据本身;
- 在EBSP中(可能)包含了一个特殊的字节0x03,表示“防止竞争校验字节”(emulation_prevention_three_byte);
- 作用:防止NAL Body内部出现与NAL Unit起始码0x 00 00 01或0x 00 00 00 01冲突。
怎么防止冲突的?
官方代码表格:如果出现两个00,后边会加入一个竞争防止位,这样24个bit为0x000003
解析时看到两个00把03去掉再解析,把03去掉后得到第二层数据RBSP
RBSP:Raw Byte Sequence Payload
- 原始字节序列载荷:相当于NAL Body去掉附加03字节之后的数据;
- 同原始的语法元素码流相比,RBSP在末尾增加了rbsp_trailing_bits()部分;
- rbsp_trailing_bits():包括一个1bits和若干个0bit,用于实现字节的对齐
这样的RBSP数据是否就是语法元素值本身呢?语法元素进行编码之后,并不是按照每个bit进行对齐的,他可能在某个字节余下了几个bit的空余。所以空余需要用rbsp_trailing_bits填充,以实现字节的对齐。
最里边的一层称作SODB
SODB:String Of Data Bits
- 表示H.264的语法元素编码完成后的实际的原始二进制码流。SODB通常不能保证字节对齐。