弹性的区块划分与编码侦测
视频编码通常把一张画面细分成小矩形图块作为编码的基础单位,这就是宏区块(MacroBlocks)。VP9对每帧画面采用新一代的宏区块划分方法,在VP8大为16×16(单位为像素或色彩分量)宏区块的基础上,发展出了超级区块(Superblock)的设计。超级区块大可以为64×64,超级区块内可以再细分,用四叉树的结构安排这些区块,把每个超级区块细分成4块32×32的小区块,每个小区块也可以再分成4块更小的16×16区块,尺寸可以继续划分到小4×4宏区块的基础大小。这种设计使画面元素能被更优化地复用,也使得编码压缩效率直接提升约一成以上。
接下来是对每个宏区块中是否有可编码特征进行侦测。在宏区块同一帧画面内的可编码情况叫做帧内侦测(Intra Prediction)。VP9在帧内侦测环节继承了VP8对4×4区块的10个侦测模式,分别为直流、水平、垂直、TrueMotion快速、左对角线、右对角线、水平向上、水平向下、垂直向右、垂直向左。对于较大的8×8到64×64的区块,VP9提供了10个侦测模式,分别是直流、垂直、水平、TrueMotion,以及6个角度侦测,侦测角度分别约27度、45度、63度、117度135度、153度,新增的多角度侦测可以使编码效率提高7%以上。
侦测宏区块在帧与帧之间的变化叫帧间侦测(Inter Frame Prediction),侦测后输出代表运动方向和运动距离的运动向量(Motion Vector)。对于每个16×16及更大的区块,VP9允许有1或2个运动向量。VP8和H.264同代编码的运动向量可以表现1/4个像素的位置变化,而VP9支持1/4像素精度的同时,可适时提升一倍精度到1/8像素,能更有效地表现慢动作。编码以每帧头部标识中的设定来判别是使用1/4像素还是1/8像素精度。宏区块的明度、色度、浓度的变化在VP8中用高6阶差值滤波器来表现。VP9提升精度到8阶差值滤波器,增加了两个分别应对锐利变化和平滑变化的差值滤波器。对于屋顶和天空的交接这种高对比场景,锐利滤波器(Sharp Filter)产生锐利信号,以较少的空间保留锐利的画面。而侦测中的某处陡变异常,呈现和前后相邻帧不一致非自然的尖锐情况,能被平滑滤波器(Smooth Filter)有效地平缓,节省了空间。
为了改善侦测,VP9还使用了两次编码(2- Pass)的处理方式:第一次侦测出属于帧间(Inter)变化的块,第二次依据前次已识别的帧间块构成的未识别边界,对在帧内(Intra)处理的块和前次未能识别的帧间块进行再次比对侦测及编码,能提高帧内块的画质。对于识别宏区块和侦测运动矢量后,以已知信息仍不能完全重建一致的色彩信息,用DCT(离散余弦变换)和DST(离散正弦变换)等矩阵变换和量化记录其残留的变化情况。VP9把传统变换方式应用到较大区块的同时,还新增了ADST(不对称离散正弦变换)来更好地应对信号边缘的情况。
参考帧是在编码或解码下一帧时起到参照作用的对比帧。VP9和VP8类似,用了三种参考帧:以前一帧为参照的LAST_FRAME;以被判定为典型的更早前某帧为参照的GOLDEN_FRAME;以未来的某帧为参照的ALTREF_FRAME。由于为了避免使用MPEG专利,VP9没有采用可以在前后双向参照的B帧,而使用单向参考帧,好像显得VP9不足;但VP9新引入了复合预测(Compound Prediction)的方式,允许存在一些不会被显示的隐匿帧。隐匿帧上的宏区块允许存在2个运动向量,以隐匿帧为参考的其他帧上运动向量会和隐形帧上的对应向量求加权后的均值,而隐匿帧又可以被前后任意某帧做为参考帧。换句话说,复合预测即变相地实现了双向B帧,同时又规避了B帧的专利。
控制码率 提升画质
VP9允许每一帧使用大小不同的分辨率,在编码时会用8阶1/16像素精度的缩放滤镜对运动矢量编码,在解码播放时还原成统一的大小。在用于直播时,这样的功能允许传输中不间断调整码率,一定程度上改善了可适性。VP9对编码后的16×16及以上的宏区块增加了分段(Segmentation)功能,宏区块带有一个段标识(Segment_ID)来判断是否属于同一个段。段数据分散在各帧,上面记录对该段允许使用哪些参考帧、省略系数、量化因子、回环滤波强度等参数,能更好地避免冗余和应对不同的应用需要。比如取在多帧中的一系列区块为背景段,背景段由画面中不变化的区块组成,另行对背景段应用更高的画质参数,能局部提高画质和改善整体主观感观。
编码后把各种区块、运动向量、变换等输出数据使用熵编码器压缩。VP9在熵编码器上也做了改进,其沿用VP8的布尔编码器(Boolcoder)是一种在8bit码元上操作的算术编码,VP9改进为每帧头部都可以存储码元概率的更新信息,可以对编码器中已有的概率信息进行部分更新,使得VP9在帧层面上较前代有一定的自适应性,提高了压缩比。VP9也不再是单纯的有损压缩,还支持无损模式,可以做片源存储,不用担心画质损失。
为了适应多核多线程的硬件发展,VP9的并行解码能力也有所增强。其在帧头部有开启并行模式的标识,只有帧的头部信息需要被以序列方式解码,而各帧的内容可以放入不同的线程进行多线程并行处理。VP9还引入了板块(Tile)的概念,把画面按纵向分成2、4等偶数板块,每个板块也可以被放在不同的线程中分别编码或解码。
VP9支持的色彩空间标准有:Rec. 601、 Rec. 709、 SMPTE-170、SMPTE-240、sRGB。目前谷歌为VP9定义了两种档次的设定:Profile 0可以看成基准档次,支持常见的4∶2∶0色度抽样;Profile 1可以看成扩展档次,增加支持4∶2∶2和4∶4∶4的色度抽样,增加支持Alpha透明通道和用于3D的深度通道(Depth Channel)。