x264的CABAC熵编码技术
本文作者:admin
点击:
2006-12-12 00:00
前言:
x264是目前被全世界各地专业人士下载次数极高的原始程序代码。x264是Linux社群的杰作,它官方网站位于Videolan组织中(www,videonlan.org),它同时嘉惠了全球许多厂商和软件工程师。通过它,我们可以揭开H.264/AVC的大部份技术秘密,加快视频产品的应用与开发速度。这是过去H.263标准在公布之后几年内,未曾有过的体验。
x264的特性
2005年12月26日,x264通过Doom9组织(www.doom9.org)的编解码测试,并勇夺冠军。而且,在2005年12月12日第二届MSU MPEG-4 AVC/H.264比赛中,与Ateme H.264并列冠军。它的编码特性简列于下(特殊术语,请参见H.264标准的解释):
● 支持CAVLC/CABAC熵编码;
● 多重参考(Multi-references);
● Intra:所有巨大区块(macroblock)类型(16×16, 8×8, 4×4全部预测);
● Inter P:所有分割(partition),从16×16递减至4×4;
● Inter B:从16×16递减至8x8的分割(包含跳略/直接)
● 速率控制:固定定量器(constant quantizer),单一或多通ABR,可选择的VBV;
● 画面切割侦测(scene cut detection);
● 可适性的B-frame配置;
● 将B-frames当作参考点,或随意的讯框顺序(arbitrary frame order);
● 8×8和4×4的可适性空间转换(adaptive spatial transform);
● 无损模式(lossless mode);
● 可定制的量化矩阵(custom quantization matrices);
● 多重切割的平行编码(parallel encoding of multiple slices)。
熵编码
在汉语字典中,“熵”(entropy)是外来语(应该是日文汉字),它的拼音是di。不过,“di”是它的异译,正确的拼音应该是“shang”,其意义是:“对一个系统中无次序与混乱程度的测度。熵的数值越高,则系统越混乱。”
“熵”原先是来自于热力学的物理观念,因为它与机率和统计学有关,所以也被引用到信息论中。就信息编码理论而言,“熵编码”(entropy coding)的专业解释是:“应用机率方法,将较常出现的数字数据或模型以较少的位数来呈现;较少出现者则以较多的位数来呈现,以达到压缩的目的。”Huffman、run length、MPEG-2、DTS、Dolby Digital、MLP等都属于“熵编码”。
如前述,x264使用CAVLC/CABAC熵编码技术。这种视频编译码技术是收集依时间变化的符号(symbol)的统计数据,以及在这些符号之间存在的相依特性之统计数据,来达到减少位速率的目标。CAVLC的全名是“可适应环境的长度可变式编码”(Context Adaptive Variable Length Coding),CABAC的全名是“植基于环境的可适性二进制算数编码”(Context-based Adaptive Binary Arithmetic Coding),这两者都属于“无损式熵编码”(lossless entropy coding)。
CABAC
相机所拍摄到的视频信号是没有稳定的统计特性的。想要获取这些信号的统计特性,大都必须依靠其视频内容和撷取的方法。传统的视频编码技术是将视频信号映像成一个长度可变的位串流(bitstream)──该串流是由程序语法单元产生的。这种方法是有掌握到一些非稳定的统计特性,但是,还无法掌握到全部的统计特性。而且,一个程序语法单元的高次元(higher-order)统计相依性,在大多数的视频编码技术中常被忽略。CABAC可以提高编码效率,并且能掌握住那些被忽略的统计特性。
CABAC是ITU-T | ISO/IEC的H.264/AVC标准的一部份,它是被“影像通信群组”(Image Communication Group;ICG)开发出来的。简言之,CABAC是结合“可适应式二进制算数编码”和“环境建模”(context modeling)技术,可以达到适应性极强和减少“赘码”(redundancy)的产生。CABAC的架构还包含了一个新的低复杂度的二进制算数编码方法,以及机率预估方法,这很适合以高效率的硬件和软件来实现它。CABAC比一般水准(baseline)的H.264/AVC熵编码技术优异,对视频广播而言,CABAC的视频品质大约是30 dB~38 dB,平均的位速率可以降低到9%~14%。CABAC的主要特性如表1所示。图1是CABAC的环境建模的一个范例。它可以取得“运动向量的绝对值”(motion vector absolute value;MV)。图2是CABAC的二进制运算。
x264是用软件来实现CABAC的功能,这在它的程序代码中可以清楚理解。至于H.264编译码芯片则是将CABAC以及其它功能区块以硬件实现的,由于每家芯片公司的设计方法不同,H.264编译码芯片的内部架构也会有所差异。但是,它们都须遵照H.264的技术标准。