AVS标准是《信息技术 先进音视频编码》系列标准的简称,是我国具备自主知识产权的第二代信源编码标准。AVS标准包括系统、视频、音频、数字版权管理等四个主要技术标准和一致性测试等支撑标准。
AVS是AviSynth的简称。意思是AVI合成器,就是一个把影像文件从一个程序转换到另外一个程序的过程 , 其间没有临时文件或中介文件产生。对于Rip的人来说,AVS就是基础,就是关键。像VirtualDubMod、MeGuid之类的强大压缩软件都必须通过AVS载入
目前音视频产业可以选择的信源编码标准有四个:MPEG-2、MPEG-4、AVC(也称JVT、H.264)和AVS。从制订者分,前三个标准是由MPEG组完成的,第四个是我国自主制定的。从发展阶段分,MPEG-2是代信源标准,其余三个为第二代标准。从主要技术指标——编码效率比较,MPEG-4是MPEG-2的1.4倍,AVS和AVC相当,都是MPEG-2的两倍以上。
AVC标准中,对预测残差有两种熵编码的方式:基于上下文的自适应变长码(CAVLC)和基于上下文的自适应二进制算数编码(CABAC);对于非预测残差,采用指数哥伦布码或CABAC编码,视编码器的设置而定[1]。
AVS标准所用的熵编码技术相比于以前有了很多改进,它的语法元素和残差系数是由定长码和指数哥伦布码构成的,其中指数哥伦布码和语法元素之间存在多种映射关系。
1 AVS标准熵解码算法描述
在整个AVS视频的解码过程中,熵解码模块位于系统的前端,负责从压缩后的码流中解析出宏块头信息以及量化系数,供后续的帧内预测模块和帧间预测模块使用。而熵解码模块又可以大体分为两个部分:解析K阶指数哥伦布码部分和解析语法元素部分。
解析K阶指数哥伦布码时,首先从比特流的当前位置开始寻找个非零比特,并将找到的零比特个数记为leadingZeroBits,然后根据leadingZeroBits计算CodeNum。用伪代码描述如下:
由于AVS视频中所有的语法元素以及经过变换和量化的残差系数都是以指数哥伦布码的形式映射成二进制码流的,因此在解析出K阶指数哥伦布码的CodeNum后,下一步就是要还原出各种语法元素和残差系数。
在AVS标准中规定了四种映射方式:ue(v)、se(v)、me(v)和ce(v)。其中ue(v)、se(v)和me(v)所描述的语法元素采用0阶的指数哥伦布码,ce(v)用来描述残差系数,可以采用0阶、1阶、2阶或者3阶指数哥伦布码。它们的解析过程如下:

ue(v):无符号直接映射,语法元素的值等于CodeNum;
se(v):有符号映射,映射关系为:当CodeNum=k时,语法元素值为(-1)k+1×Ceil(k÷2)
me(v):分为MbCBP和MbCBP422两种模式,分别根据CodeNum的值,查找相对应的表来得到语法元素的值。
ce(v):ce(v)描述的语法元素可以采用0阶、1阶、2阶或3阶指数哥伦布码进行解析,还有19个相关的码表。解析时,首先语法元素trans_coefficient等于CodeNum,如果trans_coefficient小于59,可以根据trans_coefficient的值查找相关的码表得到残差系数;如果trans_coefficient大于等于59,解析下一个ce(v)语法元素,得到一个新的CodeNum,escape_level_diff等于CodeNum,然后根据trans_coefficient和escape_level_diff求得残差系数[3]。
2 熵解码器的硬件设计
由于熵解码器位于整个解码结构的前端,所有后续模块中需要用到的数据都是熵解码模块从原始码流中解析出来的,因此熵解码器性能的优劣直接影响到整个AVS视频解码器的性能。
这种串行解码的方式严重限制了熵解码器的性能,所以需要找到一种能够并行解码的方式。这里的并行解码并不是指同时对好几个码进行解码,而是针对一个变长码的多个位来说的。具体来说就是读入N位数据,通过比较操作,得到码长,使得解码可以在确定的时间长度内进行,而不是随着码长的不同而变化。
整个熵解码器可以分为四个模块:数据准备模块、解指数哥伦布码模块、语法元素解析模块和解码控制模块。硬件结构如图1所示。

下面通过分析码流数据的解析过程来逐个说明各个模块的功能和实现。
2.1 数据准备模块
这个模块的功能是为后边的解指数哥伦布码模块准备好未解码数据,要求解指数哥伦布码模块解完一个码,数据准备模块就要在码流中将解完的码移走,并准备好下一个要解的码字送给下一模块。硬件结构如图2所示。

