在宏块的帧内预测过程当中,有四种宏块类型: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这个模式。