VVC帧内预测(三)PDPC

位置决定的帧内预测组合(Position dependent intra prediction combination,PDPC)是在帧内预测时使用未滤波和已滤波的参考像素的加权值作为预测值。

PDPC在VTM5中有了很大改进,它可以应用于planar模式(模式0),DC模式(模式1),垂直模式(模式50),水平模式(模式18),左下角对角线模式和与其相邻的8个模式(模式2~10),右上角对角线模式和与其相邻的8个模式(模式58~66)。

预测值是由参考像素值与预测值再次加权求得,如下式:

 

如果PDPC用于planar、DC、水平、垂直模式则不需要额外的边界滤波。

对于模式3~10和模式58~65其参考像素可能落到非整数像素位置,这时取其最近的整数像素位置的值作为参考值。

下表是PDPC的权值计算方法:

预测模式wTwLwTL
右上对角线16 >> ( ( y’<<1 ) >> shift)16 >> ( ( x’<<1 ) >> shift)0
左下对角线16 >> ( ( y’<<1 ) >> shift )16 >> ( ( x’<<1 ) >> shift )0
右上对角线相邻模式32 >> ( ( y’<<1 ) >> shift )00
左下对角线相邻模式032 >> ( ( x’<<1 ) >> shift )0

以下代码是VTM5内求PDPC的相关代码:

     if (m_ipaParam.applyPDPC)
      { //!<模式2或模式66
        if (m_ipaParam.intraPredAngle == 32) // intra prediction modes: 2 and VDIA 
        {
          int wT = 16 >> std::min(31, ((y << 1) >> scale));
​
          for (int x = 0; x < width; x++)
          { //权值
            int wL = 16 >> std::min(31, ((x << 1) >> scale));
            if (wT + wL == 0) break;
​
            int c = x + y + 1;
            if (c >= 2 * height) { wL = 0; }
            if (c >= 2 * width)  { wT = 0; }
            const Pel left = (wL != 0) ? refSide[c + 1] : 0;
            const Pel top  = (wT != 0) ? refMain[c + 1] : 0;
            //!<加权
            pDsty[x] = ClipPel((wL * left + wT * top + (64 - wL - wT) * pDsty[x] + 32) >> 6, clpRng);
          }
        }
        else
        {
          int invAngleSum0 = 2;
          for (int x = 0; x < width; x++)
          {
            invAngleSum0 += invAngle;
            int deltaPos0 = invAngleSum0 >> 2;
            int deltaFrac0 = deltaPos0 & 63;
            int deltaInt0 = deltaPos0 >> 6;
​
            int deltay = y + deltaInt0 + 1;
            if (deltay >(bIsModeVer ? m_leftRefLength : m_topRefLength) - 1) break;
​
            int wL = 32 >> std::min(31, ((x << 1) >> scale));
            if (wL == 0) break;
            Pel *p = refSide + deltay;
​
            Pel left = p[deltaFrac0 >> 5];
            pDsty[x] = ClipPel((wL * left + (64 - wL) * pDsty[x] + 32) >> 6, clpRng);
          }
        }
      }

感兴趣的请关注微信公众号Video Coding

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值