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...