H264預測模式筆記
目錄
H.264標準中提出按塊進行計算,一個巨集塊是16x16畫素,然後它可以分成子塊,最小是4x4的(這個大小是對於亮度編碼而言,至於色度編碼,4:2:0格式的色度巨集塊的長和寬都是亮度巨集塊的一半),這樣也能大大提高計算速度。
亮度Luma預測模式
4x4亮度塊預測
Intra(幀內預測)有兩種,一種是4x4大小的亮度塊,一種是16x16大小的亮度塊。對於4x4大小的亮度塊,我們有9種預測模式,如下圖所示
模式0:垂直模式,條件:A~D可用。
模式1:水平模式,條件:I~L可用。
模式2:DC模式,條件:A~D或I~L可用。
模式3~8:方向模式,各個畫素是由A到L畫素通過權重不等的公式加權計算的。
我們注意到這裡有9種模式,之後要進行編碼的話,我們除了把殘差編進去,總得知道我預測的時候用了哪種模式吧,9這個數就尷尬了,因為剛好三個位元可以表示8種,四個位元可以表示16種,所以3bit不夠4bit又浪費了。怎麼辦呢?有個方法就比較巧妙,我有1bit用來表示我當前用的模式和前面的是不是一樣的,因為經常有這樣的情況,我前面塊用的預測方向和現在這個塊用的預測方向一樣(比如物體邊緣是一條直線,那麼對應的那幾個塊用的預測方向很可能都是一樣的),如果一樣,我只用1bit就足夠儲存了,如果不一樣,我再用用4個bit儲存,也就達到了節約bit的目的。
16x16亮度塊預測
16x16亮度塊有四種模式,如下圖
參考畫素為左邊16個、上邊16個和左上1個共33個畫素,分別記為p(-1,y)、p(x,-1)、p(-1,-1)。參考畫素在下面情況下不可用:
》不位於當前影象或條帶;位於幀間巨集塊,且constrained_intra_pred為1;
預測模式有4種:
》模式0:垂直預測,條件:p(x,-1)可用;
》模式1:水平預測,條件:p(-1,y)可用;
》模式2:DC預測,條件:p(x,-1)或p(-1,y)可用;
》模式3:平面(plane)預測。
8x8的色度塊預測
對於色度塊是亮度塊的四分之一,也就是8x8的,那就只有一種了,預測模式也跟亮度16x16塊的類似,有四種,只不過具體的序號不一樣而已。是0代表DC,1代表horizontal,2代表vertical,3代表plane。
plane的演算法和上面16x16的類似,只不過係數變了,而且兩個色度塊用的方式一定都是一樣的。
幀內預測模式的選擇
亮度和色度的幀內預測,都有多種預測策略,因此實際應用中要選擇最優的幀內預測策略。
對於色度塊預測,只能採用8x8的分塊大小,只需要比較4中模式的代價(用RDO模型),選擇代價最小的模式即可。
對於亮度塊預測,可以採用16x16和4x4的塊大小,所以需要先後計算出9中4x4預測模式的最小代價(RDO模型)和4中16x16預測模式的最小代價(SATD公式),然後從中選擇較小的預測模式。
4x4亮度塊的預測模式編碼
由於4x4塊有9種預測模式,如果完全編碼需要4bits,所以根據該塊周圍(上和左)邊的4x4塊的預測方式來推斷當前塊的預測模式。如果推斷的預測模式一直,則只需要傳輸1bit(pred_intra4x4_pred_mode_flags=0),否則傳輸需要4(rem_intra4x4_pred_mode為4x4亮度塊預測模式的編碼值)+1(pred_intra4x4_pred_mode_flags=1)=5bits。
使用無符號哥倫布編碼直接將預測方式編號編入碼流。