在宏塊的幀內預測過程中,有四種宏塊類型:I_4x4,I_8x8,I16x16,I_PCM。他們都需要在相鄰塊做去塊濾波之前進行幀內預測。
亮度幀內預測的總體流程
1-4獲取當前block的幀內預測模式的預測,5-7獲得最佳預測模式並對應預測模式的預測做后續處理
-
首先需要獲得當前4x4(8x8)預測塊有左、上的4x4(8x8)相鄰塊A、B,假設其所在宏塊為mbAddrA、mbAddrB。
-
如果mbAddrA或mbAddrB中任意一個宏塊不可用於幀內預測( 請參考),那么就會設置DC = 1,否則DC = 0。
-
如果DC = 1,或者相鄰宏塊mbAddrA,mbAddrB不是以I_8x8或者I_4x4方式編碼的,表明A、B不適用於當前的預測過程,那么設置A、B為PredModeA = PredModeB = 2。
否則DC = 0,並且mbAddrA與mbAddrB都是以I_8x8或者I_4x4方式編碼的,則分別取得A與B的預測模式PredModeA, PredModeB。
預測模式的選取分為三種情況:
-
左與上的相鄰塊都在當前宏塊,即此時當前宏塊還未決定是采用I_8x8還是I_4x4或者其他的預測方式。那么當前塊的相鄰塊A,B的預測模式就采用與這輪的宏塊模式相同的方式的預測模式。如,當前正以I_8x8進行幀內預測,那PredModeA = PredMode8x8A,PredModeB = PredMode8x8_B.
-
左與上的宏塊都位於相鄰宏塊,即當前塊位於宏塊的左上角。此時左與上塊所在的宏塊都已選定了所采用的幀內宏塊預測方式,因此無論當前塊是在哪輪的幀內預測上(I_4x4或I_8x8),都應采用相鄰宏塊的預測方式來作為當前塊的相鄰塊的幀內預測模式,PredModeA = PredModeMacroBlockA,PredModeB = PredModeMacroBlockB.
-
左或上的其中一個塊為相鄰宏塊,僅有一個(左或上)塊位於當前宏塊。這種情況下,位於其他宏塊的相鄰塊采用其所在宏塊的幀內預測模式,位於當前宏塊的相鄰塊采用這一輪預測模式。PredModeA = PredMode4x4A,PredModeB = PredModeMacroblockB.
-
-
根據相鄰塊的幀內預測模式得到當前預測模式的預測:
PredPredMode = Min(PredModeA, PredModeB)
-
上面得到的只是一個預測值,並不是當前塊實際的預測模式。因此還需要通過計算得到最適合當前塊的預測模式PredMode
-
如果PredPredMode == PredMode,說明上方的預測是准確的,設置PredModeFlag = 1;
否則PredModeFlag = 0。
-
I_4x4與I_8x8都有9個模式,但是在PredModeFlag = 0的時候,說明預測得到的預測模式PredPredMode可以被排除在外了,因此剩下的模式只有8個,這樣剛剛好只用上3個bit就能表示。所以按照下方的做法,可以使原來4個bit才能表示的mode用3個bit就能表示:
-
如果PredMode < PredPredMode,remPredMode = PredMode
-
如果PredMode > PredPredMode,remPredMode = PredMode -1
remPredMode為最后用來編碼的mode
-
現在所剩下的唯一疑點就是步驟5的:如何通過計算得當前塊的最優預測模式。
預測模式一共有9種。他們的序號與名稱見下方表格
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的預測模式都是以一樣的順序排列。
除了序號為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預測模式。
Intra4x4
對於一個4x4塊來說,在進行幀內預測時會用到相鄰像素點有13個,如上方圖片中紅色方塊所示。但是在相鄰宏塊不可用於intra預測的時候,該相鄰宏塊上的像素點是不可用的,也就是說會存在相鄰像素點不可用的情況。但是存在一個特殊情況:如果不可用的是(4~7,-1),而(3,-1)是可用的,那會令(4~7,-1)的值等於(3,-1)的像素點的值去進行預測。
-
Intra 4x4 Vertical Prediction Mode
$Pred{4}\times{4}_{L}[x,y] = p[x,-1]$
-
Intra 4x4 Horizontal Prediction mode
$Pred{4}\times{4}_{L}[x,y] = p[-1,y]$
-
Intra 4x4 DC Prediction Mode
- If (0~3,-1) and (-1,0~3) is available for Intra 4x4 prediction
$Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{y=0}^{3}{p[-1,y]} + \sum_{x=0}^{3}{p[x,-1]}}$
- Else if only (0~3, -1) is available for Intra 4x4 prediction
$Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{x=0}^{3}{p[x,-1]}}$
- Else if only (-1, 0~3) is available for Intra 4x4 prediction
$Pred{4}\times{4}_{L}[x,y] = \displaystyle{\sum_{y=0}^{3}{p[-1,y]}} $
- Else none is available for Intra 4x4 prediction
$Pred{4}\times{4}_{L}[x,y] = 1<<(BitDepth-1)$
- If (0~3,-1) and (-1,0~3) is available for Intra 4x4 prediction
-
Intra 4x4 Diagonal Down Left Prediction Mode
- If $x = y = 3$
$Pred{4}\times{4}_{L}[x,y] = (p[6,-1] + 3\times{p[7,-1]} + 2) >> 2$
- Else
$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$
由上面的式子可以看出,在斜的方向上預測時,會參考不止一個相鄰像素點,而是周圍的兩到三個。
- If $x = y = 3$
-
Intra 4x4 Diagonal Down Right Prediction Mode
- If $x > y$
$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$
- Else if $x < y$
$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$
- Else
$Pred{4}\times{4}_{L}[x,y] = (p[0,-1] + 2\times{p[-1,-1]} + p[-1,0] +2)>>2$
- If $x > y$
-
Intra 4x4 Vertical Right Prediction Mode
$zVR = 2\times{x}+y$
- If $zVR = 0,2,4,6$
$Pred{4}\times{4}_{L}[x,y] = (p[x-\frac{y}{2}-1,-1] + p[x-\frac{y}{2}, -1] + 1) >> 1$
- Else if $zVR = 1,3,5$
$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$
- Else if $zVR = -1$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,0]+2\times{p[-1,-1]} + p[0, -1] + 2) >> 2$
- Else $zVR = -2, -3$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y-1]+2\times{p[-1,y-2]} + p[-1,y-3] + 2) >> 2$
- If $zVR = 0,2,4,6$
-
Intra 4x4 Horizontal Down Prediction
$zHD = 2\times{y}-x$
- If $zHD = 0,2,4,6$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y-\frac{x}{2}-1] + p[-1,y-\frac{x}{2}] + 1) >> 1$
- Else if $zHD = 1,3,5$
$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$
- Else if $zHD = -1$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,0]+2\times{p[-1,-1]} + p[0, -1] + 2) >> 2$
- Else $zHD = -2, -3$
$Pred{4}\times{4}_{L}[x,y] = (p[x-1,-1]+2\times{p[x-2,-1]} + p[x-3,-1] + 2) >> 2$
- If $zHD = 0,2,4,6$
-
Intra 4x4 Vertical Left Prediction Mode
- If $y = 0,2$
$Pred{4}\times{4}_{L}[x,y] = (p[x+\frac{y}{2},-1] + p[x+\frac{y}{2}+1,-1] + 1) >> 1$
- Else $ y = 1,3$
$Pred{4}\times{4}_{L}[x,y] = (p[x-1,-1]+2\times{p[x-2,-1]} + p[x-3,-1] + 2) >> 2$
- If $y = 0,2$
-
Intra 4x4 Horizontal Up Predition
$zHU = x + 2\times{y}$
- If $zHU = 0,2,4$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,y+\frac{x}{2}] + p[-1,y+\frac{x}{2}+1] + 1) >> 1$
- Else if $zHU = 1,3$
$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$
- Else if $zHU = 5$
$Pred{4}\times{4}_{L}[x,y] = (p[-1,2]+3\times{p[-1,3]} + 2) >> 2$
- Else $zHU > 5$
$Pred{4}\times{4}_{L}[x,y] = p[-1,3]$
- If $zHU = 0,2,4$
以上,可以看到Intra4x4預測的整個流程。在上面的圖可以看到各個預測所需要的相鄰像素點,如果該像素點不可用於Intra4x4的預測,那么依賴於該像素點的預測模式是不可用的。
Intra8x8
8x8塊的幀內預測跟4x4的基本上是一樣的,可以看做放大了的4x4塊。例如上面提到的相鄰宏塊不可用的情況,8x8塊在預測時也會用(7,-1)去補全(8~15,-1)。而預測的方向也是與上面4x4預測的9個完全一樣。
但是有一個不同的地方,就是8x8塊在預測之前會去做一次邊界像素點的濾波,濾波后所得的新像素點會被用於當前8x8塊的預測,不同於4x4會直接去用邊界像素點了進行預測。
Intra16x16
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。
I_PCM
PCM模式就是把一個宏塊共256個像素點的值不做任何處理,直接進行熵編碼的模式,Chroma也有PCM這個模式。