H.264(九)Slice數據和宏塊結構

1 Slice的組成

每一個Slice總體來看都由兩部分組成,一部分作爲Slice header,用於保存Slice的總體信息(如當前Slice的類型等),另一部分爲Slice body,通常是一組連續的宏塊結構(或者宏塊跳過信息),如下圖所示:

 

2 Slice Data結構的定義

在已經實現了一個slice的header部分之後,下面的工作將是研究如何解析一個slice的主體,即Slice Body部分。一個Slice的body部分主要是一個個的宏塊結構Macroblock組成,此外還存在一些輔助的信息。標準文檔中規定的slice_data()結構如下圖:

Slice Data語法表:

cabac_alignment_one_bit 當熵編碼模式是 CABAC 時,此時要求數據字節對齊,即數據從下一個字節的第一個比特開始,如果還沒有字節對齊將出現若干個 cabac_alignment_one_bit 作爲填充。

mb_skip_run 當圖像採用幀間預測編碼時, H.264 允許在圖像平坦的區域使用“跳躍”塊, “跳躍”塊本身不攜帶任何數據,解碼器通過周圍已重建的宏塊的數據來恢復“跳躍”塊。

在表 我們可以看到,當熵編碼爲 CAVLC 或 CABAC 時, “跳躍”塊的表示方法不同。

  • 當entropy_coding_mode_flag 爲 1,即 熵 編 碼 爲 CABAC 時 , 是 每 個 “ 跳 躍 ” 塊 都 會 有 句 法 元 素 mb_skip_flag 指 明。
  • 當entropy_coding_mode_flag 等於 0,即熵編碼爲 CAVLC 時,用一種行程的方法給出緊連着的“跳躍”塊的數目,即句法元素mb_skip_run。 mb_skip_run 值的範圍 0 to PicSizeInMbs – CurrMbAddr 。

這兩個語法元素都用於表示宏塊結構是否可以被跳過。“跳過”的宏塊指的是,在幀間預測的slice中,當圖像區域平坦時,碼流中跳過這個宏塊的所有數據,不進行傳輸,只通過這兩個語法元素進行標記。在解碼端,跳過的宏塊通過周圍已經重建的宏塊來進行恢復。mb_skip_run用於熵編碼使用CAVLC時,用一個語法元素表示連續跳過的宏塊的個數;mb_skip_flag用於熵編碼使用CABAC時,表示每一個宏塊是否被跳過。

mb_skip_flag 見上一條, 指明當前宏塊是否是跳躍編碼模式的宏塊。

mb_field_decoding_flag 在幀場自適應圖像中,指明當前宏塊所屬的宏塊對是幀模式還是場模式。 0 幀模式; 1 場模式。如果一個宏塊對的兩個宏塊句法結構中都沒有出現這個句法元素,即它們都是“跳躍”塊時,本句法元素由以下決定:

  • 如果這個宏塊對與相鄰的、左邊的宏塊對屬於同一個片時,這個宏塊對的 mb_field_decoding_flag的值等於左邊的宏塊對的 mb_field_decoding_flag 的值。
  • 否 則 , 這 個 宏 塊 對 的 mb_field_decoding_flag 的 值 等 於 上 邊 同 屬 於 一 個 片 的 宏 塊 對 的mb_field_decoding_flag 的值。
  • 如果這個宏塊對既沒有相鄰的、上邊同屬於一個片的宏塊對;也沒有相鄰的、左邊同屬於一個片的宏塊對,這個宏塊對的 mb_field_decoding_flag 的值等於 0,即幀模式。

end_of_slice_flag 在CABAC模式下的一個標識位,表示是否到了slice的末尾。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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