欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【十五】 VVC/H.266 | 帧内帧间联合预测技术CIIP详解

程序员文章站 2022-07-07 13:38:42
...

一、基本原理

CIIP是帧内帧间联合技术,这属于Merge系列技术的一个分支。该技术需要计算当前预测块的帧内预测值,即用传统的帧内预测模式去预测当前块的像素值,并存储下来。然后利用帧间的预测方式去预测当前块的帧间预测值,最后将帧内和帧间的预测值,通过某种方式加权得到当前预测块的最终预测值。

二、具体技术细节

CIIP技术在亮度块的和色度块都要实现,在目前的版本当中,亮度和色度帧内预测都只用Planar模式进行预测,帧间预测模式就是用Merge列表中最优的MV进行帧间预测。在VTM8.0当中,当前CU满足使用merge模式编码,并且当前CU包括至少64个像素,W<128,H<128W<128,H<128,的条件时,需要一个标志位表示当前CU是否使用CIIP模式。

具体的加权公式如下:
PCIIP=((4wIntra)Pinter+wIntraPintra+2)>>2 P_{CIIP}=\left( \left( 4-wIntra \right) *P_{inter}+wIntra*P_{intra}+2 \right) >>2
权值wIntrawIntra是由当前CU的上方和左侧相邻块的编码模式决定的,其中帧间预测值的权重大小的为4wIntra4-wIntra,具体的权值计算过程如下:

【十五】 VVC/H.266 | 帧内帧间联合预测技术CIIP详解

  1. 如果上方的相邻块可用(已经编码),且使用的是帧内编码模式则isIntraTop=1isIntraTop=1,否则isIntraTop=0isIntraTop=0
  2. 如果左侧的相邻块可用,且使用的是帧内编码模式则isIntraLeft=1isIntraLeft=1,否则isIntraLeft=0isIntraLeft=0
  3. a、如果isIntraTop+isIntraLeft=2isIntraTop+isIntraLeft=2,则wIntra=3wIntra=3
    b.、如果如果isIntraTop+isIntraLeft=1isIntraTop+isIntraLeft=1,则wIntra=2wIntra=2
    c、 否则wIntra=1wIntra=1

权重计算的代码如下:

//CIIP模式的加权函数,帧内预测和帧间值的加权值的选取有三种情况
void IntraPrediction::geneWeightedPred(const ComponentID compId, PelBuf &pred, const PredictionUnit &pu, Pel *srcBuf)
{
  const int            width = pred.width;
  CHECK(width == 2, "Width of 2 is not supported");
  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(); //当前PU左下角的块
  const Position posTR = pu.Y().topRight();  //当前PU上方的块
  const PredictionUnit *neigh0 = pu.cs->getPURestricted(posBL.offset(-1, 0), pu, CHANNEL_TYPE_LUMA);  //左侧的块设置为邻居0
  const PredictionUnit *neigh1 = pu.cs->getPURestricted(posTR.offset(0, -1), pu, CHANNEL_TYPE_LUMA);  //上方的块设置为邻居1
  //判断左侧和上方的块是否可用以及是否采用帧内编码
  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;
    }
  }
}

更多关于视频编码知识和资源的分享,更精致的文章排版,欢迎关注博主微信公众号,一起交流、学习、进步!!!
【十五】 VVC/H.266 | 帧内帧间联合预测技术CIIP详解

相关标签: VVC/H.266