HEVC标准(draft)翻译--帧间预测1

参考文档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条带中skippeddirect预测单元的亮度运动矢量推导过程

当PredMode等于MODE_SKIP或MODE_DIRECT且slice_type等于P时,调用本过程。

本过程的输出是运动矢量mvL0和参考索引refIdxL0.

skippeddirect预测单元的参考索引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条带中skippeddirect预测单元的亮度运动矢量推导过程

当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

          tdtb推导如下:

                   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

          tdtb推导如下:

                   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

          tdtb推导如下:

                   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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值