今天讲一下目前VTM6.0版本中的CIIP技术,CIIP即为帧内帧间联合预测技术,这属于Merge系列的一个分支。
该技术需要先计算当前预测块的帧内预测值,即用Planar、DC、角度预测等传统的帧内预测模式去预测当前块的帧内预测值存储下来。然后再利用帧间的预测方式去预测当前块的帧间预测值,最后将帧内帧间的各自预测值通过某种加权方式加权得到最终当前块的预测值。

该技术对亮度块和色度块都要做,不过在目前的版本中,亮度帧内和色度帧内都要只用Planar模式。帧间模式就是用Merge列表中最优的那个MV去预测。下面是代码中帧内预测模式选择的地方,pu.intraDir[0] 里面存的是亮度分量的帧内预测模式为Planar,pu.intraDir[1] 里面存的是色度分量的帧内预测模式DM,这里的DM实际上会从色度块对应的亮度块去获取其亮度块的帧内模式,因此获取到的帧内模式也为Planar。

 if (uiNoResidualPass == 0 && RdModeList[uiMrgHADIdx].isCIIP){cu.mmvdSkip = false;mergeCtx.setMergeInfo(pu, uiMergeCand);pu.mhIntraFlag = true;pu.regularMergeFlag = false;pu.intraDir[0] = PLANAR_IDX;//帧内亮度模式采用Planar模式CHECK(pu.intraDir[0]<0 || pu.intraDir[0]>(NUM_LUMA_MODE - 1), "out of intra mode");pu.intraDir[1] = DM_CHROMA_IDX;//帧内色度模式采用DM模式}

当获取到当前编码块的帧内预测值,以及对应的帧间预测值后,就需要进一步的加权,加权系数有两个,一个是帧内加权系数Wintra,另一个是帧间加权系数Winter,加权的方式如下所示:

如果上块和左边的块都是帧内模式:则(Wintra,Winter)=(3,1);
如果上块和左边的块都是帧间模式:则(Wintra,Winter)=(1,3);
如果一个是帧内模式一个是帧间模式:则(Wintra,Winter)=(2,2);
预测的具体公式为:
Pred= (wMerge * Pinter+ wIntra * Pintra + 2) >> 2;

具体在代码中的加权函数如下:

//CIIP模式的加权函数,对帧内预测值和帧间预测值进行三种权值的加权
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);//左下角的块设置为邻居0const PredictionUnit *neigh1 = pu.cs->getPURestricted(posTR.offset(0, -1), pu, CHANNEL_TYPE_LUMA);//右下角的块设置为邻居1bool isNeigh0Intra = neigh0 && (CU::isIntra(*neigh0->cu));//邻居0是否为帧内模式bool isNeigh1Intra = neigh1 && (CU::isIntra(*neigh1->cu));//邻居1是否为帧内模式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++){//邻居0是否为帧内模式这里计算最终的加权预测值dstBuf[y*dstStride + x] = (wMerge * dstBuf[y*dstStride + x] + wIntra * srcBuf[y*srcStride + x] + 2) >> 2;}}
}

