参考文档JCTVC-B205_draft007.doc
/*由于直接从word文档拷贝,各标题序号有误,所有标号为1.1....的应为6.2....。
由于无法复制公式,故各公式显示有误,请参阅英文源文档*/
1.1.1 亮度样点的帧内预测过程
当预测单元PredMode为MODE_INTRA且planar_flag == 0时调用本过程。
本过程的输入是相邻预测单元的IntraPredMode(如果可用)值。
依赖于intra_split_flag的值,预测单元的亮度分量由一个活四个亮度样点块组成。当intra_split_flag等于0时变量PartMode推导为PART_2Nx2N,intra_split_flag等于1时变量PartMode推导为PART_ NxN。这些块通过调用4.2.4节定义的逆扫描过程进行逆扫描。
对所有的预测单元分割块,调用6.2.1.1节规定的IntraPredMode的推导过程,在这个过程中,puPartIdx和相邻亮度预测单元去块效应滤波之前的(解码顺序)重建样点作为输入,输出为变量IntraPredMode。
对每个预测单元:
– 调用6.2.1.2节规定的帧内亮度样点预测过程,puPartIdx和相邻亮度预测单元去块效应滤波之前的(解码顺序)重建样点作为输入,输出为帧内亮度预测样点predPartL[ x, y ],其中 x = 0..PuPartWidth( puPartIdx ),y = 0..PuPartHeight( puPartIdx )。
– 调用4.2.4.2节定义的逆预测单元分割扫描过程,可以得到当前预测单元中索引为puPartIdx的预测单元分隔块的左上角样点位置,这个过程的输入是puPartIdx,输出值赋给( xO, yO ), x = 0..PuPartWidth( puPartIdx ),y = 0..PuPartHeight( puPartIdx )。
predL[ xO + x, yO + y ] = predPartL[ x, y ]
– 调用6.4节定义的位于去块效应滤波之前的变换系数解码过程和图像重建过程,输入是predL和puPartIdx,输出是当前预测单元分割S’L的重建样点。
1.1.1.1 IntraPredMode的推导过程
本过程的输入是索引puPartIdx和先前(按照解码顺序)已经得到的相邻预测单元的变量序列IntraPredMode(如果可用)。
本过程的输出是变量IntraPredMode[ puPartIdx ]。
表6-1定义了IntraPredMode[ puPartIdx ]的值和相应的名称。
表6-1 IntraPredMode[ puPartIdx ]及相关名称的规范
IntraPredMode | IntraPredType [ puPartIdx ] | IntraPredAngleID |
0 | Intra_Vertical | 0 |
1 | Intra_Horizontal | 0 |
2 | Intra_DC | - |
3 | Intra_Vertical | -8 |
4 | Intra_Vertical | -4 |
5 | Intra_Vertical | +4 |
6 | Intra_Vertical | +8 |
7 | Intra_Horizontal | -4 |
8 | Intra_Horizontal | +4 |
9 | Intra_Horizontal | +8 |
10 | Intra_Vertical | -6 |
11 | Intra_Vertical | -2 |
12 | Intra_Vertical | +2 |
13 | Intra_Vertical | +6 |
14 | Intra_Horizontal | -6 |
15 | Intra_Horizontal | -2 |
16 | Intra_Horizontal | +2 |
17 | Intra_Horizontal | +6 |
18 | Intra_Vertical | -7 |
19 | Intra_Vertical | -5 |
20 | Intra_Vertical | -3 |
21 | Intra_Vertical | -1 |
22 | Intra_Vertical | +1 |
23 | Intra_Vertical | +3 |
24 | Intra_Vertical | +5 |
25 | Intra_Vertical | +7 |
26 | Intra_Horizontal | -7 |
27 | Intra_Horizontal | -5 |
28 | Intra_Horizontal | -3 |
29 | Intra_Horizontal | -1 |
30 | Intra_Horizontal | +1 |
31 | Intra_Horizontal | +3 |
32 | Intra_Horizontal | +5 |
33 | Intra_Horizontal | +7 |
表6-2定义了根据变量IntraPredMode和IntraPredModeNum相应的MappedMostProbable值。
表6-2 与IntraPredMode和IntraPredModeNum相应的MappedMostProbable值得规范
IntraPredModeNum [puPartIdx] IntraPredMode | 5 | 17 | 34 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 2 | 2 | 2 |
3 | 3 | 3 | 3 |
4 | 4 | 4 | 4 |
5 | 0 | 5 | 5 |
6 | 2 | 6 | 6 |
7 | 1 | 7 | 7 |
8 | 1 | 8 | 8 |
9 | 2 | 9 | 9 |
10 | 2 | 10 | 10 |
11 | 0 | 11 | 11 |
12 | 0 | 12 | 12 |
13 | 2 | 13 | 13 |
14 | 2 | 14 | 14 |
15 | 1 | 15 | 15 |
16 | 1 | 16 | 16 |
17 | 2 | 2 | 17 |
18 | 2 | 3 | 18 |
19 | 4 | 10 | 19 |
20 | 4 | 11 | 20 |
21 | 0 | 0 | 21 |
22 | 0 | 0 | 22 |
23 | 0 | 12 | 23 |
24 | 2 | 5 | 24 |
25 | 2 | 13 | 25 |
26 | 2 | 14 | 26 |
27 | 2 | 7 | 27 |
28 | 1 | 15 | 28 |
29 | 1 | 1 | 29 |
30 | 1 | 1 | 30 |
31 | 1 | 16 | 31 |
32 | 2 | 8 | 32 |
33 | 2 | 2 | 33 |
IntraPredMode[ puPartIdx ]由以下方式得到:
– 调用4.3.4.4节定义的相邻分割的推导过程,输入是puPartIdx,输出分别赋值给lcuAddrA, puIdxA, partIdxA, lcuAddrB, puIdxB及partIdxB。
– 应用以下步骤推导IntraPredMode[ puPartIdx ]:
– 变量intraPredModeN(N用A或B代替)由以下方式得到:
- 如果地址为lcuAddN的LCU不可用,intraPredModeN设为-1
- 否则,如果所有为puIdxN的预测单元(PU)不是以帧内预测模式编码的,intraPredModeN设为Intra_DC
- 否则,intraPredModeN设为IntraPredMode[ puPartIdxN ],这里IntraPredMode是分配给预测单元puIdxN的变量阵列。
– 程序如下:
MostProbable = Min( intraPredModeA, intraPredModeB )
if ( MostProbable >= IntraPredModeNum[ puPartIdx ] )
MostProbable = MappedMostProbable ( IntraPredModeNum[ puPartIdx ], MostProbable )
if ( MostProbable == -1 )
MostProbable = 2
if ( prev_intra_luma_pred_flag[ puPartIdx ] )
IntraPredMode[ puPartIdx ] = MostProbable
else
if ( rem_intra_luma_pred_mode[ puPartIdx ] < MostProbable )
IntraPredMode[ puPartIdx ] = rem_intra_luma_pred_mode[ puPartIdx ]
else
IntraPredMode[ puPartIdx ] = rem_intra_luma_pred_mode[ puPartIdx ] + 1
对每个PU分割,位于本过程之后的是去块效应滤波之前的变换解码过程和图像重建过程。
本过程的输入是:
– PU分割索引puPartIdx
– 6.2.1.1小节推导的帧内预测模式IntraPredMode[ puPartIdx ]和
– 指示参考样点滤波的标志intra_luma_filt_flag
本过程的输出是索引为puPartIdx的PU分割的预测样点predPartL[ x, y ], 其中x = 0..PuPartWidth[ puPartIdx ],y = 0..PuPartHeight[ puPartIdx ]。
当前PU内索引为puPartIdx的PU分割的左上角样点位置是根据4.2.4.2节所定义的逆PU分割扫描过程得到的,这个过程的输入是puPartIdx,输出赋值给( xO, yO )。
令PuPartSize = max( PuPartWidth, PuPartHeight )。
去块效应滤波之前的PuPartSize*4 + 1个相邻重建亮度样点p[ x, y ]和pf[ x, y ]由以下方式得到,x = -1, y = -1..PuPartSize*2 - 1 还有x = 0..PuPartSize*2 - 1, y = -1:
– 亮度位置( xN, yN )规定如下:
xN = xO + x
yN = yO + y
– 调用4.3.5节所定义的相邻位置推导过程,输入是亮度位置( xN, yN ),输出是lcuAddrN和( xW, yW )。
– 如果lcuAddN可用,在覆盖亮度位置( xW, yW )的LCU块lcuAddN内的PU分割索引指定给partIdxN,否则,partIdxN标记为不可用。
– 每个样点p[ x, y ]由以下方式得到,其中x = -1, y = -1..PuPartSize*2 – 1,以及x = 0..PuPartSize*2 – 1, y = -1:
– 如果以下条件之一成立,样点p[ x, y ]被标记为“不可用于帧内预测”:
- lcuAddrN不可用
- partIdxN不可用
– 否则,样点p[ x, y ]标记为“可用于帧内预测”,并且p[ x, y ]的值等于地址为lcuAddrN的LCU内的( xW, yW )位置上的亮度样点。
当样点p[ x, -1 ], 其中x = PuPartSize..PuPartSize*2 – 1,标记为“不可用于帧内预测”,而样点p[ PuPartSize – 1, -1 ]标记为“可用于帧内预测”,那么样点p[ x, -1 ], 其中x = PuPartSize..PuPartSize*2 – 1得值使用p[ PuPartSize – 1, -1 ]的值替代,并且样点p[ x, -1 ], 其中x = PuPartSize..PuPartSize*2 – 1,标记为“可用于帧内预测”。
当样点p[-1, y], 其中y = PuPartSize..PuPartSize*2 – 1,标记为“不可用于帧内预测”,而样点p[ -1, PuPartSize – 1 ]标记为“可用于帧内预测”,那么样点p[ -1, y], 其中y = PuPartSize..PuPartSize*2 – 1得值使用p[ -1, PuPartSize – 1 ]的值替代,并且样点p[ -1, y ], 其中y = PuPartSize..PuPartSize*2 – 1,标记为“可用于帧内预测”。
对所有剩下标记为“不可用于帧内预测”的样点p[ x, y ],应用如下规则:
p[ x, y ] = 1 << ( ( BitDepthY + increased_bit_depth_luma ) – 1 )
当intra_luma_filt_flag == 1时,滤波后的相邻样点pf[ x, y ]构建方法如下,其中x = -1, y = -1..PuPartSize*2 – 1,x = 0..PuPartSize*2 - 1, y = -1:
pf[ -1, y ] = p[ -1, y ] y = 0 或 y=PuPartSize*2 – 1
pf[ -1, y ] = ( p[ -1, y + 1 ] + 2*p[ -1, y ] + p[ -1, y – 1 ] + 2 ) >> 2 否则
pf[ x, -1 ] = p[ x, -1 ] x = 0 或 x=PuPartSize*2 – 1
pf[ x, -1 ] = ( p[ x – 1, -1 ] + 2*p[ x, -1 ] + p[ x + 1, -1 ] + 2 ) >> 2 否则
pf[ -1, -1 ] = ( p[ -1, 0 ] + 2*p[ -1, -1 ] + p[ 0, -1 ] + 2 ) >> 2 x = 0 并且 y = 0
如果intra_luma_filt_flag == 0,滤波后的相邻样点值等于没有滤波的样点值:
pf[ x, y ] = p[ x, y ]
1.1.1.2.1 平面预测规范
当planar_flag == 1时使用这种帧内预测模式。预测样点predPartL[ x, y ]的值由以下公式推导,其中x, y = 0..PuPartSize – 1:
predPartL[ x, y ] = ((PuPartSize – (y+1))*TR(x) + (y+1)*BR(x) + (PuPartSize – (x+1))*LC(y) + (x+1)*RC(y) + PuPartSize)/(PuPartSize*2)
其中,TR像素数组的值推导如下:
– 如果样点p[ x, -1 ]标记为“可用于帧内预测”,x = 0..PuPartSize – 1
TR(i) = p[i,-1 ] with i = 0..PuPartSize - 1
– 否则,如果样点p[-1, y ]标记为“可用于帧内预测”,y = 0..PuPartSize – 1
TR(i) = ((PuPartSize – (i+1))*M(-1,0) + (i+1)*BRS + (PuPartSize>>1))/PuPartSize with i = 0..PuPartSize - 1
– 否则:
TR(i) = 128 with i = 0..PuPartSize - 1
其中,LC像素数组的值推导如下:
– 如果样点p[-1, y ]标记为“可用于帧内预测”,y = 0..PuPartSize – 1
LC(i) = p[ -1, i ] with i = 0..PuPartSize – 1
– 否则,如果样点p[ x, -1 ]标记为“可用于帧内预测”,x = 0..PuPartSize – 1
LC(j) = ((PuPartSize – (j+1))*M(0,-1) + (j+1)*BRS + (PuPartSize>>1))/PuPartSize
– 否则:
LC(i) = 128 with i = 0..PuPartSize - 1
其中,BR像素数组的值推导如下:
BR(i) = ((PuPartSize – (i+1)*LC[ PuPartSize-1 ] + (i+1)*BRS + (PuPartSize>>1))/PuPartSize with i = 0..PuPartSize - 1
其中,RC像素数组的值推导如下:
RC(i) = ((PuPartSize – (i+1))*TR[ PuPartSize-1 ] + (i+1)*BRS + (PuPartSize>>1))/PuPartSize 其中,i = 0..PuPartSize
其中,BRS的值推导如下:
BRS = DC + planar_delta_y
DC的计算与6.2.1.2.2.2节规定的DC预测中得到DC值的计算相同。
对planar_flag == 0的PU,使用帧内角度预测模式还是DC预测模式依赖于IntraPredMode[ puPartIdx ]的值。
1.1.1.2.2.1 帧内角度预测模式规范
当IntraPredType[ puPartIdx ]不等于Intra_DC时调用此预测模式。
令intraPredType等于IntraPredType[ puPartIdx ]。变量intraPredAngle作为IntraPredAngleID[ puPartIdx ]的函数,从下表格得到:
IntraPredAngleID[ puPartIdx ] | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
intraPredAngle | -32 | -26 | -21 | -17 | -13 | -9 | -5 | -2 | 0 | 2 | 5 | 9 | 13 | 17 | 21 | 26 | 32 |
预测样点predPartL[ x, y ]的值由以下程序推导,其中,x, y = 0..PuPartSize – 1:
- For k=0..(PuPartSize – 1)
deltaInt = ((k+1)* intraPredAngle)/32
deltaFract = ((k+1)*abs(intraPredAngle))%32
if(intraPredAngle < 0)
deltaFract = (32 – deltaFract)%32
for l = 0..(PuPartSize – 1)
refMainInd = l+deltaInt+1
if(intraPredAngle >= 0)
if(deltaFract != 0)
p(k,l) = ((32-deltaFract)*refMain[refMainInd]+deltaFract*refMain[refMainInd+1]+16) >> 5
else
p(k,l) = refMain[refMainInd]
else
if(refMainInd >= 0)
p(k,l) = ((32-deltaFract)*refMain[refMainInd]+deltaFract*refMain[refMainInd+1]+16) >> 5
else
deltaIntSide = (32*32*(l+1)/abs(IntraPredAngle))>>5
deltaFractSide = (32*32*(l+1)/abs(IntraPredAngle))%32
refSideIndex = k+l-deltaIntSide
if(deltaFractSide)
p(k,l) = ((32-deltaFractSide)*refSide[refSideIndex]+
deltaFractSide*refSide[refSideIndex-1]+16) >> 5
else
p(k,l) = refSide[refSideIndex]
if(IntraPredType == Intra_Vertical)
predPartL[ x, y ] = p(k,l)
else
predPartL[ y, x ] = p(k,l)
end for
end for
其中,像素数组refMain和refSide如下指定:
– 如果intraPredType == Intra_Vertical
refMain[ x ] = p[ x, -1], 其中x = 0..PuPartSize – 1
refSide[ x ] = p[ -1, x], 其中 x = 0..PuPartSize – 1
– 否则
refMain[ x ] = p[ -1, x ], with x = 0..PuPartSize – 1
refSide[ x ] = p[ x, -1 ], with x = 0..PuPartSize – 1
1.1.1.2.2.2 Intra_DC预测模式规范
当IntraPredType[ puPartIdx ]等于Intra_DC时调用此预测模式。
依赖于变量edge_based_prediction_flag,应用如下方式:
– 如果edge_based_prediction_flag等于0,调用6.2.1.2.2.2.2节规定的DC预测模式过程。
– 如果edge_based_prediction_flag等于1,调用6.2.1.2.2.2.1节规定的边缘检测过程:
– 如果边缘检测过程输出值edge_detected等于0,调用6.2.1.2.2.2.2节规定的DC预测模式过程。
– 如果边缘检测过程输出值edge_detected等于1,调用6.2.1.2.2.2.3节规定的基于边缘的预测过程。
1.1.1.2.2.2.1 边缘检测过程规范
边缘检测过程使用Sobel操作子处理已解码的亮度样点。当IntraPredMode[ puPartIdx ]等于Intra_DC并且edge_based_prediction_flag等于1时调用本过程。
本过程的输入是:
– PU分割索引puPartIdx。
– threshold_edge的值。
本过程的输出是:
– edge_detected的值,依赖于下面所描述的对已重建像素进行Sobel操作的结果。
– 如果edge_detected的值等于1,如下所描述的检测边缘的水平与垂直方向的坐标dir[i],i=0,1。
当前PU内索引为puPartIdx的PU分割的左上角样点位置是根据4.2.4.2节所定义的逆PU分割扫描过程得到的,这个过程的输入是puPartIdx,输出赋值给( xOE, yOE )。
令PuPartSize等于max( PuPartWidth, PuPartHeight )。
去块效应滤波过程之前的16*PuPartSize + 16个相邻解码亮度样点pE[ x, y ]的推导如下,其中,x = -4..-1, y = -4..PuPartSize*2 - 1,x = 0..PuPartSize*2 - 1, y = -4..-1:
– 亮度位置( xNE, yNE )规定如下:
xNE = xOE + x
yNE = yOE + y
– 调用4.3.5节所定义的相邻位置推导过程,输入是亮度位置( xNE, yNE ),输出是lcuAddrNE和( xWE, yWE )。
– 如果lcuAddNE可用,在覆盖亮度位置( xWE, yWE )的LCU块lcuAddNE内的PU分割索引指定给partIdxNE,否则,partIdxNE标记为不可用。
– 每个样点pE [ x, y ]由以下方式得到,其中x = -4..-1, y = -4..PuPartSize*2 – 1,以及x = 0..PuPartSize*2 – 1, y = -4..-1:
– 如果以下条件之一成立,样点pE [ x, y ]被标记为“不可用于帧内预测”:
- lcuAddrNE不可用
- partIdxNE不可用
– 否则,样点pE [ x, y ]标记为“可用于帧内预测”,并且pE [ x, y ]的值等于地址为lcuAddrNE的LCU内的( xWE, yWE )位置上的亮度样点。
– 对每个被标记为“可用于帧内预测”的样点pE[ x, y ],其中x = -4..-1, y = -4..PuPartSize*2 – 1及x = 0..PuPartSize*2 – 1, y = -4..-1,使用如下方式推导:
pE[ x, y ] = ( pE[ x, y ] + ( 1 << (increased_bit_depth_luma – 1 ) ) ) >> increased_bit_depth_luma
令norm_max为初始值为0 的整数。
对x = -3, -2,y = -3..2*PuPartSize-2, 及x = -1..2*PuPartSize-2,y = -3,-2:
– 如果样点pE[x,y], pE[x-1,y-1], pE[x-1,y], pE[x-1,y+1], pE[x,y-1], pE[x,y+1], pE[x+1,y-1], pE[x+1,y]及pE[x+1,y+1]被标记为“可用于帧内预测”,gradX和gradY的值计算如下:
gradX = – pE[x-1,y-1] – 2 * pE[x-1,y] – pE[x-1,y+1] + pE[x+1,y-1] + 2 * pE[x+1,y] + pE[x+1,y+1]
gradY = – pE[x-1,y-1] – 2 * pE[x,y-1] – pE[x+1,y-1] + pE[x-1,y+1] + 2 * pE[x,y+1] + pE[x+1,y+1]
– 如果|gradX|²+|gradY|² > norm_max,以gradX, gradY, x, y, PuPartWidth和PuPartHeight的值作为输入,调用下面描述的边缘推导过程。
– 如果调用了边缘推导过程并且输出值cross_block等于1,那么gradY的值赋给dir[0],gradX值赋给dir[1],|gradX|²+|gradY|²的结果赋给norm_max。
如果norm_max的最终值大于等于(threshold_edge << 8),edge_detected设为1。否则,edge_detected的值设为0,并且dir[0]和dir[1]的值都设为0.
边缘推导过程
此过程的输入为:
– 梯度值gradX和gradY
– 值x和y.
– 分割单元的宽度和高度PuPartWidth, PuPartHeight
此过程的输出是cross_block。
cross_block初始化为0。
如果gradX的值为负:
gradX = – gradX
gradY = – gradY
如果gradX的值不等于0,计算and的值:
如果并且,cross_block的值设为1。
如果并且, cross_block的值设为1。
如果gradY的值为正:
gradX = – gradX
gradY = – gradY
如果gradY的值不等于0,计算and的值:
如果并且,cross_block的值设为1.
如果并且,cross_block的值设为1.
1.1.1.2.2.2.2 DC预测模式规范
满足如下条件时调用本过程:
– 当IntraPredMode[ puPartIdx ]等于Intra_DC,或
– 当edge_based_prediction_flag等于1,或edge_based_prediction_flag等于0而且6.2.1.2.2.2.1节描述的边缘检测过程的输出值edge_detected等于0.
预测样点predPartL[ x, y ]的值推导如下,其中,x, y = 0..PuPartSize – 1:
– 如果所有的样点p[ x, -1 ],x = 0..PuPartSize-1,和p[ -1, y ],y = 0..PuPartSize-1,被标记为“可用于帧内预测”,预测样点predPartL[ x, y ]的值推导如下,其中x, y = 0..PuPartSize-1:
predPartL[ x, y ] = >> (k+1), 其中,x, y = 0..PuPartSize – 1,2k = PuPartSize
– 否则,如果任何样点p[ x, -1 ], x = 0..PuPartSize-1,被标记为“不可用于帧内预测”,并且所有的样点p[ -1, y ], y = 0..PuPartSize-1,被标记为“可用于帧内预测”,预测样点predPartL[ x, y ]的值推导如下,其中x, y = 0..PuPartSize-1:
predPartL[ x, y ] = >> k, 其中, x, y = 0..PuPartSize – 1,2k = PuPartSize
– 否则,如果所有的样点p[ x, -1 ],x = 0..PuPartSize-1,被标记为“可用于帧内预测”,而且任何样点p[ -1, y ], y = 0..PuPartSize-1,被标记为“不可用于帧内预测”,预测样点predPartL[ x, y ]的值推导如下,其中x, y = 0..PuPartSize-1:
predPartL[ x, y ] = >> k, 其中 x, y = 0..PuPartSize – 1,2k = PuPartSize
– 否则,预测样点predPartL[ x, y ]的值推导如下,其中x, y = 0..PuPartSize-1:
predPartL[ x, y ] = 1 << ( ( BitDepthY + increased_bit_depth_luma ) – 1 )
1.1.1.2.2.2.3 基于边缘的预测模式规范
当IntraPredMode[ puPartIdx ]等于Intra_DC,edge_based_prediction_flag等于1,并且6.2.1.2.2.2.1节描述的边缘检测过程输出值edge_detected等于1时调用本过程。
本过程的输入是:
– PU分割索引puPartIdx。
– 6.2.1.2.2.2.1节规定的边缘检测过程计算的dir[0]和dir[1]值。
本过程的输出是索引为puPartIdx的PU分割的预测样点predPartL[ x, y ], 其中x = 0..PuPartWidth[ puPartIdx ],y = 0..PuPartHeight[ puPartIdx ]。
当前PU内索引为puPartIdx的PU分割的左上角样点位置是根据4.2.4.2节所定义的逆PU分割扫描过程得到的,这个过程的输入是puPartIdx,输出赋值给( xOEP, yOEP )。
令PuPartSize = max( PuPartWidth, PuPartHeight )。
去块效应滤波之前的PuPartSize*4 + 1个相邻重建样点pEP [ x, y ]由以下方式得到,x = -1, y = -1..PuPartSize*2 - 1 及x = 0..PuPartSize*2 - 1, y = -1:
– 亮度位置( xNEP, yNEP )规定如下:
xNEP = xOEP + x
yNEP = yOEP + y
– 调用4.3.5节所定义的相邻位置推导过程,输入是亮度位置( xNEP, yNEP ),输出是lcuAddrNEP和( xWEP, yWEP )。
– 如果lcuAddNEP可用,在覆盖亮度位置( xWEP, yWEP )的LCU块lcuAddN内的PU分割索引指定给partIdxNEP,否则,partIdxNEP标记为不可用。
– 每个样点pEP [ x, y ]由以下方式得到,其中x = -1, y = -1..PuPartSize*2 – 1,以及x = 0..PuPartSize*2 – 1, y = -1:
– 如果以下条件之一成立,样点pEP [ x, y ]被标记为“不可用于帧内预测”:
lcuAddrNEP不可用
partIdxNEP不可用
– 否则,样点pEP [ x, y ]标记为“可用于帧内预测”,并且pEP [ x, y ]的值等于地址为lcuAddrNEP的LCU内的( xWEP, yWEP )位置上的亮度样点。
预测样点predPartL[ x, y ]值通过周围样点的线性内插得到,周围样点使用dir[0]和dir[1]值定义的预测方向。计算如下:
– 如果dir[0]的值不等于0,并且至少一个样点pEP[z,-1],z=-1..2*PuPartSize-1,被标记为“可用于帧内预测”, 值推导如下:
计算下面四个值:
如果=0
如果不等于0
如果和都被标记为“可用于帧内预测”,那么predup[x,y]标记为“计算过的”,推导如下(图1举例):
否则,predup[x,y]标记为“没有计算过”。
图1帧内编码的基于边缘预测
– 如果dir[1]的值不等于0,并且至少一个样点pEP[-1,z],z=-1..2*PuPartSize-1,被标记为“可用于帧内预测”,值推导如下:
计算下面四个值:
如果等于0
如果不等于0
如果和都被标记为“可用于帧内预测”,那么predleft [x,y]标记为“计算过的”,推导如下:
否则,predleft [x,y]标记为“没有计算过”。
– 如果predup[x,y]和predleft[x,y]都标记为“计算过的”,预测样点predPartL[ x, y ]推导如下:
predPartL[ x, y ] = ( predup[x,y] + predleft[x,y] ) >> 1
– 如果predup[x,y]标记为“计算过的”,而predleft[x,y]标记为“没有计算过”,预测样点predPartL[ x, y ]推导如下:
predPartL[ x, y ] = predup[x,y]
– 如果predleft [x,y]标记为“计算过的”,而predup [x,y]标记为“没有计算过”,预测样点predPartL[ x, y ]推导如下:
predPartL[ x, y ] = predleft[x,y]
如果predup[x,y]和predleft[x,y]都标记为“没有计算过”,预测样点predPartL[ x, y ]推导如下:
如果x = 0, y = 0,并且 pEP[-1,-1]标记为“可用于帧内预测”
如果x = 0, y = 0,pEP[-1,-1]标记为“不可用于帧内预测”,并且pEP[0,-1]标记为“可用于帧内预测”
如果x = 0, y = 0,pEP[-1,-1]标记为“不可用于帧内预测”,并且pEP[-1,0]标记为“可用于帧内预测”
predPartL[ x, y ] = predPartL[ x, y-1 ] 如果 x = 0
predPartL[ x, y ] = predPartL[ x-1, y ] 如果 y = 0
predPartL[ x, y ] = ( 2*predPartL[ x-1, y-1 ] + predPartL[ x, y-1 ] + predPartL[ x-1, y ] ) >> 2对其它所有情况