【十五】 VVC/H.266 | 帧内帧间联合预测技术CIIP详解
文章目录
- 一、基本原理
- 二、具体技术细节
一、基本原理
CIIP
是帧内帧间联合技术,这属于Merge系列技术的一个分支。该技术需要计算当前预测块的帧内预测值,即用传统的帧内预测模式去预测当前块的像素值,并存储下来。然后利用帧间的预测方式去预测当前块的帧间预测值,最后将帧内和帧间的预测值,通过某种方式加权得到当前预测块的最终预测值。
二、具体技术细节
CIIP
技术在亮度块的和色度块都要实现,在目前的版本当中,亮度和色度帧内预测都只用Planar模式进行预测,帧间预测模式就是用Merge列表中最优的MV
进行帧间预测。在VTM8.0
当中,当前CU满足使用merge模式编码,并且当前CU包括至少64个像素,W<128,H<128W<128,H<128W<128,H<128,的条件时,需要一个标志位表示当前CU是否使用CIIP
模式。
具体的加权公式如下:
PCIIP=((4−wIntra)∗Pinter+wIntra∗Pintra+2)>>2P_{CIIP}=\left( \left( 4-wIntra \right) *P_{inter}+wIntra*P_{intra}+2 \right) >>2 PCIIP=((4−wIntra)∗Pinter+wIntra∗Pintra+2)>>2
权值wIntrawIntrawIntra是由当前CU的上方和左侧相邻块的编码模式决定的,其中帧间预测值的权重大小的为4−wIntra4-wIntra4−wIntra,具体的权值计算过程如下:
- 如果上方的相邻块可用(已经编码),且使用的是帧内编码模式则isIntraTop=1isIntraTop=1isIntraTop=1,否则isIntraTop=0isIntraTop=0isIntraTop=0
- 如果左侧的相邻块可用,且使用的是帧内编码模式则isIntraLeft=1isIntraLeft=1isIntraLeft=1,否则isIntraLeft=0isIntraLeft=0isIntraLeft=0
- a、如果isIntraTop+isIntraLeft=2isIntraTop+isIntraLeft=2isIntraTop+isIntraLeft=2,则wIntra=3wIntra=3wIntra=3;
b.、如果如果isIntraTop+isIntraLeft=1isIntraTop+isIntraLeft=1isIntraTop+isIntraLeft=1,则wIntra=2wIntra=2wIntra=2;
c、 否则wIntra=1wIntra=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); //左侧的块设置为邻居0const 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详解相关推荐
- [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 2021年广东工业大学第十五届文远知行杯程序设计竞赛(同步赛)详解
传送门 A M形字符 题意: M形字符串指的是由两个相同的回文串拼接而成 给你一个串S,问有多少个前缀是M形字符串 思路: M形是有两个相同的回文串构成的,所以这个M形串本身就是回文串,我们只需要判断 ...
- [网络安全自学篇] 五十五.Windows系统安全之构建ROP链绕过DEP及原理详解
这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了基于SEH异常处理机制的栈溢出漏洞,利用一个恶意的请求头部(HEAD或 ...
- 【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
前言 帧间预测是影响视频编码性能的关键环节之一,H.266/VVC帧间预测在传统只能应对简单的平移运动的基础上,采用了仿射运动模型,可以描述更加复杂的缩放.旋转等运动.为了更好的发挥合并模式(Me ...
- H.266/VVC相关技术学习笔记16:VTM6.0中的CIIP技术(帧内帧间联合预测)
今天讲一下目前VTM6.0版本中的CIIP技术,CIIP即为帧内帧间联合预测技术,这属于Merge系列的一个分支. 该技术需要先计算当前预测块的帧内预测值,即用Planar.DC.角度预测等传统的帧内 ...
- [Python从零到壹] 六十四.图像识别及经典案例篇之图像傅里叶变换和傅里叶逆变换详解
祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...
- VVC/H.266代码阅读(VTM8.0)(三. Slice到CTU的处理 )
本文是本系列的第三篇博客,内容是分析从Slice到CTU的处理代码. 该系列相关博客为: VVC/H.266代码阅读(VTM8.0)(一. NALU提取) VVC/H.266代码阅读(VTM8.0)( ...
- (十五)集成学习(下)——蒸汽量预测
参考:DataWhale教程链接 集成学习(上)所有Task: (一)集成学习上--机器学习三大任务 (二)集成学习上--回归模型 (三)集成学习上--偏差与方差 (四)集成学习上--回归模型评估与超 ...
- python turtle库setpos_Python内置海龟(turtle)库绘图命令详解(二)
继续谈利用海龟库(turtle库)做图.在这篇文章(Python内置海龟(turtle)库绘图命令详解(一))中已经介绍了turtle的一些基本画图命令,包括画布的设计.画笔属性与状态的设置以及画笔的 ...
最新文章
- iis7下站点日志默认位置
- H5 的getImageData造成的大量内存开销
- 设计——主观理想路径
- 贴吧小爬虫之爬取源码
- mybatis学习(39):动态sql片段
- ORACLE ORA-01000: 超出打开游标的最大数(解决及原因)
- 探码SaaS帮助企业开展数字化营销之路!
- 智慧应急 科学管理:打造园区安全智慧大脑
- 基于docker的redis4.0单机集群搭建
- Windows 回声消除 怎么外放音乐不让对方听到
- vivo手机如何隐藏应用 vivo手机隐藏应用方法
- 虚拟机配置文件vmx放置路径问题
- 24个国外优秀的网页页眉设计欣赏
- 压缩跟踪Compressive Tracking源码理解
- phpfilter的妙用
- 交互设计师必备的9种能力
- 数据库--循环语句:for循环
- html设置旋转中心兼容ie,IE中的CSS旋转属性
- 数据库的“读写分离”
- FFplay文档解读-45-视频过滤器二十
热门文章
- 数据可视化之matplotlib实战:plt.step() 绘制阶梯图
- delphi控件切图界面闪烁_「这个控件叫什么」系列之加载占位图+页面指示器
- Nacos集群部署方案
- 计算机专业术语大全,计算机专业名词总汇,计算机专业名词总汇
- ENC28J60学习
- windows10下Docker部署Kurento
- 非此即彼的逻辑错误_英语逻辑错误一览
- 游戏手柄计算机,电脑游戏手柄怎么设置 电脑游戏手柄设置步骤【图文】
- RayVentory updated
- 接口与抽象类的区别,为什么要用接口,抽象类不香吗?