RegA和RegB是两个32位的寄存器,其中RegB直接从未解码码流中读取数据,RegA则接收RegB中的数据,两个寄存器共同组成barrelshifter的输入。
barrelshifter是一个64位输入、32位输出的暂存器,每次输出都将刚解完的一个码字移出,以保证输出的32位数据中位为下一个要解码的码字的开始。移位的位数由输入的地址Addr来决定,即输出64位输入的[Addr,Addr+31]位。
当En信号有效时,更新数据,将RegB中的数据存到RegA中,再从码流中读取新的32位数据,存到RegB中。其中Addr和En信号由解指数哥伦布码模块给出。
2.2解指数哥伦布码模块
指数哥伦布码由3部分组成分别是:码流中非0比特位前0的个数(leadingZeroBits)、一个1位和非0比特位开始leadingZeroBits+k位码流数据,表1为k阶指数哥伦布编码表;码字的编码方式为:
codenum=2n+k-2k+readbits(n),n=leadingZeroBitsAVS中k的阶数取值范围为0~3。
AVS中定义了4种描述符来表示指数哥伦布编码的语法元素,分别是u(e),s(e),m(e),c(e),其中:描述符ue(v)表示语法元素的值等于CodeNum;se(v)根据表2 中给出的有符号指数哥伦布码的映射关系求语法元素的值;me(v)根据标准中规定的映射关系求语法元素的值;ce(v)用于表示指数哥伦布码与残差系数(2D-VLD) 的映射关系,ce(v)描述的语法元素采用0 阶、1 阶、2 阶或3 阶指数哥伦布编码进行解析,对应还有19个码表供查找
这个模块的功能是接收上一模块准备好的未解码数据,计算出从位开始的一个指数哥伦布码的CodeNum,并根据这个码的码长算出筒形移位器的移位地址。模块结构如图3所示。

由于上一个模块准备好的未解码码流是一个以新的指数哥伦布码的开始为位的32位码流,因此要计算出这个码的CodeNum,首先要算出这个码的码长,然后在这32位数据中截取出这个码字,才可以计算它的CodeNum。根据指数哥伦布码的结构,码长与这个码的前导零个数M和阶数K有密切关系,可以总结出一个公式:CodeL=2×M+K+1。码长计算模块就是根据这个原理来计算码长的,首先通过一组比较器检测从位开始有几个零,然后根据上述公式得到码长。
在运算器中,累加器是专门存放算术或逻辑运算的一个操作数和运算结果的寄存器。能进行加、减、读出、移位、循环移位和求补等操作。是运算器的主要部分。在中央处理器CPU中,累加器(accumulator)是一种暂存器,它用来储存计算所产生的中间结果。如果没有像累加器这样的暂存器,那么在每次计算(加法,乘法,移位等等)后就必须要把结果写回到内存,然后再读回来。然而存取主内存的速度是比从数学逻辑单元(ALU)到有直接路径的累加器存取更慢。在汇编语言程序中,累加器——AX是一个非常重要的寄存器,但在程序中用它来保存临时数据时,将其转存到其它寄存器或内存单元中,以防止在其它指令的执行过程中使其中的数据被修改,从而得到不正确的结果,为程序的调试带来不必要的麻烦。
累加器模块是一个模为32的加法器,将码长计算模块计算出来的码长CodeL累加到上的移位地址上,得到一个新的移位地址,筒形移位器根据这个新的地址,将本次解码的码字移出,准备好下一个未解码码流。En为进位输出,当累加器的En为1时,说明已经解完了32位数据,这时需要对RegA和RegB进行数据更新。
计算码字的CodeNum时,首先根据码长计算模块算出来的码字长度,从上一模块准备好的未解码码流中把本次要解码的码字截取出来,抛弃无用的位,然后再根据公式CodeNum=2leadingZeroBits+k-2k+read_bits(leadingZeroBits+k)计算这个码字的CodeNum。显然这个公式太过复杂,不适合直接硬件化,但是经过分析公式以及指数哥伦布码的结构,可以改造一下公式。因为指数哥伦布码的结构为前面M个前导0,中间一个1,后面M+K位数据组成,而read_bits(leadingZeroBits+k)即为后面M+K位数据的码字值,2leadingZeroBits+k正好为中间那个1的码字值,所以一个码字的CodeNum就等于这个码字的码字值减去2k,这样对CodeNum的计算就大大简化了。
2.3 语法元素解析模块
顾名思义,这个模块就是终解析出语法元素含义的模块,它接收上一模块计算出来的CodeNum值,然后主要通过查表的方式解析出这个码字所代表的语法元素含义,结构如图 4所示。

这里主要介绍下复杂的ce(v)部分的解析过程。
逃逸码判断模块:在解析ce(v)语法元素时,首先要判断是否为逃逸码,即CodeNum<59时,按照正常ce(v)语法元素解析规则解析;CodeNum≥59时,下一码字为逃逸码,则按照逃逸码解析规则解析。
3 测试与验证
将本文提出的熵解码器结构设计用Verilog HDL实现,用ModelSim在综合前进行仿真,仿真模型如图5所示。AVS标准参考软件产生测试码流数据,将测试码流数据输入硬件描述语言仿真模型,然后将输出数据与标准输出对比,实现仿真功能。经过测试,硬件熵解码后的数据与软件熵解码后的数据完全一致。

整个电路使用Altera的QuartusII 9.0软件进行综合,使用的LE总数为1 906个。变字长解码器模块是AVS解码器的一部分,综合后与其他部分集成,通过了FPGA验证,采用CycloneII系列的EP2C35型FPGA,其频率能达到94 MHz,可以实现AVS高清晰度视频的实时解码。图6为ce(v)解码模块的功能仿真结果图。

本文提出了一种基于AVS标准的熵解码器的硬件结构,从总体设计到各个模块的设计都使用了流水线、并行处理、可重用设计等硬件设计的思想和方法;采用Verilog硬件描述语言实现,并通过FPGA进行了验证,达到了标准清晰度实时解码的要求。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。