1. 程式人生 > >openh264編碼之巨集塊

openh264編碼之巨集塊

一、結構定義

1)在序列中的位置

2)巨集塊需要包含的資訊

3)elecard裡面示例巨集塊資訊

在elecard,選中一個巨集塊,可以獲取到左圖所示的位置、大小、巨集塊型別等資訊。

4)H264協議巨集塊格式定義

按照macroblock_layer的語法結構上看,巨集塊能粗略分成三種結構:PCM、sub_mb_pred(子巨集塊預測)、mb_pred(巨集塊預測)。另外,雖然skip巨集塊並不在macroblock內描述,它也是巨集塊的一種結構。

1、mb_type

在一個巨集塊中,最開始的語法元素為巨集塊的型別:mb_type。從表中我們可以看出,根據mb_type的值是否等於I_PCM,整個解析方法分為兩大類:PCM型別和非PCM型別。

當這個巨集塊為I_PCM模式時,巨集塊中以差分編碼的形式儲存巨集塊原始的畫素值。此時存在如下幾個語法元素:
pcm_alignment_zero_bit:填充位,用位元0來填充直到按位元組對齊;
pcm_sample_luma:256個亮度分量的差分畫素值;
pcm_sample_chroma:若干個色度分量的差分畫素值,實際數量由碼流的顏色格式指定。例如對於最常用的4:2:0格式的視訊,共有128個色度畫素值。

2、mb_pred

巨集塊預測的語法結構,巨集塊預測與子巨集塊預測的語法結構是相斥的,一個巨集塊的組成結構要麼採用的是巨集塊預測的結構,要麼4個子巨集塊都是子巨集塊的預測結構。

3、sub_mb_pred

子巨集塊預測的語法結構,子巨集塊為8x8大小的巨集塊,也就是說一個巨集塊有4個子巨集塊,在這個語法結構的內部會進行4次子巨集塊預測。

4、coded_block_pattern

語法元素常簡稱做cbp,用於表示當前巨集塊內的4個8×8子塊編碼對其中的哪個的殘差係數進行編碼。值得注意的是該語法元素僅僅在巨集塊為非I_16x16模式時才存在,因為在I_16x16模式時cbp的有關資訊已經在mb_type中體現。

5、mb_qp_delta

表示巨集塊層的量化引數偏移值,取值範圍為[-26, 25]。我們在前面已經在PPS中獲取了整個序列的量化引數初始值(由pic_init_qp_minus26計算),在slice header中獲取slice層的量化引數偏移slice_qp_delta,因此每一個slice第一個巨集塊的量化引數可通過下面的公式計算: 

QP=pic_init_qp_minus26 + 26 + slice_qp_delta + mb_qp_delta

6、residual

畫素殘差編碼的語法結構。