Weighted Prediction of HEVC

来源:互联网 发布:边境杀手 知乎 编辑:程序博客网 时间:2024/06/05 01:56

一、预测原理

 

加权预测可用于修正P Slice 或 B Slice 中的运动补偿预测像素。HEVC中存在两种加权预测

 

1、默认(default)加权预测

 

P =(PLX+2LWD-1)>>LWD

单向预测

P =(PL0+PL1+2LWD)>>(LWD+1)

双向预测

 

2、显示(explict)加权预测

 

P=Clip1((PLX*WLX+2LWD-1)>>LWD+OLX)                                    单向预测

P=Clip1(((PL0*WL0+PL1*WL1+2LWD)>>(LWD+1))+(OL0+OL1+1)>>1)                   双向预测

 

P是目标图像的预测值,PLX则是参考列表X01)中相应参考帧的重建像素值。>>操作对应于亚像素精度运动补偿过程中对预测值的放大,LWD为具体系数W为权重,O为偏移量,其中WO在码流中获得

 

二、HM工程中的参数结构体

 

struct WPScalingParam

{

  Bool bPresentFlag;//为加权因子,决定某个像素点是否进行加权预测

  UInt uiLog2WeightDenom;//LWD

  Int  iWeight;//权重

  Int  iOffset;//偏移量

 

  // Weighted prediction scaling values built from above parameters (bitdepth scaled):

  Int  w;//权重 w=iWeight

  Int  o;//o=iOffset*offsetScalingFactor

  Int  offset;//双向加权预测与单向的offset应用有所不同,但均来源于o

  Int  shift;//LWD

  Int  round;//

};

 

三、HMSlice级的WP参数初始化

 

 

1、xCalcACDCParamSlice()中确定ACDC的值

 

weightACDCParam[compID].iDC=(((iOrgDC<<fixedBitShift)+(iSample>>1))/iSample)

weightACDCParam[compID].iAC=iOrgAC+= abs( (Int)pPel[x] - (Int)iOrgNormDC )

 

其中iOrgDC为像素值总和,fixedBitShift如果不采用高精度加权预测即为0,故iDC值为当前帧像素值平均值。iOrgNormDC为当前帧像素值平均值,iAC即为当前帧像素值与平均值的差的总和。

 

2、UpdatingWPParameters()中对WP参数进行初步赋值

 

dWeight=(refAC==0)?(Double)1.0:Clip3(-16.0,15.0,((Double)currAC/(Double)refAC) )

weight = (Int)( 0.5 + dWeight * (Double)(1<<log2Denom) )

offset=(Int)(((currDC<<log2Denom)- ((Int64)weight * refDC) + (Int64)realOffset) >> realLog2Denom )

clippedOffset = Clip3( -range, range-1, offset)

m_wp[refList][refIdxTemp][comp].iWeight = weight;

m_wp[refList][refIdxTemp][comp].iOffset = clippedOffset;

m_wp[refList][refIdxTemp][comp].uiLog2WeightDenom = log2Denom

 

其中refAC为参考帧ACcurrAC为当前帧ACDC以此类推;log2Denom在外部定义为iDenom,值为6,即为LWDiWeightiOffsetuiLog2WeightDenom即为之前所提到的参数结构体中的参数值。

 

四、运动补偿中的加权预测

 

 

 

1、单向WP函数

 

pwp[yuv].w = pwp[yuv].iWeight;

pwp[yuv].offset = pwp[yuv].iOffset * offsetScalingFactor;

pwp[yuv].shift = pwp[yuv].uiLog2WeightDenom;

 

woffsetshift赋值,分别为权重,偏移量及LWD

 

pDst[x] = weightUnidir(w0, pSrc0[x], round, shift, offset, clipBD)

 

之后再按公式进行加权运算

 

2、双向WP函数

 

 wp0[yuv].w = wp0[yuv].iWeight;

 wp1[yuv].w = wp1[yuv].iWeight;

 wp0[yuv].o = wp0[yuv].iOffset * offsetScalingFactor;

 wp1[yuv].o = wp1[yuv].iOffset * offsetScalingFactor;

 wp0[yuv].offset = wp0[yuv].o + wp1[yuv].o;

 wp0[yuv].shift = wp0[yuv].uiLog2WeightDenom + 1;

 wp1[yuv].offset = wp0[yuv].offset;

 wp1[yuv].shift  = wp0[yuv].shift;

 

offsetw进行赋值

 

pDst[x] = weightBidir(w0,pSrc0[x], w1,pSrc1[x], round, shift, offset, clipBD)

 

加权预测

 

 

 

0 0
原创粉丝点击