H.266/VVC相关技术学习笔记16:VTM6.0中的CIIP技术(帧内帧间联合预测)相关推荐

  1. H.266/VVC相关技术学习笔记20:帧间预测技术中的MMVD技术(Merge mode with MVD)

    今天介绍一下帧间预测技术中的MMVD技术(Merge mode with MVD),也称带有运动矢量差的融合技术,MMVD也属于基于Merge的技术中的一种,在解码端的语法元素中也属于Merge分支. ...

  2. H.266/VVC相关技术学习笔记4:HEVC和VVC中块划分的差别

    关于H.265/HEVC和H.266/VVC中的块划分的区别: 一.HEVC中首先需要将一个图像固定划分为多个CTU. ① CTU的尺寸固定划分为64×64,一个CTU由一个亮度CTB和两个色度CTB ...

  3. H.266/VVC相关技术学习笔记18:帧间预测中的AMVR技术(自适应运动适量精度)

    AMVR技术也称为自适应运动适量精度技术,就是在以前的HEVC中,MVD的精度只有一个默认的1/4像素精度,但是由于要适应不同分辨率的图像,仅仅使用一个精度去表示MVD是远远不够的,因此在VTM6.0 ...

  4. 区块链学习笔记16——以太坊中的交易树和收据树

    十六.以太坊中的交易树和收据树 每次发布一个交易的时候,那些交易会组织成一个交易树,也是一颗Merkle tree跟比特币中的情况是类似的,同时以太坊还增加了一个收据树,每个交易执行完之后会形成一个收 ...

  5. JAVA基础 多线程技术学习笔记(V1.0)

    目录 一.多线程介绍 1.1 多线程中的基本概念 1.1.1多线程与进程 1.1.2 进程.线程的区别和联系 1.1.3 并发和并行的区别 1.1.4   线程的执行特点 1.1.5 主线程与子线程 ...

  6. H.266/VVC相关技术学习笔记21:帧间预测中五种Merge模式的熵编码方式

    今天主要详细讲一下帧间预测中五种Merge模式的熵编码方式,以及对应的VTM的代码中的编码方式的实现.现阶段VTM6.0中Merge模式大致上分为五种,分别是Subblock_Merge.MMVD_M ...

  7. ITCAST视频-Spring学习笔记(使用JDK中的Proxy技术实现AOP功能)

    感谢ITCAST发布的免费视频. AOP-代理对象 1.  拦截所有业务方法 2.  判断用户是否有权限,由权限就允许它执行业务方法,没有权限不允许执行业务方法. 代理对象创建由两种:静态代理,动态代 ...

  8. asp.net学习笔记异常处理001---.framework4.0中asp.net页面ValidateRequest=false 无效的问题

    在做牛腩新闻发布系统的时候,部分同学可能会遇到这样的情况: 从客户端(ContentPlaceHolder1_m_ContentPlaceHolder_ftbContent="<P&g ...

  9. 【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总

    前言 ​ 帧间预测是影响视频编码性能的关键环节之一,H.266/VVC帧间预测在传统只能应对简单的平移运动的基础上,采用了仿射运动模型,可以描述更加复杂的缩放.旋转等运动.为了更好的发挥合并模式(Me ...

最新文章

  1. Windows10下如何安装配置 perl 环境
  2. 互联网时代的云服务器四大功能
  3. linux ftp 不能上传,linux ftp用户没法上传。
  4. NgRx createSelector 工具函数的三个类型参数
  5. uva 10127——ones
  6. php 二维数组按照某value值求出最大值最小值
  7. 随想录(python第三方库中的 setup.py)
  8. c语言如何求一个数学表达式的值,浅谈C语言中表达式的求值
  9. ubuntu装python3_ubuntu16.04安装python3的包报错
  10. java中常用的数据结构_Java中常用的数据结构类
  11. 010 异步处理Rest服务
  12. 6-vue-component
  13. express比php好用,[译]Node.js 框架比较: Express vs. Koa vs. Hapi
  14. 【交易架构day4】京东到家交易系统的演进之路
  15. 关于SearchView设置字体颜色,提示字体及背景的解决方法
  16. 工作6年,谈谈我对“算法岗”的理解
  17. C语言实现建立顺序表,修改顺序表,插入顺序表,删除顺序表
  18. Scipy.sparse中coo_matrix、csc_matrix、csr_matrix、lil_matrix区别与特点
  19. OkHttp调用第三方接口
  20. C语言函数的基础运用-----二项式定理的运用

热门文章

  1. php圆的周长_php面向对象编程练习:计算矩形、三角形、圆形的周长和面积
  2. 总结几点无线Mesh网络的优点
  3. 圆周率为什么会等于4?
  4. 三星笔记本bios设置里找不到U盘启动盘的解决方法
  5. (三星Samsung笔记本)误删efi分区后重装WIN10
  6. android 盒子刷 下载,一加5刷机盒子app下载_一加5刷机盒子安卓最新版v7.5下载 - Win7旗舰版...
  7. 《Context Contrasted Feature and Gated Multi-Scale Aggregation for Scene Segmentation》论文阅读
  8. javaweb第三天JavaScript知识点(来自广陵散老师)
  9. [树状数组] Galahad
  10. NumPy transpose 的定义与计算过程