【十五】 VVC/H.266 | 帧内帧间联合预测技术CIIP详解
程序员文章站
2022-07-07 13:38:42
...
一、基本原理
CIIP
是帧内帧间联合技术,这属于Merge系列技术的一个分支。该技术需要计算当前预测块的帧内预测值,即用传统的帧内预测模式去预测当前块的像素值,并存储下来。然后利用帧间的预测方式去预测当前块的帧间预测值,最后将帧内和帧间的预测值,通过某种方式加权得到当前预测块的最终预测值。
二、具体技术细节
CIIP
技术在亮度块的和色度块都要实现,在目前的版本当中,亮度和色度帧内预测都只用Planar模式进行预测,帧间预测模式就是用Merge列表中最优的MV
进行帧间预测。在VTM8.0
当中,当前CU满足使用merge模式编码,并且当前CU包括至少64个像素,,的条件时,需要一个标志位表示当前CU是否使用CIIP
模式。
具体的加权公式如下:
权值是由当前CU的上方和左侧相邻块的编码模式决定的,其中帧间预测值的权重大小的为,具体的权值计算过程如下:
- 如果上方的相邻块可用(已经编码),且使用的是帧内编码模式则,否则
- 如果左侧的相邻块可用,且使用的是帧内编码模式则,否则
- a、如果,则;
b.、如果如果,则;
c、 否则
权重计算的代码如下:
//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;
}
}
}
更多关于视频编码知识和资源的分享,更精致的文章排版,欢迎关注博主微信公众号,一起交流、学习、进步!!!
上一篇: Qt实用技巧:用于服务器多图像拼接存在误差的标定工具(像素误差校准)
下一篇: jmeter的使用
推荐阅读
-
DBA_Oracle Startup / Shutdown启动和关闭过程详解(概念)(对数据库进行各种维护操作)
-
NEX 3 5G手机星环影像系统详解:6400万三摄、Hyper-HDR逆光算法
-
还在为看不懂英文技术文档苦恼吗,或许这款神器能帮你彻底解决它!(我是免费真福利)
-
C#序列化与反序列化(Serialize,Deserialize)实例详解
-
Android常用的数据加密方式代码详解
-
Android仿iPhone日期时间选择器详解
-
详解用RxJava实现事件总线(Event Bus)
-
Java线程池ThreadPoolExecutor类使用详解
-
我的自媒体博客用一年时间赚到了第一桶金
-
C#操作SQLite方法实例详解