3位元組起始碼和4位元組起始碼

2021-07-23 13:25:35 字數 1058 閱讀 5389

if( next_bits( 24 ) != 0x000001 )

zero_byte                                      f(8)

start_code_prefix_one_3bytes   f(24)

根據b.1節,可以看到所謂的4位元組起始碼是(zero_byte + 3位元組起始碼)。那麼看zero_byte的說明,就可以明白zero_byte什麼時候出現,也就能明白什麼時候出現4位元組起始碼:

1. sps、pps nalu是4位元組起始碼;

2. access unit的首個nalu是4位元組起始碼(參見7.4.1.2.3)。

這裡舉個例子說明,用jm可以生成這樣一段碼流(不要使用jm8.6,它在這部分與標準不符),這個碼流可以見本樓附件:

sps            (4位元組頭)

pps            (4位元組頭)

sei            (4位元組頭)

i0(slice0)     (4位元組頭)

i0(slice1)    (3位元組頭)

p1(slice0)     (4位元組頭)

p1(slice1)    (3位元組頭)

p2(slice0)     (4位元組頭)

p2(slice1)    (3位元組頭)

i0(slice0)是序列第一幀(i幀)的第乙個slice,是當前access unit的首個nalu,所以是4位元組頭。而i0(slice1)表示第一幀的第二個slice,所以是3位元組頭。p1(slice0) 、p1(slice1)同理。

總結:1 附錄 b位元組流在乙個byte_stream_nal_unit的前後可能出現若干個0x00,僅用作填充之用。這個不常見。

2 4位元組頭只出現在sps、pps和7.4.1.2.3規定的access unit的首個nalu。其餘情況都是3位元組頭

一共有兩種起始碼:3位元組的0x000001和4位元組的0x00000001

3位元組的0x000001只有一種場合下使用,就是乙個完整的幀被編為多個slice的時候,包含這些slice的nalu使用3位元組起始碼。其餘場合都是4位元組的。

**

詳解4位元組對齊

摘要 編譯器通常採用的預設位元組對齊規則 對於型別t,在n bit系統中,保證變數首位址在min sizeof t n 8 位元組位置上,以保證最少讀週期。以下為原文 其實我也是一條分割線 所謂的位元組對齊,就是各種型別的資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這個就是對齊。我...

詳解4位元組對齊

摘要 編譯器通常採用的預設位元組對齊規則 對於型別t,在n bit系統中,保證變數首位址在min sizeof t n 8 位元組位置上,以保證最少讀週期。以下為原文 其實我也是一條分割線 所謂的位元組對齊,就是各種型別的資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這個就是對齊。我...

詳解4位元組對齊

什麼是4位元組對齊?4位元組對齊有什麼好處,有什麼壞處?分析一波。首先先定義乙個結構體。typedef struct aa aa aa aa 32位處理器,如果沒有採用4位元組對齊,首先結構體變數aa存放在記憶體中的起始位址為0x00,那麼其成員變數a的起始位址為0x00,成員變數b的起始位址為0x...