在宏塊的幀內預測過程當中,有四種宏塊類型:I_4x4,I_8x8,I16x16,I_PCM。他們都須要在相鄰塊作去塊濾波以前進行幀內預測。html
1-4獲取當前block的幀內預測模式的預測,5-7得到最佳預測模式並對應預測模式的預測作後續處理編碼
不然DC = 0,而且mbAddrA與mbAddrB都是以I_8x8或者I_4x4方式編碼的,則分別取得A與B的預測模式PredModeA, PredModeB。spa
預測模式的選取分爲三種狀況:3d
PredPredMode = Min(PredModeA, PredModeB)htm
不然PredModeFlag = 0。 blog
remPredMode爲最後用來編碼的mode圖片
如今所剩下的惟一疑點就是步驟5的:如何經過計算得當前塊的最優預測模式。rem
預測模式一共有9種。他們的序號與名稱見下方表格get
IntraPredMode | Name of Intra4x4PredMode | Name of Intra8x8PredMode |
0 | Intra_4x4_Vertical | Intra_8x8_Vertical |
1 | Intra_4x4_Horizontal | Intra_8x8_Horizontal |
2 | Intra_4x4_DC | Intra_8x8_DC |
3 | Intra_4x4_Diagonal_Down_left | Intra_8x8_Diagonal_Down_left |
4 | Intra_4x4_Diagonal_Down_right | Intra_8x8_Diagonal_Down_right |
5 | Intra_4x4_Vertical_Right | Intra_8x8_Vertical_Right |
6 | Intra_4x4_Horizontal_Down | Intra_8x8_Horizontal_Down |
7 | Intra_4x4_Vertical_Left | Intra_8x8_Vertical_Left |
8 | Intra_4x4_Horizontal_Up | Intra_8x8_Horizontal_Up |
可見4x4與8x8的預測模式都是以同樣的順序排列。it
除了序號爲2的DC模式外,其餘模式都是經過相鄰塊的邊緣像素點來進行線性預測的,預測方向以下
在圖像上,像素點座標是按照左上至右下的順序遞增的。按照這種規律,能夠獲得一個座標軸以下
這樣的話,預測模式就能夠看作是斜率,只要知道座標軸上的點(相鄰塊邊界像素值),便可經過斜率(預測模式),獲得該斜線上的座標。
就以上圖的這種狀況爲例,能夠看到當mode=4時,斜率爲1,即
$y=x+b$
$-b=x-y$
$-b$就是當$y=0$時,在x軸上的偏移,所以有
$p[-b,0]=p[x –y,0]$
因爲同一條線上的值相等,因此有
$p[x,y]=p[x-y,0]$
同理,當$mode=5$時,斜率爲2,有
$y=2\times{(x+b)}$
獲得
$p[-b,0]=p[x-\frac{y}{2},0]=p[x,y]$
固然,以上只是大體闡述了用幀內預測來獲得像素點的值的方式,在實際進行幀內預測的時候並不會這麼簡單,並且Intra4x4與Intra8x8在細節上也會有一些差異。下面會更詳細地討論Intra4x4預測模式。
對於一個4x4塊來講,在進行幀內預測時會用到相鄰像素點有13個,如上方圖片中紅色方塊所示。可是在相鄰宏塊不可用於intra預測的時候,該相鄰宏塊上的像素點是不可用的,也就是說會存在相鄰像素點不可用的狀況。可是存在一個特殊狀況:若是不可用的是(4~7,-1),而(3,-1)是可用的,那會令(4~7,-1)的值等於(3,-1)的像素點的值去進行預測。
$Pred{4}\times{4}_{L}[x,y] = p[x,-1]$
$Pred{4}\times{4}_{L}[x,y] = p[-1,y]$
$Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{y=0}^{3}{p[-1,y]} + \sum_{x=0}^{3}{p[x,-1]}}$
$Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{x=0}^{3}{p[x,-1]}}$
$Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{y=0}^{3}{p[-1,y]}} $
$Pred{4}\times{4}_{L}[x,y] = 1<<(BitDepth-1)$
$Pred{4}\times{4}_{L}[x,y] = (p[6,-1] + 3\times{p[7,-1]} + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[x + y,-1] + 2\times{p[x + y + 1,-1]} + p[x + y +2, -1] + 2) >> 2$
由上面的式子能夠看出,在斜的方向上預測時,會參考不止一個相鄰像素點,而是周圍的兩到三個。
$Pred{4}\times{4}_{L}[x,y] = (p[x-y-2,-1] + 2\times{p[x-y-1,-1]} + p[x-y, -1] + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y-x-2] + 2\times{p[-1,y-x-1]} + p[-1,y-x] + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[0,-1] + 2\times{p[-1,-1]} + p[-1,0] +2)>>2$
Intra 4x4 Vertical Right Prediction Mode
$zVR = 2\times{x}+y$
$Pred{4}\times{4}_{L}[x,y] = (p[x-\frac{y}{2}-1,-1] + p[x-\frac{y}{2}, -1] + 1) >> 1$
$Pred{4}\times{4}_{L}[x,y] = (p[x-\frac{y}{2}-2,-1]+2\times{p[x-\frac{y}{2}-1,-1]} + p[x-\frac{y}{2}, -1] + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,0]+2\times{p[-1,-1]} + p[0, -1] + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y-1]+2\times{p[-1,y-2]} + p[-1,y-3] + 2) >> 2$
$zHD = 2\times{y}-x$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y-\frac{x}{2}-1] + p[-1,y-\frac{x}{2}] + 1) >> 1$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y-\frac{x}{2}-2]+2\times{p[-1,y-\frac{x}{2}-1]} + p[-1,y-\frac{x}{2}] + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,0]+2\times{p[-1,-1]} + p[0, -1] + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[x-1,-1]+2\times{p[x-2,-1]} + p[x-3,-1] + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[x+\frac{y}{2},-1] + p[x+\frac{y}{2}+1,-1] + 1) >> 1$
$Pred{4}\times{4}_{L}[x,y] = (p[x-1,-1]+2\times{p[x-2,-1]} + p[x-3,-1] + 2) >> 2$
$zHU = x + 2\times{y}$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y+\frac{x}{2}] + p[-1,y+\frac{x}{2}+1] + 1) >> 1$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y+\frac{x}{2}]+2\times{p[-1,y+\frac{x}{2}+1]} + p[-1,y+\frac{x}{2}+2] + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,2]+3\times{p[-1,3]} + 2) >> 2$
$Pred{4}\times{4}_{L}[x,y] = p[-1,3]$
以上,能夠看到Intra4x4預測的整個流程。在上面的圖能夠看到各個預測所須要的相鄰像素點,若是該像素點不可用於Intra4x4的預測,那麼依賴於該像素點的預測模式是不可用的。
8x8塊的幀內預測跟4x4的基本上是同樣的,能夠看作放大了的4x4塊。例如上面提到的相鄰宏塊不可用的狀況,8x8塊在預測時也會用(7,-1)去補全(8~15,-1)。而預測的方向也是與上面4x4預測的9個徹底同樣。
可是有一個不一樣的地方,就是8x8塊在預測以前會去作一次邊界像素點的濾波,濾波後所得的新像素點會被用於當前8x8塊的預測,不一樣於4x4會直接去用邊界像素點了進行預測。
Intra16x16是對整個宏塊進行幀內預測,這種比4x4的更爲簡單,只有四種預測模式
Intra16x16PredMode | Name of Intra16x16PredMode |
0 | Intra_16x16_Vertical |
1 | Intra_16x16_Horizontal |
2 | Intra_16x16_DC |
3 | Intra_16x16_Plane |
其中模式0,1,2能夠看作是Intra4x4模式的放大版,模式3能夠參考Chroma Intra Prediction的模式3。
PCM模式就是把一個宏塊共256個像素點的值不作任何處理,直接進行熵編碼的模式,Chroma也有PCM這個模式。