H.266/VVC视频编码技术
文章平均质量分 69
H.266是在H.265/HEVC基础上改进的新一代视频编码技术,已正式定名VVC(Versatile Video Coding),由JVET组织引导不断更新完善中。本专栏旨在分享个人的H.266学习过程,希望与更多的视频编码研究者交流。
岳麓吹雪
现在努力,以后就可以休息
展开
-
VTM测试结果与官方anchor对不上
最近测了一下VTM9.0的性能,AI和LP和官方anchor对的上,LB和RA死活对不上,反复检查了好几遍参数没发现问题,最后从同事了解到,测试使用编译平台不一样,浮点数存在精度区别。我使用的是windows+vs2017的平台,而官方提供的是linux+gcc的数据。于是重新用linux测试,数据果然对上了。...原创 2020-09-15 09:59:27 · 1323 阅读 · 5 评论 -
VTM3.0色度帧内候选模式列表
今天来详细看下色度帧内候选模式列表,函数是getIntraChromaCandModes,代码部分很简单。MDMSVTM中使用的是HM色度候选模式,MDMS在CE中,估计是因为复杂度的问题,目前还没有采用。在L0139中给出了一个简单的复杂度分析,性能上使用MDMS相比VTM在AI下的Y BD-rate估计为-0.2%,UV估计约-1%(个人根据提案数据估计,没有具体测过)。下图是MDMS...原创 2018-12-24 16:14:09 · 1125 阅读 · 8 评论 -
H.266/VVC已采纳技术
之前总结过H.266 JEM相对于H.265/HEVC的改进,JEM可以看做H.265到H.266的过度阶段参考软件,把很多有效果的算法都收纳进去了,与目前的H.266/VVC是存在很大不同的。目前H.266/VVC已经进入到了正式的标准化阶段,参考软件改用了BMS/VTM,从3.0开始,只对VTM进行更新。以下是截止L次澳门会议H.266/VVC已采纳技术(详见L1002):• Intra...原创 2018-12-23 10:11:06 · 4468 阅读 · 3 评论 -
新一代视频编码定名VVC(Versatile Video Coding)
https://news.itu.int/versatile-video-coding-project-starts-strongly/JVET于2018年4月10日美国圣地亚哥会议上,为新一代视频编码标准定名为Versatile Video Coding,主要目标是改进现有HEVC,提供更高的压缩性能,同时会针对新兴应用(360°全景视频和HDR)进行优化。VVC预计在2020年之前完成标准化,目翻译 2018-05-07 10:32:48 · 9468 阅读 · 0 评论 -
VTM3.0变换编码跟进
之前BMS2.0变换编码跟进总结了BMS/VTM2.0的变换编码,从3.0开始,参考软件不再使用BMS版本,只有VTM版本更新。相比VTM2.0,VTM3.0变换编码变化不大,主要采纳了三份提案,代码改动很小,性能基本没有变化,主要是修复bug和统一化。1.帧内MTS传输变换核index时,不再检测非零系数个数。——JVET L0059 SamsungVTM2.0中,帧内亮度块使用多核变换情...原创 2018-12-16 18:57:13 · 1057 阅读 · 9 评论 -
VTM3.0代码学习:estIntraPredChromaQT函数
之前VTM3.0色度帧内预测跟进中学习了VTM3.0的色度帧内预测过程,今天来看下具体函数estIntraPredChromaQT。VTM3.0色度帧内预测分成两个阶段:1.粗选:按DC、Ver、Hor、LM_L、LM_T进行预测,按SATD排序,去掉两个SATD最大的模式。2.细选:粗选剩下三个模式和Planar、LM、DM(共六种)进行RD检测选最优。其中当DM借用的亮度角度模式与前四种...原创 2018-12-13 15:21:42 · 917 阅读 · 1 评论 -
VTM3.0代码学习:predIntraAng函数
今天来学习一下帧内预测函数predIntraAng,用于生成帧内预测图像。输入参数: const ComponentID compId //In 颜色分量 PelBuf &piPred //In/Out 预测图像 const PredictionUnit &pu //In 当前PU const bool useFilteredPredSamples ...原创 2018-11-21 11:36:13 · 1350 阅读 · 0 评论 -
VTM3.0色度帧内预测跟进
VTM2.0先来回顾一下VTM2.0色度帧内预测。在VTM2.0中,色度帧内预测会按Plannar、Ver、Hor、DC、LM、DM(共六种)顺序进行预测,RD检测最优。其中当DM借用的亮度角度模式与前四种模式相同时,会将DM换为角度66模式。VTM3.0相比VTM2.0,由于加入了MDLM(详见L0338),色度帧内预测有所变化。在VTM3.0中,加入了MDLM,即LM增加了L...原创 2018-11-19 11:24:07 · 842 阅读 · 10 评论 -
BMS2.0变换编码跟进
BMS2.0中,变换编码采纳了多核变换和二次变换。在draft中提到,采纳的多核变换只使用DCT2,DCT8,DST7三种变换核,没有给出具体的算法细节,现在来从代码中大概看下变换部分的内容。代码和JEM变动不大,JEM代码分析可见H.266代码学习:transformNxN函数和JEM一样,变换编码入口函数名称保持为transformNxN,变换尺寸JEM中就已经不是NxN了,换成tra...原创 2018-09-16 17:50:15 · 586 阅读 · 0 评论 -
BMS/VTM代码学习:xCompressCU
找工作基本结束,收心回来看266了,从xCompressCU开始吧。在初学者阶段写过HEVC代码学习11:xCompressCU函数,当时实际看的一知半解,作为参考吧。BMS/VTM中xCompressCU代码精简了很多,看起来容易多了,主要流程为:1.初始化:设置可用模式、上下文模型等。2.尝试帧间、帧内各种可用预测模式,当遍历完所有可用模式后,调用xCheckModeSplit进行划分,...原创 2018-09-26 15:48:15 · 3790 阅读 · 6 评论 -
VTM2.0算法跟进
7月份JVET卢布尔雅那会议上确定了VTM2.0版本,来跟进下采纳的技术:JVET-K1002采纳的技术有: • Intra prediction – 67 intra mode with wide angles mode extension(宽角度模式是针对矩形块提出的) – Position dependent intra prediction combination (...原创 2018-09-13 22:44:00 · 1290 阅读 · 2 评论 -
BMS/VTM代码学习:解码器端的环路滤波处理
今天来看下环路滤波部分的代码。下图,这里所说的环路滤波器包含了去块效应滤波器和像素自适应补偿SAO滤波器,属于环路后处理。 在解码端,解码码流生成预测帧后,会对预测帧+残差得到的重构帧进行环路滤波,环路滤波后的视频帧就是最终要输出的图像。从JEM再到BMS/VTM,大致维持了HM的代码,增加了少量内容,这里就不对比来说了。DecLib::executeLoopFiltersDec...原创 2018-07-25 14:32:17 · 2071 阅读 · 2 评论 -
H.266/VVC测试软件VTM
JVET于2018年4月10日美国圣地亚哥会议上,为新一代视频编码标准定名为Versatile Video Coding,正式开启了H.266/VVC的标准化进程。从H.265跟过来的同学们肯定都知道中间存在一个JEM(Joint Exploration Model ),实际就是一个过渡版本,其中的技术在H.266/VVC中并不一定会采纳,要重新评估决定。在4月的J会议上,确定了VVC的初...原创 2018-07-20 15:11:55 · 6913 阅读 · 10 评论 -
BMS/VTM代码学习:CodingStructure和CodingUnit
在BMS中对CU类进行了简化,看起来好舒服啊,代码量少了很多。今天就从指定CU的提取入手,来说下BMS中的CodingStructure和CodingUnit。HM/JEM:TComDataCU先来看HM和JEM。CU信息存储在TComDataCU中,来看官方给的介绍: TComDataCU里面的确存放了大量信息,在日常使用中从这样一个cu对象就可以取到大部分所需要的信息。这里就不贴...原创 2018-07-17 20:31:32 · 2753 阅读 · 4 评论 -
BMS/VTM代码学习:decompressSlice函数
今天正式转入BMS代码的学习,最近在干解码端的东西,就从解码这边开始看了。先来看decompressSlice函数。在之前的 HEVC代码学习38:decompressSlice函数 中已经讲过HM中的两个decompressSlice函数,BMS中整合为一个decompressSlice函数,变化不大。DecSlice::decompressSlice该函数比较简单,是解码一帧图像的上层...原创 2018-07-14 11:08:09 · 909 阅读 · 0 评论 -
H.266代码学习:xCheckRDCostMerge2Nx2N函数
今天来学习一下JEM中的xCheckRDCostMerge2Nx2N函数。之前HEVC代码学习31:xCheckRDCostMerge2Nx2N函数已经学习了HEVC中的xCheckRDCostMerge2Nx2N函数,JEM中相比HM变化不大,主要是新加入了TMVP新技术。xCheckRDCostMerge2Nx2NxCheckRDCostMerge2Nx2N是帧间Merge模式的入...原创 2018-06-14 11:12:13 · 1351 阅读 · 0 评论 -
H.266代码学习:estIntraPredLumaQT函数
之前 HEVC代码学习42:estIntraPredLumaQT函数 对HM中的estIntraPredLumaQT函数进行了学习,下面将对JEM中的该函数进行学习。estIntraPredLumaQTestIntraPredLumaQT是亮度帧内预测的入口函数,完成了亮度帧内预测最优模式的选择。JEM与HM主要区别有: 1.JEM中,亮度帧内模式预测模式数由35增加到67种,...原创 2018-05-30 17:23:24 · 1615 阅读 · 14 评论 -
H.266代码学习:xCheckRDCostIntra函数
今天来看帧内预测的入口函数xCheckRDCostIntra。JEM整体代码框架和HM是相同的,帧内预测代码框架可参考 HEVC代码学习37:帧内预测代码整体学习。xCheckRDCostIntra在xCompressCU中被调用,进行帧内预测。JEM与HM主要区别: 这一部分,相对HM没有什么重大改动。流程如下: 主要流程可以分为5个部分: 1.初始化,设置子块信息。 2....原创 2018-05-22 16:59:00 · 2306 阅读 · 0 评论 -
H.266代码学习:decompressCtu和xDecompressCU函数
今天来学习一下JEM的decompressCtu和xDecompressCU函数。之前在 H.266代码学习:decodeCtu和xDecodeCU函数 学习了的学习中提到,decodeCtu和xDecodeCU只是用来解码各种flag和系数,没有进行预测重构。在完成相关信息的解码之后,会在decompressCtu和xDecompressCU中完成的预测重构。decompressCtu该...原创 2018-05-20 17:13:22 · 776 阅读 · 0 评论 -
H.266代码学习:decodeCtu和xDecodeCU函数
之前 HEVC代码学习39:decodeCtu和xDecodeCU函数 中对HM中的CTU解码函数进行了学习,这里来学习一下JEM中的。decodeCtu该函数是解码CTU的入口函数,代码比较简单。JEM中与HM主要区别: 在JEM中,会对帧内模式的亮度和色度分量分别编码,因此解码时会首先对帧内模式的亮度CTU解码,然后对色度CTU解码。流程如下: 1.为亮度设置QP,...原创 2018-05-20 11:11:24 · 688 阅读 · 0 评论 -
H.266代码学习:xIntraCodingTUBlockTM及其调用的重要函数
之前在 H.266代码学习:transformNxN函数 中提到,帧内KLT的入口函数是xIntraCodingTUBlockTM,今天就来对他进行详细学习。这里本人存在一点疑问,先写出来: 从代码中看,帧内预测中使用KLT变换,必须使用TM匹配进行预测,为什么KLT只能针对TM匹配预测进行变换?TM匹配替代了原帧内预测,原HEVC中应该是没有的,为什么JEM中没有提到新增使用TM匹配的帧内...原创 2018-04-02 11:33:16 · 849 阅读 · 0 评论 -
H.266代码学习:xEncodeCU函数
之前在HEVC代码学习35:xEncodeCU函数中介绍过xEncodeCU函数,今天来看JEM中的xEncodeCU,其中难点在于QTBT编码结构。HM中使用compressCtu对每个CTU进行划分并预测,然后使用encodeCtu对每个CTU进行编码。JEM中也是如此,会在xEncodeCU,迭代完成CU各种信息的编码。所以在这里,当前的CTU已经进行了划分和预测,如果要看CU的划分和预...原创 2018-03-29 22:56:10 · 1220 阅读 · 9 评论 -
H.266代码学习:变换部分总结
最近看了一段时间的JEM的变换部分了,先来总结一些,一来梳理一下思路,加深理解,二来列个提纲,方便大家阅读。变换是指对当前块减去帧内/帧间预测生成的预测块得到的残差进行变换编码,使能量更多的集中于左上角,从而来降低空间冗余。变换之后会进行量化,而后会进行熵编码。变换的上层入口变换的对象是残差信息,残差是当前块减预测块得到的。预测分为帧内/帧间两种。由于JEM引入了KLT变换技术,根...原创 2018-03-16 11:43:40 · 1994 阅读 · 5 评论 -
H.266代码学习:xT,xTrMxN,xTrMxN_EMT函数
今天来学习xT和xTrMxN和xTrMxN_EMT函数。在之前的 H.266代码学习:transformNxN函数 中提到JEM变换分为两次:主变换+二次NSST。transformNxN会调用xT进行主变换。在JEM中,主变换有三种: 1.原HEVC中的DCT-2/4x4 DST。 2.多核变换。 3.KLT变换。其中1和3的入口函数为xTrMxN,2的入口函数为xTrMxN_...原创 2018-03-13 11:34:14 · 1064 阅读 · 0 评论 -
H.266代码学习:transformNxN函数
在之前 HEVC代码学习36:transformNxN函数 中对HM中的transformNxN进行了学习,而后又在 H.266代码学习:MDNSST相关代码 中,间接的对JEM中的transformNxN进行了粗略学习。下面将对比HM,来学习一下JEM中的transformNxN。在JEM中,帧内预测在xIntraCodingTUBlock和xIntraCodingTUBlockTM(HM中没有,原创 2018-03-12 16:46:00 · 1303 阅读 · 0 评论 -
H.266代码学习:xIntraCodingTUBlock函数
今天来继续学习帧内编码的重要函数xIntraCodingTUBlock,上次 H.266代码学习:xRecurIntraCodingLumaQT函数 学习中提到,xIntraCodingTUBlock中完成了亮度信号的帧内预测、计算残差并进行变换、量化,生成重构信号。实际色度信号帧内预测xRecurIntraChromaCodingQT也会调用xIntraCodingTUBlock来完成这些操作。...原创 2018-03-12 11:45:38 · 1348 阅读 · 5 评论 -
H.266代码学习:xRecurIntraCodingLumaQT函数
目前实验室的研究方向全面转向了H.266,以后我也将由HM转向JEM,不再更新HEVC代码学习了。JEM相对于HM看起来繁杂很多,毕竟加了很多内容,但框架是一样的,建议看的时候和HM比对着看,我也会在这里记录JEM相对于HM的对比学习。这里使用的是JEM7.0。如果有从看过我之前博客的同学们,会发现我近期更加注意版面了有木有?嘿嘿=.=,舒服了很多有没有。好吧,我承认,是我有强迫症。今天就...原创 2018-03-10 20:25:16 · 2031 阅读 · 2 评论 -
H.266代码学习:SDT相关代码初步学习
之前在H.266变换编码:信号决定变换SDT中已经对SDT的理论进行了学习,下面来初步看下代码,之后会进行详细学习。SDT分为两部分: 1.训练KLT 2.对残差使用KLT第一部分训练KLT,帧内和帧间是独立处理的。帧内KLT对于帧内KLT,其训练部分是在xIntraCodingTUBlockTM中完成的。 xIntraCodingTUBlockTM详见https://b...原创 2018-01-25 11:31:19 · 864 阅读 · 0 评论 -
H.266代码学习:MDNSST相关代码初步学习
之前已经对MDNSST理论知识进行了学习,这里不再赘述,来看代码部分。 http://blog.csdn.net/lin453701006/article/details/79030862MDNSST是在主变换后进行处理,在transformNxN函数中,可以看到,经过xT主变换后会进行NSST变换,这里只分析其中MDNSST相关代码,为了便于阅读,省略其他代码。MDNSST主要流程如下: 1.原创 2018-01-24 10:52:32 · 1001 阅读 · 0 评论 -
H.266代码学习:AMT相关代码学习
AMT理论部分见http://blog.csdn.net/lin453701006/article/details/79026631JEM中,AMT分为EMT和EMTFAST两种,在cfg中可以设定。CommonDef.h中定义了AMT的重要参数,默认AMT最大可用块尺寸为64。变换函数xTrMxN_EMTxTrMxN_EMT更详细的分析见 H.266代码学习:xT,xTrMx...原创 2018-01-16 10:23:20 · 1733 阅读 · 0 评论 -
H.266代码学习:JEM使用方法
之前在HEVC代码学习0:HM使用+码流分析教程中详细介绍了HM使用方法,而H.266参考代码JEM已经成型,因此这里简单介绍下JEM的使用方法。阅读建议:JEM使用方法与HM类似,使用中改动在于cfg。使用过HM的同学,更换cfg后就可以轻松上手,本文就当科普了,看简介就可以了。 没有使用过HM,建议移步HEVC代码学习0:HM使用+码流分析教程,参考HM使用方法来使用JEM。...原创 2018-04-14 16:40:13 · 3308 阅读 · 14 评论 -
H.266变换编码:信号决定变换SDT
SDT代码学习:http://blog.csdn.net/lin453701006/article/details/79158700在JEM中,变化编码的改进可以分为两个阶段,如下图。 第一阶段是使用自适应多核变换AMT(http://blog.csdn.net/lin453701006/article/details/79026631)或信号决定变换SDT的主变换,两者通过率失真优化进...原创 2018-01-11 16:46:11 · 1445 阅读 · 0 评论 -
H.266变换编码:模式依赖的不可分二次变换MDNSST
MDNSST代码学习:http://blog.csdn.net/lin453701006/article/details/79148082在JEM中,变化编码的改进可以分为两个阶段,如下图。 第一阶段是使用自适应多核变换AMT(http://blog.csdn.net/lin453701006/article/details/79026631)或信号决定变换SDT(http://blog原创 2018-01-11 11:40:10 · 1331 阅读 · 2 评论 -
H.266变换编码:高频调零的大尺寸块变换
在JEM中,使用了更大尺寸的变换块,最高可达128x128,主要针对1080p和4K的更高分辨率视频。通过对宽或高或宽高同时大于阈值的大变换块中的高频变换系数进行调零处理,获取更优的变换性能。首先来看下变换编码。视频信号中包含着能量上占大部分的直流和低频成分(图像的平坦部分),还有少量的高频成分(图像的细节部分)。变换编码是通过将空间信号的能力集中到频域的一小部分低频系数上,能量小的系数可通过原创 2018-01-10 15:42:36 · 867 阅读 · 0 评论 -
H.266变换编码:自适应多核变换AMT
AMT代码学习:http://blog.csdn.net/lin453701006/article/details/79065885在JEM中,变化编码的改进可以分为两个阶段,如下图。 第一阶段是使用自适应多核变换AMT或信号决定变换SDT(http://blog.csdn.net/lin453701006/article/details/79035202)的主变换,两者通过率失真优化进原创 2018-01-10 17:47:11 · 3094 阅读 · 2 评论 -
H.266帧间预测:双向光流BIO
双向光流(BIO)是采样点级别的运动优化,基于双向预测的块运动补偿,不需要传输多余信号。令I(k)I^{(k)}为参考点k(k=0,1)运动补偿之后的亮度值,∂I(k)/∂x,∂I(k)/∂y∂I^{(k)}/∂x,∂I^{(k)}/∂y为I(k)I^{(k)}的梯度水平分量和垂直分量。假设光流可用,运动矢量(vx,vy)(v_x,v_y)可以如下得到,该式称为光流公式: 将光流公式和Hermit原创 2018-01-09 16:55:59 · 3715 阅读 · 0 评论 -
H.266帧间预测:模板匹配的运动矢量推导
在JEM中,引入了一种特殊merge模式——帧率上变换FRUC模式。该模式下块的运动信息不需要传输,在解码器端直接推到得到。FRUC模式分为双边匹配模式和模板匹配模式。当merge flag为真的时候,会为CU传输FRUC flag。当FRUC flag是假时,使用正常merge模式并传输merge索引。当FRUC flag为真的时候,一个额外的FRUC模式flag被传输来表示使用双边匹配还是原创 2018-01-04 21:43:44 · 4359 阅读 · 0 评论 -
H.266帧间预测:仿射运动预测
在HEVC中,只有平动模型被用于运动补偿预测。然而在真实世界中,有各种各样的运动,比如放大/缩小,旋转,透视运动和其他非规则运动。JEM中简化的仿射运动补偿预测在JEM中,使用了一个简化的仿射运动补偿预测。如下图所示,一个块的仿射运动域由两个运动矢量表示。 一个块的运动矢量域(MVF)表示如下: 其中(v0x,v0y)(v_{0x},v_{0y})是左上中心控制点的运动矢量,(v1x,v1y原创 2018-01-04 11:41:32 · 5241 阅读 · 0 评论 -
H.266帧间预测:局部光照补偿(LIC)
在HEVC中,已经采用了全局光照补偿加权预测。JEM中加入了局部光照补偿(LIC),是一种基于光照变换的线性模型,使用一个放缩系数a和一个偏移量b。能够自适应的根据每个帧间模式的CU选择是否使用。 Pneigh=a∗Pref+b→a,bP_{neigh}=a*P_{ref}+b→a,b 其中PneighP_{neigh}为当前图像中当前CU的邻近采样点,PrefP_{ref}为参考图像中对应的邻原创 2018-01-03 21:44:01 · 1873 阅读 · 6 评论 -
H.266 JEM编码块结构:四叉树+二叉树QTBT
四叉树+二叉树QTBT编码结构,已经被JVET采纳加入到了新一代编码标准和JEM中。原创 2016-10-08 08:56:23 · 7851 阅读 · 10 评论