帧间帧内联合预测(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的上方和左侧相邻块的模式决定,如下图,权值计算过程如下:
-
如果上方相邻块可用,且其使用帧内编码模式则isIntraTop =1,否则isIntraTop =0;
-
如果左侧相邻块可用,且其使用帧内编码模式则isIntraLeft =1,否则isIntraLeft =0;
-
如果(isIntraTop + isIntraLeft ) = 2,则wt=3;
-
如果(isIntraTop + isIntraLeft ) = 1,则wt=2;
-
否则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