VVC帧间预测(十)帧间帧内联合预测CIIP

帧间帧内联合预测(Combined inter and intra prediction ,CIIP),在HEVC中一个CU在预测时要么使用帧内预测要么使用帧间预测,二者只能取其一。而VVC中提出的CIIP技术,如其名所言可以同时使用帧内预测和帧间预测。

CIIP对一个CU同时使用帧内预测和帧间预测得出两个预测块,最终的预测块由两个预测块加权得到。

在VTM5中当CU使用merge模式编码,且CU包含至少64个亮度像素(即W*H≧64),且W<128,H<128时需要一个标志位表示当前CU是否使用CIIP模式。

在VTM5中当CU使用CIIP模式时,首先用帧间merge模式得到帧间预测块P_inter,然后用帧内Planar模式得到帧内预测块P_intra,最后将两个块加权得到最终预测块。

权值由当前CU的上方和左侧相邻块的模式决定,如下图,权值计算过程如下:

  1. 如果上方相邻块可用,且其使用帧内编码模式则isIntraTop =1,否则isIntraTop =0;

  2. 如果左侧相邻块可用,且其使用帧内编码模式则isIntraLeft =1,否则isIntraLeft =0;

  3. 如果(isIntraTop + isIntraLeft ) = 2,则wt=3;

  4. 如果(isIntraTop + isIntraLeft ) = 1,则wt=2;

  5. 否则wt=1。

void IntraPrediction::geneWeightedPred(const ComponentID compId, PelBuf &pred, const PredictionUnit &pu, Pel *srcBuf)
{
  const int            width = pred.width;
  const int            height = pred.height;
  const int            srcStride = width;
  const int            dstStride = pred.stride;

  Pel*                 dstBuf = pred.buf;
  int wIntra, wMerge;

  const Position posBL = pu.Y().bottomLeft();
  const Position posTR = pu.Y().topRight();
  const PredictionUnit *neigh0 = pu.cs->getPURestricted(posBL.offset(-1, 0), pu, CHANNEL_TYPE_LUMA);
  const PredictionUnit *neigh1 = pu.cs->getPURestricted(posTR.offset(0, -1), pu, CHANNEL_TYPE_LUMA);
  bool isNeigh0Intra = neigh0 && (CU::isIntra(*neigh0->cu));
  bool isNeigh1Intra = neigh1 && (CU::isIntra(*neigh1->cu));
  //!<帧间和帧内加权的权值计算
  if (isNeigh0Intra && isNeigh1Intra)
  {
    wIntra = 3; wMerge = 1;
  }
  else
  {
    if (!isNeigh0Intra && !isNeigh1Intra)
    {
      wIntra = 1; wMerge = 3;
    }
    else
    {
      wIntra = 2; wMerge = 2;
    }
  }
  for (int y = 0; y < height; y++)
  {
    for (int x = 0; x < width; x++)
    {//!<帧间和帧内加权获得最终预测值
      dstBuf[y*dstStride + x] = (wMerge * dstBuf[y*dstStride + x] + wIntra * srcBuf[y*srcStride + x] + 2) >> 2;
    }
  }
}

参考

JVET-N1002

JVET-N0302

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

发布了87 篇原创文章 · 获赞 108 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/Dillon2015/article/details/103930980
今日推荐