【H264/AVC 句法和語義詳解】(三):NALU詳解二(EBSP、RBSP與SODB)

原文鏈接:https://www.jianshu.com/p/5f89ea2c3a28

本篇隸屬於文集:《H264/AVC 句法和語義詳解》,查看文集全部文章,請點擊文字鏈接。
想看最新文章,可以直接關注微信公衆號:金架構

上一篇解析到,我們從h264裸流中,提取出一個個的NALU,並且解析出NALU的第一個字節:NALU Header。下面我們就從NALU Header的下一個字節開始,分析NALU剩餘的數據部分,也即NALU的主體部分。

NALU的主體涉及到三個重要的名詞,分別爲EBSP、RBSP和SODB。其中EBSP完全等價於NALU主體,而且它們三個的結構關係爲:

EBSP包含RBSP,RBSP包含SODB。
其中SODB就是最原始的編碼數據。

  1. EBSP和RBSP
    上篇我們說,NALU的組成部分爲:

NALU = NALU Header + RBSP
其實嚴格來說,這個等式是不成立的,因爲RBSP並不等於NALU刨去NALU Header。嚴格來說,NALU的組成部分應爲:

NALU = NALU Header + EBSP
其中的EBSP爲擴展字節序列載荷(Encapsulated Byte Sequence Payload),而RBSP爲原始字節序列載荷(Raw Byte Sequence Payload)。那爲什麼我們上篇中,沒有使用2式而使用了1式呢?那是因爲,在h264的文檔中,並沒有EBSP這一名詞出現,但是在h264的官方參考軟件JM裏,卻使用了EBSP。

而且在我們下面的分析中,我們會看到,使用EBSP是很易於理解的。

1.1 防止競爭
EBSP相較於RBSP,多了防止競爭的一個字節:0x03。

我們知道,NALU的起始碼爲0x000001或0x00000001,同時H264規定,當檢測到0x000000時,也可以表示當前NALU的結束。那這樣就會產生一個問題,就是如果在NALU的內部,出現了0x000001或0x000000時該怎麼辦?

所以H264就提出了“防止競爭”這樣一種機制,當編碼器編碼完一個NAL時,應該檢測NALU內部,是否出現如下左側的四個序列。當檢測到它們存在時,編碼器就在最後一個字節前,插入一個新的字節:0x03。
在這裏插入圖片描述
防止競爭插入0x03
圖中0x000000和0x000001前面介紹了,0x000002是作爲保留使用,而0x000003,則是爲了防止NALU內部,原本就有序列爲0x000003這樣的數據。

這樣一來,當我們拿到EBSP時,就需要檢測EBSP內是否有序列:0x000003,如果有,則去掉其中的0x03。這樣一來,我們就能得到原始字節序列載荷:RBSP。

  1. RBSP和SODB
    得到RBSP之後,我們迫切想做的,就是從RBSP中,提取出原始編碼數據SODB(String Of Data Bits)。這就涉及到RBSP與SODB的關係:

RBSP = SODB + RBSP尾部
而且RBSP的尾部,在規定中有兩種,我們分別介紹。

2.1 RBSP尾部
其中大多數類型的NALU,使用這種尾部。
在這裏插入圖片描述
RBSP尾部語法 (文檔7.3.2.11)
其中:

rbsp_stop_one_bit 佔1個比特位,值爲1

rbsp_alignment_zero_bit 值爲0,目的是爲了進行字節對齊,佔據若干比特位

所以RBSP就等於,SODB在它的最後一個字節的最後一個比特後,緊跟值爲1的1個比特,然後增加若干比特的0,以補齊這個字節。

2.2 條帶RBSP尾部
另一種尾部,就是當NALU類型爲條帶時,也即nal_unit_type等於1~5時,這時RBSP使用下面這種尾部:
在這裏插入圖片描述
條帶RBSP尾部語法(7.3.2.10)
可以看到,rbsp_slice_trailing_bits()默認情況下,就是2.1介紹的第一種尾部。只是當entropy_coding_mode_flag值爲1,也即當前採用的熵編碼爲CABAC,而且more_rbsp_trailing_data()返回爲true,也即RBSP中有更多數據時,添加一個或多個0x0000。

所以我們拿到RBSP,只需要按照上述語法,去掉RBSP的尾部,就可以得到SODB。然後就可以對照對應類型的NALU的句法,解析出語法元素的值。

總結上篇和這篇,H264的碼流結構如下:
在這裏插入圖片描述
H264碼流結構
3. H264句法元素解析流程
而當我們拿到RBSP或SODB之後,就可以對照各類型的NALU,去解析它們的語法元素,進而再根據語法元素,重建圖像。其中解析語法元素的框圖如下:
在這裏插入圖片描述
解析NALU框圖
由圖可見,解析NALU的各個句法元素並不難,只要根據h264文檔對應章節的句法,並配合相應的編解碼算法解析即可。而相應的編解碼算法如指數哥倫布編碼、CAVLC、CABAC、算術編碼,我們會一步步涉獵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章