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通常不能保證字節對齊。