H.264中二进制化编码器的FPGA实现

随着数字电视及视频会议的发展以及应用,H.264由于其更高的压缩比、更好的图像质量和良好的网络适应性而备受关注。基于上下文的自适应二进制算术编码(CABAC)则作为H.264编码器系统的最后一环,对整个编码性能影响较大。CABAC充分考虑视频流的相关性.能适应信号统计特性的变化,容易达到渐进性能,编码速度较高,但复杂度大,这造成单纯用软件编码难以达到很高的性能,特别是对于高清晰度视频(HDTV)不能实现实时编码,这就需要硬件加速或设计专门的硬件编码电路。目前,已有相应的硬件加速电路设计问世,但主要是对算术编码部分进行设计,整体性能仍不够理想。这里在对以往加速电路分析的基础上,把握CABAC整个编码原理,主要对其中的二进制化部分进行优化,对相应的二进制化方法进行归类优化,采用并行运算的方案,最终在FPGA上以较优的速度和资源实现硬件编码。2 二进制化原理    CABAC实现方案包括3个过程:语法元素的二进制化、上下文建模、自适应算术编码,图1是CABAC编码器基本结构。    二进制化是CABAC编码的第1步,提高二进制化模块的编码速度有助于整个系统速度的提高。在二进制化过程中,一个给定的非二进制语法元素被唯一地映射到一个二进制序列(Bin String),其中的每一位称为Bin。    如果输入为给定的二进制语法元素,则此步就可以越过,随后的步骤由编码模式决定。在H.264标准中。语法元素较多,约有20多种,而二进制转换使这些语法元素的二进制表示接近最小冗余编码,以减少码流。    CABAC中二进制转换有4种基本类型:一元(U)编码、截断一元(TU)编码、指数哥伦布(EGK)编码和定长(FL)编码。另外,还可通过这几种编码方式的串联进行二进制化转换。2.1 一元(U)二进制转换方案    对于一个无符号语法元素x≥0,CABAC中的一元码字是由x个“1”串连并在结尾处加上“0”,因此一元二进制化的长度是x+1,如表1所示,其中Binldx表示字符串的索引。一般来讲,U二进制转换主要用于参考帧队列预测语法元素的编码。2.2 截断一元(TU)二进制转换方案    截断一元二进制化对语法元素的值有要求,只对不大于某个界限值(S)的语法元素进行二进制化。若语法元素值小于S,则其二进制化结果同一元二进制化;若语法元素值等于S,则其结果为S个“1”。一般,TU二进制转换主要用于帧内色度预测模式的编码。2.3 指数哥伦布(EGK)二进制转换方案    EGK编码最初由Teuhola在上下文控制长度编码方案中提出,是由Golomb编码派生的。EGK编码由一个前缀和后缀码字串联构成,其前缀部分由一元码字l(x)=[log2(x/2k+1)]的值组成,其后缀部分由x+2k(1-2l(x))计算得出。一般,EGK二进制转换主要用于残差以外数据的编码,具体情形视编码器的设置而定。EGK二进制化随后取值的不同而不同,k的取值为非负整数。2.4 固定长度(FL)二进制转换方案    固定长度二进制化适用于语法元素值x小于界限值S的情况。方法为直接用x值的二进制表示形式作为其二进制化结果,长度同定为:lFL=[log2S]的向上取值。一般,FL二进制转换被用于统一分配的语法元素,编码块的图形符号部分关系到亮度残差。2.5 基本二进制转换的串联方案    由以上各种二进制方式可以再推导出3种基本的二进制转换方案。第1种是4位FL前缀与TU后缀(S=2)的串联,而第2和第3种方案来自TU和EGK二进制转换,称为UEGK。这些方案被用于运动矢量微分和变换系数取绝对值。另外语法元素mb_type和sub_mb_type二进制化使用遍历二叉树方法,对应的二叉树已在参考文献中给出。3 二进制化编码方案优化    H.264标准中的二进制化编码流程是串行的,适合软件的实现,但由于待编语法元素较多,导致执行速度慢且效率低下。而硬件实现的最大优势在于其并行性,可大大提高执行效率。因此,为提高编码速度,在不改变算法实质的前提下,对标准中的编码流程进行相应优化,以利于硬件实现。主要提出以下优化措施:    (1)将语法元素归类按照基本的编码方法及H.264对各语法元素的要求,可将20余种语法元素的二进制编码方法归为6类,包括U二进制化、UEGKO二进制化(k=0,uco-eff=14)、UEGK3二进制化(k=3,ucoeff=9)、宏块/子宏块类型二进制化、宏块量化偏移二进制化,定长与截断串联的二进制化。将语法元素归类,将有效减小编码过程中的繁杂和无序性,有利于编码正常完成。    (2)并行化设计语法元素的二进制化方法可归为8类,在设计中,采用控制单元辨别相应的语法元素,并送入二进制化模块进行编码。但依照H.264标准设计,二进制化单元的入口地址不仅取决于语法元素的值,还取决于语法元素的种类,这种数据依存关系无疑增加了运算量。且输出是串行,不利于流水线设计,这样就将降低系统的时钟频率。故采用一种并行设计方案,以语法元素值为输入,结果得到6个不同的输出,将它们锁存后,利用多路选择器以语法元素种类作为控制端选出所需的值。两种不同的实现方式见图2。4 二进制化编码的FPGA实现    改进后的二进制化编码主要包括:控制单元、二进制化编码单元及选择输出单元,如图3所示。    电路主要分为5级流水线实现。在第1级流水线中,语法元素(SE)、时钟信号(clk)、上下文模型参量(a、b)等输入数据进入控制单元。控制单元采用比较器实现,通过比较给定数值与输入数值的范围确定语法元素的种类,通过种类信号(selector)输出选择所采取的二进制化方式。第2级流水线包含6个模块,分别代表6种二进制化方法。其中U编码、mb_type/sub_mb_type语法元素编码模块较易实现。因为输入语法元素的位宽为6位,数据量不大,分别按照其编码方法制成码表,且此码表所耗资源不多,在硬件实现时以RAM的方式实现,速度较快。对于UEGK0和UEGK3 编码模块的实现,则需采用U编码和EGK编码相结合的硬件方式完成,具体基本结构如图4所示。    图4中,首先由预处理器判断目前比特所进行的编码,在EGK编码中,主要采用首一检测及桶形移位技术实现,最后将两种编码相加输出。    对于UEGK0和UEGK3编码模块,只需选取不同阈值可实现。对于语法元素mb_qp_delta,采用有正负符号的EGK编码,正负号由语法元素值的奇偶性决定。对于语法元素coded_block_patterm,则采用FL与TU相结合的编码方式,因FL与TU编码的数据量均不大,故采用查表方式实现,这样可提高速度,其中FL编码的界限值为15,TU编码的界限值为2。   第3级流水线的主要功能是选择。第2级输出包括已编元素(binary_value)和上下文模型参量(ctxOffset0、ctxOff-set),在第3级中,通过选择信号(selector)对不同输出作以选择。第4级流水线为32位先进先出(FIFO)存储器。对结果进行缓存,有利于下一级处理。    第5级为串行化器,主要对二进制化的数据进行处理,使其按位输出,并将二进制化后的每一位加入其对应的上下文模型,以便后续处理。整个系统的输出即为二进制化后的每位数据(sda)及其偏移(ctxIdxl)。5 电路仿真及性能分析    该算法经VC++仿真验证,可对H.264标准中的主要档次视频码流进行编码,其结果与H.264标准程序JM8.6相同。电路结构采用Verilog语言进行RTL级描述,并用mod-elsim6.0软件仿真,后仿真波形如图5所示。    由图5可看出,每个周期中,在使能信号有效的情况下,在时钟的上升沿,可产生1 bit数据sda及相应的偏移量ctx-Idx1,满足设计时序要求。电路在Spartan3 FPGA上综合、布局布线,使用Synplify丁具进行综合,最高时钟频率为100 MHz,影响时钟频率的关键路径为先进先出存储器模块。将综合好的edif电路网表文件输入到后端FPGA厂商Xilinx的Foundation软件进行布局布线,生成二进制流文件,逻辑单元为171,占总资源的4%。使用设计的电路对H.264标准中一些标准视频序列进行测试,序列质量为QP=28,并与H.264标准程序JM8.6中二进制化部分的编码时间比较,结果如表2所示。    综上,本文对H.264编码器二进制化部分的优化使其在速度上较软件实现有较大提升,资源占用率也较少。二进制化部分的硬件设计不仅能完成H.264标准中基本档次的编码,还有望应用于更大尺寸更高质量的实时视频压缩编码。6 结论    在对H.264标准中二进制化部分研究和分析的基础上,提出其FPGA电路结构,采用并行结构及流水线方式设计电路。该结构经Spartan3 FPGA实现,其吞吐量为每周期1 bit,最大时钟频率为100 MHz,能够满足H.264中第3级及其以上档次实时视频编码的要求。来源:国外电子元器件 作者:王琨,吴宗勇 福州大学