参考文档JCTVC-B205_draft007.doc
/*由于直接从word文档拷贝,各标题序号有误,所有标号为1.1....的应为6.3....。*/
1.1 帧间预测过程
当解码PredMode不等于MODE_INTRA的PU时调用本过程。
本过程的输出是当前PU的帧间预测样点,包含一个(PuSize)x(PuSize)亮度阵列predL和2个(PuSizeC)x(PuSizeC)色度样点阵列predCb and predCr(当ChromaArrayType不等于0时),色度分量分别为Cb和Cr。
PU分割模式由PartMode指定。每个PU分割由puPartIdx标示。
对每个PU分割,有如下规定:
函数PuPartWidth( ), PuPartHeight( )给出PU分割的宽度和高度,定义见表5‑14。
PU分割索引puPartIdx取值范围为0..NumPuParts – 1。
- 如果PredMode不等于MODE_SKIP或MODE_DIRECT,puPartWidth和puPartHeight由下式得到:
puPartWidth = PuPartWidth( puPartIdx )
puPartHeight = PuPartHeight( puPartIdx )
- 否则(PredMode等于MODE_SKIP或MODE_DIRECT)puPartIdx设为0,PartMode设为PART_2Nx2N,puPartWidth和puPartHeight有下式得到:
puPartWidth = PuPartWidth( 0 )
puPartHeight = PuPartHeight( 0 )
当ChromaArrayType不等于0是,变量puPartWidthC和puPartHeightC由下式得到:
puPartWidthC = puPartWidth / SubWidthC
puPartHeightC = puPartHeight / SubHeightC
6.3.1节所定义的过程调用之前,变量MvCnt初始化为0.
PU分割puPartIdx的帧间预测过程依次包含下列步骤:
1. 运动矢量分量和参考索引的推导过程在6.3.1中定义。
该过程的输入是PU分割索引puPartIdx。
输出是:
– 亮度运动矢量mvL0和mvL1,以及当ChromaArrayType不等于0时,色度运动矢量mvCL0和mvCL1.
– 参考索引refIdxL0和refIdxL1
– 预测列表使用标志predFlagL0和predFlagL1
– PU分割运动矢量个数subMvCnt
2. 变量MvCnt以subMvCnt为步长递增。
3. PBIC矢量分量的推导过程在6.3.3节定义。
该过程的输入是:
– PU分割索引puPartIdx
– 参考索引refIdxL0和refIdxL1
– 预测列表使用标志predFlagL0和predFlagL1
输出是PBIC矢量ic。
4. 6.3.2节定义帧间预测样点的解码过程。
该过程的输入是:
– PU分割索引puPartIdx
– 规定亮度和色度(如果可用)分割宽度和高度的变量partWidth, partHeight, partWidthC (如果可用),和partHeightC (如果可用)。
– 亮度运动矢量mvL0和mvL1,以及当ChromaArrayType不等于0时,色度运动矢量mvCL0和mvCL1。
– PBIC矢量ic
– 参考索引refIdxL0和refIdxL1
– 预测列表使用标志predFlagL0和predFlagL1
输出是:
– 帧间预测样点(pred):它是预测得到的一个亮度样点(puPartWidth)x(puPartHeight)阵列predPartL,以及当ChromaArrayType不等于0时预测得到的2个色度样点(puPartWidthC)x(puPartHeightC)阵列predPartCr和predPartCb,每个色度分量Cb和Cr对应一个。
为便于在后期解码时的变量推导过程中使用,部分变量赋值如下:
MvL0[ puPartIdx] = mvL0
MvL1[ puPartIdx] = mvL1
RefIdxL0[ puPartIdx] = refIdxL0
RefIdxL1[ puPartIdx] = refIdxL1
PredFlagL0[ puPartIdx] = predFlagL0
PredFlagL1[ puPartIdx] = predFlagL1
PU分割中左上角样点与所处PU左上角样点之间相对位置,可以通过调用4.2.4.2节中定义的反向PU分割扫描过程得到,puPartIdx作为输入,输出是( xP, yP )。
PU预测可以通过将PU分割的预测样点位置放置在PU中的适当位置上来构造,如下:
变量predL[ xP + x, yP + y ]按下式得到,其中x = 0..puPartWidth − 1, y = 0..puPartHeight − 1
predL[ xP + x, yP + y ] = predPartL[ x, y ]
当ChromaArrayType不等于0时,变量predC按下式得到,其中,x = 0.. puPartWidthC − 1, y = 0.. puPartHeightC − 1,predC和predPartC中的C分别换成Cb或Cr。
predC[ xP / SubWidthC + x, yP / SubHeightC + y ] = predPartC[ x, y ]
1.1.1 运动矢量分量和参考索引的推导过程
本过程的输入是预测分割索引puPartIdx
输出是:
- 亮度运动矢量mvL0和mvL1,以及当ChromaArrayType不等于0时,色度运动矢量mvCL0和mvCL1,
- 参考索引refIdxL0和refIdxL1,
- 预测列表使用标志predFlagL0和predFlagL1
- 表示运动矢量个数的变量subMvCnt。
变量mvL0和mvL1以及refIdxL0和refIdxL1的推导过程如下:
- 如果PredMode等于MODE_SKIP或MODE_DIRECT,并且slice_type等于P,则调用6.3.1.1节定义的在P条带中skipped和direct PU的亮度运动矢量的导出过程,该过程的输出为亮度运动矢量mvL0和参考索引refIdxL0,且predFlagL0设置为1。mvL1和refIdxL1标记为不可用,且predFlagL1设为0.运动矢量个数变量subMvCnt设为1.
- 否则,如果PredMode等于MODE_SKIP或MODE_DIRECT,并且slice_type等于B,则调用6.3.1.2节定义的在B条带中skipped和direct PU的亮度运动矢量的导出过程, 该过程的输出为亮度运动矢量mvL0,mvL1,参考索引refIdxL0,refIdxL0, subMvCnt,predFlagL0和predFlagL1。
- 否则,如果merge_flag等于1,调用6.3.1.3节定义的merge_flag等于1的亮度运动矢量推导过程,该过程以puPartIdx作为输入,输出是亮度运动矢量mvL0,mvL1,参考索引refIdxL0,refIdxL0, subMvCnt,predFlagL0和predFlagL1。
- 否则,对于变量predFlagLX、mvLX、refIdxLX和Pred_LX,以及语法元素ref_idx_lX和mvd_lX(其中的X可以用0或1替换),应用下列规则:
1. 变量refIdxLX和predFlagLX推导如下:
- 如果inter_pred_idc[ puPartIdx ]等于Pred_LX或等于Pred_BI:
refIdxLX = ref_idx_lX[ puPartIdx ]
predFlagLX = 1
- 否则,变量refIdxLX和predFlagLX推导如下:
refIdxLX = −1
predFlagLX = 0
2. 变量subMvCnt设为predFlagL0 + predFlagL1。
3. 变量mvresLX推导如下:
mvresLX[ 0 ] = mvres_lX[ puPartIdx ][ 0 ]
mvresLX[ 1 ] = mvres_lX[ puPartIdx ][ 1 ]
4. 变量mvdLX推导如下:
mvdLX[ 0 ] = mvd_lX[ puPartIdx ][ 0 ]
mvdLX[ 1 ] = mvd_lX[ puPartIdx ][ 1 ]
5. 当predFlagLX等于1时,变量mvpLX推导如下:
- 调用6.3.1.3节定义的亮度运动矢量预测的推导过程,puPartIdx, refIdxLX和mvdLX作为输入,输出是mvpLX。
6. 当predFlagLX等于1时,亮度运动矢量的水平分量推导如下:
– 如果mvresLX[ 0 ]等于1,mvLX[ 0 ] = Round(mvpLX[ 0 ]) + mvdLX[ 0 ]*2
– 否则mvLX[ 0 ] = mvpLX[ 0 ] + mvdLX[ 0 ]
7. 当predFlagLX等于1时,亮度运动矢量的垂直分量推导如下:
– 如果mvresLX[ 1 ]等于1,mvLX[ 1 ] = Round(mvpLX[ 1 ]) + mvdLX[ 1 ]*2
– 否则mvLX[ 1 ] = mvpLX[ 1 ] + mvdLX[ 1 ]
其中,Round( x ) = Sign( x ) * Floor( Abs( x ) + 0.5 ).
当ChromaArrayType不等于0,且predFlagLX(X为0或1)等于1时,色度运动矢量的推导过程在-节给出,mvLX和refIdxLX作为输入,输出为mvCLX。
1.1.1.1 P条带中skipped和direct预测单元的亮度运动矢量推导过程
当PredMode等于MODE_SKIP或MODE_DIRECT且slice_type等于P时,调用本过程。
本过程的输出是运动矢量mvL0和参考索引refIdxL0.
skipped和direct预测单元的参考索引refIdxL0按下式推导:
refIdxL0 = 0.
P条带中模式为MODE_SKIP或MODE_DIRECT的运动矢量mvL0的推导:调用6.3.1.3节定义的过程,其中puPartIdx设为0,listSuffixFlag设为0,mvdLX的两个分量设为0,作为输入,输出赋值给mvpLX。因为预测运动矢量等于实际的运动矢量,故输出直接赋给mvL0。
1.1.1.2 B条带中skipped和direct预测单元的亮度运动矢量推导过程
当PredMode等于MODE_SKIP或MODE_DIRECT且slice_type等于B时,调用本过程。
本过程的输出是参考索引refIdxL0, refIdxL1,运动矢量mvL0,mvL1,运动矢量计数变量subMvCnt,还有预测列表使用标志predFlagL0和predFlagL1。
对于变量predFlagLX、mvLX、refIdxLX和Pred_LX,以及语法元素ref_idx_lX和mvd_lX(其中的X可以用0或1替换),应用下列规则:
变量refIdxLX和predFlagLX推导如下:
- 如果inter_pred_idc[ puPartIdx ]等于Pred_LX或等于Pred_BI:
refIdxLX = 0
predFlagLX = 1
- 否则,变量refIdxLX和predFlagLX推导如下:
refIdxLX = −1
predFlagLX = 0
变量subMvCnt设置为等于predFlagL0 + predFlagL1。
当predFlagLX等于1时,调用6.3.1.3节定义的矩形分割亮度运动矢量预测的推导过程,其中puPartIdx, refIdxLX,mvdLX的两个分量都设为0,作为输入,输出为mvpLX。因为预测运动矢量等于实际的运动矢量,故输出直接赋给mvLX。
1.1.1.3 merge_flag等于1的亮度运动矢量推导过程
当前分割的merge_flag等于1时调用本过程。
本过程的输入是预测分割索引puPartIdx。
输出是:
– 亮度运动矢量mvL0和mvL1,
– 参考索引refIdxL0和refIdxL1,
– 预测列表使用标志predFlagL0和predFlagL1
– 运动矢量计数变量subMvCnt。
运动矢量mvLXA和mvLXB,参考索引refIdxLXA和refIdxLXB,预测列表使用标志predFlagLXA和predFlagLXB(X为0和1)的推导按照以下顺序步骤:
1. 调用4.3.4.4节定义的相邻分割的推导过程,输入是lcuAddr, puIdx和puPartIdx,输出赋值给lcuAddrN, puIdxN和puPartIdxN,N用A和B代替。
2. 依赖于分割lcuAddrN/puIdxN/puPartIdxN(N为A和B),推导如下:
– 如果分割lcuAddrN/puIdxN/puPartIdxN不可用,predFlagL0N和predFlagL1N设置为0.
– 否则,predFlagL0N, predFlagL1N, mvL0N, mvL1N, refIdxL0N和refIdxL1N分别设置为等于分割lcuAddrN/puIdxN/puPartIdxN的变量predFlagL0, predFlagL1, mvL0, mvL1, refIdxL0和refIdxL1。
变量mergeLeft推导如下:
– 如果predFlagL0B等于0并且predFlagL1B等于0,或merge_left_flag等于1,mergeLeft设置为1.
– 否则,mergeLeft设置为0.
依赖于mergeLeft,推导如下:
– 如果mergeLeft等于1,predFlagL0, predFlagL1, mvL0, mvL1, refIdxL0, refIdxL1分别设置为等于predFlagL0B, predFlagL1B, mvL0B, mvL1B, refIdxL0B, refIdxL1B。
– 否则,predFlagL0, predFlagL1, mvL0, mvL1, refIdxL0, refIdxL1分别设置为等于predFlagL0A, predFlagL1A, mvL0A, mvL1A, refIdxL0A, refIdxL1A。
变量subMvCnt设置为predFlagL0 + predFlagL1。
1.1.1.4 亮度运动矢量预测值的推导过程
本过程的输入是:
- PU分割索引puPartIdx,
- 当前PU分割参考索引refIdxLX(X等于0或1),
- 运动矢量差值mvdLX
输出为运动矢量mvLX的预测值mvpLX(X为0或1)。
依赖于值interleaved_motion_vector_predictor_flag:
– 如果interleaved_motion_vector_predictor_flag等于0:
– 如果mv_competition_flag等于1,调用6.3.1.4.1节定义的显式亮度矢量预测推导过程,puPartIdx, refIdxLX和mvdLX作为输入,输出是mvpLX。
– 否则(mv_competition_flag等于0),调用6.3.1.4.6节定义的隐式亮度矢量预测推导过程,puPartIdx, refIdxLX作为输入,输出是mvpLX。
– 否则(interleaved_motion_vector_predictor_flag等于1):
– 如果mv_competition_flag等于1,调用6.3.1.4.7节定义的显式亮度矢量预测推导过程,puPartIdx, refIdxLX和mvdLX作为输入,输出是mvpLX。
– 否则(mv_competition_flag等于0),调用6.3.1.4.6节定义的隐式亮度矢量预测推导过程,puPartIdx, refIdxLX作为输入,输出是mvpLX。并且,调用6.3.1.4.9节计算mvpLX的水平分量,输入为mvpLX的垂直分量,mvdLX的垂直分量,输出为mvpLX的水平分量。
1.1.1.4.1 显式亮度运动矢量预测推导过程
该过程的输入是:
- PU分割索引puPartIdx
- 当前PU分割参考索引refIdxLX(X等于0或1)
- 运动矢量差值mvdLX
本过程的输出是运动矢量mvLX的预测值mvpLX(X等于0或1)。
运动矢量预测值mvpLX按如下顺序步骤推导:
1. 调用6.3.1.4.2节定义的从相邻PU分割得到运动矢量预测候选的推导过程,输入是puPartIdx, refIdxLX (X等于0或1),输出是:可用性标志availableFlagLXN和运动矢量mvLXN(N用A,B和C代替)。
2. 调用6.3.1.4.3节定义的中值运动矢量预测的推导过程,运动矢量mvLXN和可用性标志availableFlagLXN(N用A,B和C代替)作为输入,输出赋值给中值运动矢量预测值mvLXMed。
3. 运动矢量预测列表mvpListLX由按如下给出的顺序构建:
- mvLXMed,可用运动矢量的中值运动矢量
- mvLXA
- mvLXB
- mvLXC
4. 如果mv_competition_temporal_flag等于1,调用6.3.1.4.4节描述的时域亮度运动矢量预测的推导过程,puPartIdx, refIdxLX (X为0和1,refIdxLX分别为refIdxL0或refIdxL1)作为输入,输出为可用性标志availableFlagLXCol和时域运动矢量预测值mvLXCol。如果availableFlagLXCol等于1,mvLXCol插入到mvpListLX的结尾。
5. 如果以下条件之一为真,mvLXMed与mvLXN交换在mvpListLX中的顺序,mvLXN推导如下:
- 如果PartMode是值PART_2NxN, PART_2NxnU和PART_2NxnD中的一个:
mvLXN = mvLXB puPartIdx等于0时
mvLXN = mvLXA 否则
- 否则,PartMode是值PART_Nx2N, PART_nLx2N和PART_nRx2N中的一个:
mvLXN = mvLXA f puPartIdx等于0时
mvLXN = mvLXC 否则
6. 如果有几个运动矢量具有相同的值,除了mvpListLX中有最小顺序值的运动矢量,其它的都从列表中移除。
7. 如果mvpListLX 中NumMVPCand( LX, puPartIdx )的个数大于1,调用6.3.1.4.5节描述的移除过程,输入是mvpListLX和mvdLX,输出是修改后的mvpListLX。
8. 如果mvpListLX 中NumMVPCand( LX, puPartIdx )的个数等于1,mvp_idx_lX设为0.
9. 运动矢量mvListLX[ mvp_idx_lX ]赋给mvpLX。
1.1.1.4.2 相邻分割块运动矢量候选的推导过程
本过程的输入是:
- PU分割索引puPartIdx,
- 当前PU分割参考索引refIdxLX(X等于0或1)
本过程的输出是(N用A,B和C代替):
- 相邻分割的运动矢量mvLXN
- 相邻分割的可用性标志availableFlagLXN。
图6‑1 相邻空间运动矢量
运动矢量mvLXA及其可用性标志availableFlagLXA按如下顺序步骤推导:
1. 令含有nA个样点位置(xAk, yAk)的集合,k = 0..nA-1,表示相对于PU左上角的分割。样点位置 (xAk, yAk)的集合代表紧靠左边分割边缘左侧的样点位置,这些左边分割垂直方向上以SuSize偏移。nA设为puPartHeight / SuSize。
2. 可用性标志availableFlagLXA初始化为0,mvLXA的两个分量设置为0.
3. 对(xAk, yAk),从(xA0, yA0)到(xAnN-1, yAnN-1),其中,xAk+1 = xAk,yAk+1 = yAk + SuSize,应用如下步骤直到availableFlagLXA等于1:
- 调用4.3.5节定义的相邻位置的推导过程,输入是(xAk, yAk),输出赋值给lcuAddrA和(xW, yW)。
- 如果lcuAddrA可用:
- 在地址为lcuAddrA的LCU内覆盖亮度位置(xW, yW)的PU索引和分割索引赋给puIdxA和puPartIdxA。
- 如果PU分割索引puPartIdxA可用,puIdxA的PredMode不为MODE_INTRA,puIdxA的predFlagLX等于1,并且puIdxA的参考索引refIdxLX等于当前分割puPartIdx的参考索引refIdX:
- availableFlagLXA设为1,并且运动矢量mvLXA设为已经赋给PU分割puPartIdxA的运动矢量mvLX。
运动矢量mvLXB及其可用性标志availableFlagLXB按如下顺序步骤推导:
1. 令含有nB个样点位置(xBk, yBk)的集合,k = 0.. nB-1,表示相对于PU左上角的分割。样点位置(xBk, yBk)的集合代表紧靠上边分割边缘顶侧的样点位置,这些左边分割垂直方向上以SuSize偏移。nB设为puPartWidth / SuSize。
2. 可用性标志availableFlagLXB初始化为0,mvLXB的两个分量设置为0.
3. 对(xBk, yBk),从(xB0, yB0)到(xBnN-1, yBnN-1),其中,xBk+1 = xBk + SuSize,yBk+1 = yBk,应用如下步骤直到availableFlagLXB等于1:
- 调用4.3.5节定义的相邻位置的推导过程,输入是(xBk, yBk),输出赋值给lcuAddrB和(xW, yW)。
- 如果lcuAddrB可用:
- 在地址为lcuAddrB的LCU内覆盖亮度位置(xW, yW)的PU索引和分割索引赋给puIdxB和puPartIdxB。
- 如果PU分割索引puPartIdxA可用,puIdxB的PredMode不为MODE_INTRA,puIdxB的predFlagLX等于1,并且puIdxB的参考索引refIdxLX等于当前分割puPartIdx的参考索引refIdX:
- availableFlagLXB设为1,并且运动矢量mvLXB设为已经赋给PU分割puPartIdxB的运动矢量mvLX。
运动矢量mvLXC按如下顺序步骤推导:
3. 调用4.3.4.4节定义的相邻分割的推导过程,输入是lcuAddr, puIdx和puPartIdx,输出赋值给lcuAddrN, puIdxN和puPartIdxN,其中,N用C, D或E代替。
4. mvLXC的两个分量设置为0.
5. 运动向量mvLXC推导如下:
- 如果PU分割puPartIdxC可用,puIdxC的PredMode不等于MODE_INTRA,puPartIdxC的predFlagLX等于1,并且puPartIdxC的refIdxLX等于当前分割puPartIdx的参考索引refIdX:
- availableFlagLXC设为1,并且mvLXC设为已经赋给分割puPartIdxC的运动矢量。
- 否则,如果PU分割puPartIdxD可用,puIdxD的PredMode不等于MODE_INTRA,puPartIdxD的predFlagLX等于1,并且puPartIdxD的refIdxLX等于当前分割puPartIdx的参考索引refIdX:
- availableFlagLXC设为1,并且mvLXC设为已经赋给分割puPartIdxD的运动矢量。
- 否则,如果PU分割puPartIdxE可用,puIdxE的PredMode不等于MODE_INTRA,puPartIdxE的predFlagLX等于1,并且puPartIdxE的refIdxLX等于当前分割puPartIdx的参考索引refIdX:
- availableFlagLXC设为1,并且mvLXC设为已经赋给分割puPartIdxE的运动矢量
1.1.1.4.3 中值亮度运动矢量预测值的推导过程
该过程的输入是:
- 相邻分割块的运动矢量mvLXN(N用A, B或C代替),
- 可用性标志availableFlagLXN
输出是运动矢量预测值mvpLXMed。
变量mvpLX的推导如下:
- 如果可以性标志availableFlagLXN等于0,mvLXMed的两个分量都设为0.
- 否则,如果availableFlagLXA, availableFlagLXB和availableFlagLXC中只有一个等于1,availableFlagLXN设为1,并且,运动矢量mvLXN赋给中值运动矢量mvpLXMed:
mvLXMed = mvLXN
- 否则,运动矢量预测的每个分量由运动矢量mvLXA, mvLXB和mvLXC的相应的矢量分量的中值给出:
mvLXMed [ 0 ] = Median( mvLXA[ 0 ], mvLXB[ 0 ], mvLXC[ 0 ] )
mvLXMed [ 1 ] = Median( mvLXA[ 1 ], mvLXB[ 1 ], mvLXC[ 1 ] )
1.1.1.4.4 时域亮度运动矢量预测的推导过程
本过程的输入是:
- PU分割索引puPartIdx,
- 当前PU分割参考索引refIdxLX(X为0或1)
输出是:
- 运动向量预测值mvLXCol,
- 可用性标志availableFlagLXCol
函数RefPicOrderCnt( pic, refidx, LX )由参考图像RefPicListX[ refidx ](X为0或1)的PicOrderCnt的值指定。参考图像的PicOrderCnt应该保持直到pic不被标记为“non-exisiting”。
依赖于slice_type和collocated_from_l0_flag的值,推导如下:
- 如果slice_type等于B,并且collocated_from_l0_flag等于1,mvLXCol推导如下:
– 变量colPic指示由RefPicList0[ 0 ]指定的包含共同位置分割的图像。
– 共同位置LCU地址lcuAddrCol,PU索引puIdxCol和PU分割索引puPartIdxCol如下:
lcuAddrCol = lcuAddr
puIdxCol = puIdx
puPartIdxCol = puPartIdx
– 如果预测单元puIdxCol使用帧内预测模式编码,mvLXCol的两个分量都设为0,并且availableFlagLXCol设为0.
– 否则(预测单元puIdxCol不是以帧内预测编码模式编码的),预测使用标志predFlagL1Col,运动矢量mvCol和参考索引refIdxCol分别设置为等于PU分割puPartIdxCol 的PredFlagL1[ puPartIdxCol ],MvL1[puPartIdxCol ]和RefIdxL1[ puPartidxCol ]。
– 如果predFlagL1Col等于0,mvLXCol的两个分量都设为0,并且availableFlagLXCol设为0.
– 否则(predFlagL1Col等于1),availableFlagLXCol设为1,mvLXCol推导如下:
– 如果PicOrderCnt( colPic ) – RefPicOrderCnt( colPic, refIdxCol, L1 ) 等于PicOrderCnt( currPic ) – RefPicOrderCnt( currPic, refIdxCol, LX ) ):
mvLXCol = mvCol
– 否则,mvLXCol使用运动矢量mvCol的缩放:
tx = ( 16384 + Abs( td / 2 ) ) / td
DistScaleFactor = Clip3( -1024, 1023, ( tb * tx + 32 ) >> 6 )
mvLXCol = ( DistScaleFactor * mvCol + 128 ) >> 8
td和tb推导如下:
td = Clip3( -128, 127, PicOrderCnt( colPic ) – RefPicOrderCnt( colPic, refIdxCol, L1 ) )
tb = Clip3( -128, 127, PicOrderCnt( currPic ) – RefPicOrderCnt( currPic, refIdxCol, LX ) )
- 否则,果slice_type等于B,并且collocated_from_l0_flag等于0,mvLXCol推导如下:
– 变量colPic指示由RefPicList0[ 0 ]指定的包含共同位置分割的图像。
– 共同位置LCU地址lcuAddrCol,PU索引puIdxCol和PU分割索引puPartIdxCol如下:
lcuAddrCol = lcuAddr
puIdxCol = puIdx
puPartIdxCol = puPartIdx
– 如果预测单元puIdxCol使用帧内预测模式编码,mvLXCol的两个分量都设为0,并且availableFlagLXCol设为0.
– 否则(预测单元puIdxCol不是以帧内预测编码模式编码的),预测使用标志predFlagL0Col,运动矢量mvCol和参考索引refIdxCol分别设置为等于PU分割puPartIdxCol 的PredFlagL0[ puPartIdxCol ],MvL0[puPartIdxCol ]和RefIdxL0[ puPartidxCol ]。
– 如果predFlagL0Col等于0,mvLXCol的两个分量都设为0,并且availableFlagLXCol设为0.
– 否则(predFlagL0Col等于1),availableFlagLXCol设为1,mvLXCol推导如下:
– 如果PicOrderCnt( colPic ) – RefPicOrderCnt( colPic, refIdxCol, L0 ) 等于PicOrderCnt( currPic ) – RefPicOrderCnt( currPic, refIdxCol, LX ) ):
mvLXCol = mvCol
– 否则,mvLXCol使用运动矢量mvCol的缩放:
tx = ( 16384 + Abs( td / 2 ) ) / td
DistScaleFactor = Clip3( -1024, 1023, ( tb * tx + 32 ) >> 6 )
mvLXCol = ( DistScaleFactor * mvCol + 128 ) >> 8
td和tb推导如下:
td = Clip3( -128, 127, PicOrderCnt( colPic ) – RefPicOrderCnt( colPic, refIdxCol, L0 ) )
tb = Clip3( -128, 127, PicOrderCnt( currPic ) – RefPicOrderCnt( currPic, refIdxCol, LX ) )
- 否则(slice_type等于P),mvLXCol推导如下:
– 变量colPic指示由RefPicList0[ 0 ]指定的包含共同位置分割的图像。
– 共同位置LCU地址lcuAddrCol,PU索引puIdxCol和PU分割索引puPartIdxCol如下:
lcuAddrCol = lcuAddr
puIdxCol = puIdx
puPartIdxCol = puPartIdx
– 如果预测单元puIdxCol使用帧内预测模式编码,mvLXCol的两个分量都设为0,并且availableFlagLXCol设为0.
– 否则(预测单元puIdxCol不是以帧内预测编码模式编码的),预测使用标志predFlagL0Col,运动矢量mvCol和参考索引refIdxCol分别设置为等于PU分割puPartIdxCol 的PredFlagL0[ puPartIdxCol ],MvL0[puPartIdxCol ]和RefIdxL0[ puPartidxCol ]。
– 如果predFlagL0Col等于0,mvLXCol的两个分量都设为0,并且availableFlagLXCol设为0.
– 否则(predFlagL0Col等于1),availableFlagLXCol设为1,mvLXCol推导如下:
– 如果PicOrderCnt( colPic ) – RefPicOrderCnt( colPic, refIdxCol, L0 ) 等于PicOrderCnt( currPic ) – RefPicOrderCnt( currPic, refIdxCol, LX ) ):
mvLXCol = mvCol
– 否则,mvLXCol使用运动矢量mvCol的缩放:
tx = ( 16 384 + Abs( td / 2 ) ) / td
DistScaleFactor = Clip3( -1024, 1023, ( tb * tx + 32 ) >> 6 )
mvLXCol = ( DistScaleFactor * mvCol + 128 ) >> 8
td和tb推导如下:
td = Clip3( -128, 127, PicOrderCnt( colPic ) – RefPicOrderCnt( colPic, refIdxCol, L0 ) )
tb = Clip3( -128, 127, PicOrderCnt( currPic ) – RefPicOrderCnt( currPic, refIdxCol, LX ) )
1.1.1.4.5 运动矢量预测的移除处理
本过程的输入是:
- 运动矢量预测列表mvpListLX
- 运动分辨率mvresLX
- 运动矢量差值mvdLX
.输出是修改后的mvpListLX。
运动矢量差值mvd的函数EstMvdBits( mvd )定义如下:
EstMvdBits( mvd ) = EstMvdCompBits( mvd [ 0 ] ) + EstMvdCompBits( mvd [ 1 ] )
上式中使用的mvd分量的函数EstMvdCompBits( mvd[ c ] ) 由变量estMvdCompBits定义,estMvdCompBits由以下伪代码推导:
estMvdCompBits = 1
uiTemp = ( mvd[ c ] <= 0 ) ? ( -mvd[ c ] << 1 ) + 1 : ( mvd[ c ] << 1 )
while ( 1 != uiTemp ) {
uiTemp >>= 1
estMvdCompBits += 2
}
变量currentEstMvdBits设置为EstMvdBits( mvdLX ).
对每个mvpListLX中的mvpCandidate:
- 如果mvresLX等于0,变量currentEstMvdBits设为EstMvdBits( mvdLX),并且对每个mvpListLX中的mvpCandidate:
- 变量mvCandidate推导如下:
mvCandidate[ 0 ] = Round(mvpCandidate[ 0 ])/2 + mvdLX[ 0 ]
mvCandidate[ 1 ] = Round(mvpCandidate[ 1 ])/2+ mvdLX[ 1 ]
- 对mvpListLX中除了mvpCandidate的每个运动矢量候选mvpOtherCandidate,变量mvdOtherCandidate推导如下:
mvdOtherCandidate [ 0 ] =( mvCandidate [ 0 ] - Round(mvpOtherCandidate [ 0 ])/2)
mvdOtherCandidate [ 1 ] = (mvCandidate [ 1 ] - Round(mvpOtherCandidate [ 1 ])/2)
- 如果mvpListX中任何一个EstMvdBits( mvdOtherCandidate)小于currentEstMvdBits,mvpCandidate从mvpListLX移除。
- 否则,变量currentEstMvdBits设置为EstMvdBits( mvdLX ),并且mvpListLX中的每个mvpCandidate:
- 变量mvCandidate推导如下:
mvCandidate[ 0 ] = mvpCandidate[ 0 ] + mvdLX[ 0 ]
mvCandidate[ 1 ] = mvpCandidate[ 1 ] + mvdLX[ 1 ]
- 对mvpListLX中除了mvpCandidate的每个运动矢量候选mvpOtherCandidate,变量mvdOtherCandidate推导如下:
mvdOtherCandidate [ 0 ] = mvCandidate [ 0 ] - mvpOtherCandidate [ 0 ]
mvdOtherCandidate [ 1 ] = mvCandidate [ 1 ] - mvpOtherCandidate [ 1 ]
- 如果mvpListX中任何一个EstMvdBits( mvdOtherCandidate)小于currentEstMvdBits,mvpCandidate从mvpListLX移除。
1.1.1.4.6 隐式亮度运动矢量预测推导过程
1.1.1.4.7 显式亮度运动矢量预测和交叉运动矢量预测
本过程的输入是:
- PU分割索引puPartIdx,
- 当前PU分割参考索引refIdxLX(X为0或1)
- 运动矢量差值mvdLX
本过程的输出是运动矢量mvLX的预测值mvpLX(X为0或1)。
运动矢量预测mvpLX按如下顺序步骤推导:
1. 调用6.3.4.4.5节定义的从相邻PU分割得到运动矢量预测候选的推导过程,输入是puPartIdx, refIdxLX (X等于0或1),输出是:可用性标志availableFlagLXN和运动矢量mvLXN(N用A,B和C代替)。
2. 调用6.3.4.4.6节定义的中值运动矢量预测的推导过程,运动矢量mvLXN和可用性标志availableFlagLXN(N用A,B和C代替)作为输入,输出赋值给中值运动矢量预测值mvLXMed。
3. 运动矢量预测列表mvpListLX由按如下给出的顺序构建:
- mvLXMed, median motion vector of available motion vectors可用运动矢量的中值运动矢量
- mvLXA
- mvLXB
- mvLXC
4. 如果mv_competition_temporal_flag等于1,调用6.3.4.4.7节描述的时域亮度运动矢量预测的推导过程,puPartIdx, refIdxLX (X为0和1,refIdxLX分别为refIdxL0或refIdxL1)作为输入,输出为可以性标志availableFlagLXCol和时域运动矢量预测值mvLXCol。如果availableFlagLXCol等于1,mvLXCol插入到mvpListLX的结尾。
5. 如果以下条件之一为真,mvLXMed与mvLXN交换在mvpListLX中的顺序,mvLXN推导如下:
- 如果PartMode是值PART_2NxN, PART_2NxnU和PART_2NxnD中的一个:
mvLXN = mvLXB for puPartIdx is equal to 0 puPartIdx等于0时
mvLXN = mvLXA otherwise
- 否则,PartMode是值PART_Nx2N, PART_nLx2N和PART_nRx2N中的一个:
mvLXN = mvLXA for puPartIdx is equal to 0 puPartIdx等于0时
mvLXN = mvLXC otherwise 否则
6. 当有几个运动矢量具有相同的值,除了mvpListLX中有最小顺序值的运动矢量,其它的都从列表中移除。
7. 当mvpListLX 中NumMVPCand( LX, puPartIdx )的个数大于1,调用6.3.1.4.8节描述的移除过程,输入是mvpListLX和mvdLX,输出是修改后的mvpListLX。
8. 如果mvpListLX 中NumMVPCand( LX, puPartIdx )的个数等于1,mvp_idx_lX设为0.
9. 调用6.3.1.4.9中mvpLX水平分量的计算过程,mvpLX的垂直分量,mvdLX的垂直分量作为输入,输出是mvpLX的水平分量。
10. 运动矢量mvListLX[ mvp_idx_lX ]赋给mvpLX。
1.1.1.4.8 运动矢量预测垂直分量的移除过程
本过程的输入是:
– 运动矢量预测列表mvpListLX
– 运动分辨率mvresLX
– 运动矢量差值mvdLX
输出是修改后的mvpListLX。
上式中使用的mvd分量的函数EstMvdCompBits( mvd[ c ] ) 由变量estMvdCompBits定义,estMvdCompBits由以下伪代码推导:
estMvdCompBits = 1
uiTemp = ( mvd[ c ] <= 0 ) ? ( -mvd[ c ] << 1 ) + 1 : ( mvd[ c ] << 1 )
while ( 1 != uiTemp ) {
uiTemp >>= 1
estMvdCompBits += 2
}
变量currentEstMvdVerBits设置为EstMvdCompBits (mvdLXver).
对每个mvpListLX中的垂直分量mvpCandidateVer:
– 如果mvresLX的垂直分量等于0,变量currentEstMvdVerBits设为EstMvdCompBits (vertical component of mvdLX),并且对每个mvpListLX中的mvpCandidate:
– 垂直分量变量mvCandidateVer推导如下:
mvCandidateVer [ 0 ] = Round(mvpCandidateVer [ 0 ])/2 + mvdLXver[ 0 ]
mvCandidateVer [ 1 ] = Round(mvpCandidateVer [ 1 ])/2+ mvdLXver[ 1 ]
– 对mvpListLX中除了mvCandidateVer的每个运动矢量候选mvpOtherCandidate的垂直分量,变量运动矢量差值的垂直分量mvdOtherCandidateVer推导如下:
mvdOtherCandidateVer [ 0 ] =( mvCandidateVer [ 0 ] - Round(mvpOtherCandidateVer [ 0 ])/2)
mvdOtherCandidateVer [ 1 ] = (mvCandidateVer [ 1 ] - Round(mvpOtherCandidateVer [ 1 ])/2)
– 当mvpListX中任何一个EstMvdCompBits (mvpOtherCandidateVer)小于currentEstMvdVerBits,mvpCandidateVer从mvpListLX移除。
– 否则,变量currentEstMvdVerBits设置为EstMvdCompBits (mvdLXver),并且mvpListLX中的每个mvpCandidateVer:
– 变量mvCandidateVer推导如下:
mvCandidateVer [ 0 ] = mvCandidateVer [ 0 ] + mvdLXver[ 0 ]
mvCandidateVer [ 1 ] = mvCandidateVer [ 1 ] + mvdLXver[ 1 ]
– 对mvpListLX中除了mvpCandidate的每个运动矢量候选垂直分量mvpOtherCandidateVer,变量mvpOtherCandidateVer推导如下:
mvpOtherCandidateVer [ 0 ] = mvCandidateVer [ 0 ] - mvpOtherCandidateVer [ 0 ]
mvpOtherCandidateVer [ 1 ] = mvCandidate Ver[ 1 ] - mvpOtherCandidateVer [ 1 ]
– 当mvpListX中任何一个EstMvdCompBits (mvpOtherCandidateVer)小于currentEstMvdVerBits,mvpCandidate从mvpListLX移除。
1.1.1.4.9 交叉运动矢量预测的推导过程
该过程的输入是:
– 运动矢量预测列表mvpLXver的垂直分量,
– 运动矢量差值mvdLXver的垂直分量。
输出是mvpLXhor的水平分量。
预测块左上角亮度样点相对于图像左上角亮度样点的位置定义为( x0, y0 )。预测块的宽度和高度分别为currW和currH。
给定垂直运动矢量分量预测mvpLX,当前运动矢量垂直运动矢量分量mvpLXver通过设置currMvVer为(mvpLXver + mvdLXver)重建。
1. 令setOfBlks为相邻预测块的集合,这些相邻预测块同当前块处于同一条带,按编码顺序处于当前块之前,并且包含以下位置处的任何亮度样点:
- ( x0 − 1, y ) with y = 0..currH
- ( x, y0 − 1 ) with x = −1..currW + 1
2. 运动矢量列表listMv推导如下:
对每个集合setOfBlks中的块blkX,mvX作为blkX的运动矢量,应用如下:
运动矢量mvX如以上描述缩放后插入列表listMv。
3. 令numMv为列表listMv的入口数。如果numMv等于0,水平运动矢量分量的预测mvpLXhor设为0;否则,mvpLXhor推导如下,其中,listMv[ k ] (k = 0..numMv − 1)代表列表listMv的第k个入口。
a. 变量compY初始化为listMv[ 0 ][ 1 ],变量minDelta设置为abs( listMv[ 0 ][ 1 ] − currMvVer ),其中abs( )为绝对值操作。
b. 对i从1到numMv − 1(包括边界):
当abs( listMv[ i ][ 1 ] − currMvVer )小于minDelta或abs( listMv[ i ][ 1 ] − currMvVer )等于minDelta并且listMv[ i ][ 1 ]小于compY,compY设置为listMv[ i ][ 1 ]。
c. 列表listMvCompX推导如下:
对i从1到numMv − 1(包括边界):如果listMv[ i ][ 1 ]等于compY,值listMv[ i ][ 0 ]插入到列表listMvCompX。
d. 令numCompX为列表listMvCompX的入口数,并令listMvCompX[ k ],k = 0..numCompX − 1,为列表的listMvCompX入口。依赖于numCompX,运动矢量预测的水平分量mvpLXhor推导如下:
- 如果numCompX等于1,mvpLXhor设置为listMvCompX[ 0 ]。
- 否则,如果numCompX等于2,mvpLXhor设置为( listMvCompX[ 0 ] + listMvCompX[ 1 ] + 1 ) >> 1。
- 否则(numCompX大于2),列表listMvCompX的入口以升序排列,并且mvpLXhor设置为listMvCompX[ numCompX >> 1 ]。
1.1.1.5 色度运动矢量的推导过程
仅当ChromaArrayType不等于0是调用本过程。
本过程的输入是一个亮度运动矢量mvLX和一个参考索引refIdxLX。
本过程的输出是色度运动矢量mvCLX。
色度运动矢量由对应的亮度运动矢量导出。
色度运动矢量水平分量的精度为1 ÷ ( 4 * SubWidthC ),垂直分量的精度为1 ÷ ( 4 * SubHeightC )。
注——例如,当使用4:2:0色度格式时,由于亮度运动矢量的单位是亮度样点单位的四分之一,色度分量的水平和垂直分辨率是亮度的二分之一,则色度运动矢量的单位为色度样点单位的八分之一,比如一个值为1的色度运动矢量代表一个八分之一色度样点的位移。例如,当亮度矢量用于8x16亮度样点块是,相应的4:2:0色度格式下色度运动矢量用于4x8色度样点块;当亮度矢量用于4x4亮度样点块是,相应的4:2:0色度格式下色度运动矢量用于2x2色度样点块。
运动矢量mvCLX的推导如下:
mvCLX[ 0 ] = mvLX[ 0 ]/2
mvCLX[ 1 ] = mvLX[ 1 ]/2