导读
做了一段时间LCEVC了,主要是看代码,有些迷惑的地方才会对应到综述去看一下对应的技术到底是怎样。慢慢的陆续也算看的差不多了,可以拿出来挨个模块写一下了
看这个作者列表,现在搞LCEVC的这帮人,基本都是V-Nova的人。果然啊,怪不得他们用这个赚钱。
核心观点
codec对于序列的低频分量比较敏感,或者说是比较擅长,那么这部分压缩工作就交给base codec。高频这部分残差信息就单独拿出来处理就好了,因为像素之间的相关性其实还是很强的,所以这个时候利用上采样,就相当于什么呢?我的理解是,相当于我们在做一个条件编码,消除了一部分相关性。
基本架构
基本架构这里还是有一些比较细的东西。
- 增强层1是可选的层
- 只有增强层2有时域预测,并且时域预测是开关是可控的。
- 控制增强层1/2开关,通过qstep控制,qstep=32767,就是相当于都量化为0,就是关。
- 一般是只打开增强层2
- 另外,上采样的比例是可以控制的,1/4或者1/16.
- 也有一种骚操作,是增强层1上采样比例为1,然后qstep!=32767。这样的意思就是:基本层的残差先编码一下,然后再上采样。这样如果有意义的话,我觉得是需要增强层1的量化步长小于基本层的才行。
码流构造
他是先编码完成基本层的编码。然后以SEI或者NALU的形式,加到每个NALU和面。
这里需要一些前置知识哦。基本码流中,是以AU为单位的,就是接入单元,一般一帧图像的所有NALU以及对应的SPS/PPS啥的组成一个AU。
所以LTM编码的时候,就先读基本层的码流,一个AU一个AU的读,然后编码这个AU对应的增强层码流,编码完之后,加到这个AU的后面。
变换
变换核的大小只有两种:22和44。
每次变换前,先将正方形残差块,拉直成为一个向量,然后做DCT。那么采用的就是4或者16个基向量的DCT变换。
代码中,就是每个WxH的残差平面会有,16个W/4 x H/4大小的变换系数平面。
每个变换系数平面,对应到的就是DT的一行,就是某一个频率分量。
可能是觉得采用的块太小了吧,所以没有使用二维DCT。
另外就是编码的时候,好像没有采用zigzag扫描,也就是简单的挨个编码。
时域预测
因为基本层已经做过运动搜索了,所以运送搜索已经没有啥意义了。或者说意义不大,所以也就不传MV了。就是简单的,对于每一个块分别只编码残差变换系数,或在上一帧同位块的残差系数基础上编码差值。然后对比选RDCost小的那个。
所以码流里面就是,每个块会有自己的标志位,标志这个块是预测块还是直接编码块。