- 11/02
- 2010
-
QQ扫一扫
-
Vision小助手
(CMVU)
摘 要:介绍了H.264解码器结构和解码流程。重点阐述了H.264解码器在ADDSP-BF533上的实现和优化策略。实验结果表明,本文的H.264解码器的实现方法和优化策略较为有效,能够满足DSP实时解码的需求。
关键字:H.264; 视频解码;ADDSP-BF533; 代码优化;直接存储器存取
1 引 言
H.264[1]是由ITU-T和MPEG组成联合专家组JVT制定的视频编码标准,该编码标准可以比先前标准的编码效率和网络传输性能都有较大提高[2]。然而由于H.264为了提高编码效率,采用了许多高计算复杂度的算法,使得编解码计算量很大,因而很难用软件方式进行实时编解码,同时为硬件实现编解码也增加了难度。为了使H.264能在较低复杂度、高实时性的应用系统中实现,必须对其编解码器进行优化。总体而言,H.264的Baseline解码器的复杂度是H.263解码器的2.5倍[3],主要体现在计算复杂度和所需内存储存的提高。Blackfin DSP是美国模拟器件公司(ADI)与 Intel 联合开发的体现高性能系列结构的低功耗,较高性价比的DSP产品。本文主要介绍了H.264解码在ADI公司的Blackfin 533开发板上的代码实现及其优化方法,然后给出实验测试结果。实验结果表明,采用的所提出的实现和优化方案能够完全满足实时解码的需求。
2 H.264解码器的结构和流程
基于DSP的H.264解码器结构如图1所示,主要的内存单元有参考帧缓存,当前帧缓存,VCL缓存,熵解码所需的码表等。主要的计算单元有熵解码,残留系数处理,帧间运动估计预测补偿,帧内预测补偿和环路滤波等模块。
针对1帧解码而言,H.264解码流程可以分成下面几个过程:
Step1: 将网络抽取层(NAL: network abstraction layer)数据转换成视频编码层数据(VCL: video coding layer);
Step2: 访问VCL数据,进行熵编码。解码出的信息包括:宏块的编码类型,一维残留系数,如
果是帧间编码类型有运动矢量差(MVD),如果是帧内编码类型有帧内预测方式;
Step3:如果宏块的编码模式为帧间编码,则计算宏块的各个分割块的运动矢量,访问参考帧数据,如果运动矢量是亚象素,需要进行空间内插,得到帧间运动补偿预测数据。如果宏块的编码模式为帧内编码,根据解码得出的帧内预测方式,访问当前帧缓存,得到帧内预测数据;
Step4: 残留系数处理,每个4×4块依次进行反扫描,反变换,反量化;
Step5: 当前帧的解码重建:如果宏块是帧间编码,帧间预测值和残留系数值相加;如果宏块是帧内编码,帧内预测值和残留系数值相加;
Step6:当码流信息disable_deblocking_filter_idc不为0时,进行环路滤波。
3基于DSP-BF533的硬件实现平台[4]
Blackfin DSP是美国模拟器件公司(ADI)与 Intel 联合开发的体现高性能系列结构的首款第四代DSP产品。ADI公司的Blackfin系列DSP结合了双MAC(乘法累加器)、正交RISC微处理指令集和动态电源管理部件,用以实现对处理器电压和频率的实时调整,二维DMA结构支持专用视频接口,可大大降低实时视频应用的软件开销和系统功耗,从而使得DSP的功率消耗和处理性能的实时性达到最优。此外,该处理器还具有体积小、成本低等优势。Blackfin系列处理器的引脚和代码相互兼容,还提供了与ITU-R656视频A/D、D/A的无缝连接,非常适合应用于实时视频编解码器,尤其是对功耗要求严格的无线视频处理的应用场合。ADSP-BF533的开发平台如图1所示。此平台的中心处理器Blackfin533是一种单核、加载/存储结构的DSP,拥有双MAC以及正交RISC微处理指令集。除此之外,Blackfin533还具有以下特点:双40bit算法逻辑单元(ALU);一个40bit的移位器;4个视频ALU;一个8通道的32bit数据寄存器;148KB的片内存储器(16KB可作为指令Cache,32KB可作为数据Cache);动态电源管理功能等。另外,在Blackfin 533的存储器结构中,DMA 控制器提供高带宽数据转移,能够完成L1/L2 存储器和外部存储器之间编码或数据块转移,并且高速缓冲存储器可以设置,以便处理器和DMA可独立地访问。
4 H.264的ADDSP-BF533的解码器实现和优化
4.1 基于DSP的H.264解码器的代码实现
目前H.264解码器的开源程序有JM [5]和ffmpeg [6],另一个H.264的开源代码x264[7]只提供了编码,解码功能不完全。JM代码由JVT维护,主要作用是为了解释H.264协议,测试H.264编码效率,其代码所能实现的功能十分齐全,但整个代码运算效率低,数据结构混乱,移植到DSP平台上的工作量很大,数据结构的调整也很复杂。ffmpeg代码是基于Linux操作系统的开源代码,能够完成多种音视频协议的编解码功能,虽然ffmpeg代码的运算效率较高,然而该代码是基于PC平台设计,其算法流程、数据结构和DSP平台的兼容性较差。综合上述分析,可以看出无论是JM还是ffmpeg的H.264解码器代码都不适合移植到DSP平台,因此本文的DSP平台的H.264解码器C代码需要重新编写,而不在开源代码的基础上修改。总体而言,代码的编写工作分为以下几个主要阶段:
第一阶段:H.264解码的流程设计,确定各程序模块的功能。本文实现的H.264解码器的档次是Baseline Profile,所以各个模块的安排完全按照Baseline Profile的编码技术功能设计。H.264的Baseline Profile的主要实现的编码功能包括:(1)编码方式有I帧和P帧,不支持B帧,SI帧和SP帧;(2)熵编码方式只有自适应变字长编码(CAVLC),不支持内容自适应算术编码(CABAC);(3)不支持加权预测,不支持数据分割。
第二阶段:针对DSP平台,设计合理的数据结构。ADI的BF533 DSP处理器,其存储器结构采用片内片外两级结构。对于两级存储结构的处理器,访问片外存储器通常要比访问片内存储器慢10-20倍[8]。本文的数据结构安排如下:VLC码表,解码宏块所需的数据设计安排在片内的储存器中,而VCL缓存,参考帧缓存,当前帧缓存,这些数据所需内存较大,安排的片外的扩展存储器中。在解码过程中,需要频繁的访问片外数据。实际测试中,发现频繁的访问片外的数据的效率极低。针对这种情况,本文采用一种“窗口数据读取方式”,定义一个较小的数据结构,将该数据安排在片内存储器。在解码一个宏块时,一次性把需要的数据读取到“窗口数据”中,这样解码过程中不需要反复的读取参考帧缓存中的数据,提高了程序运行的效率。
第三阶段:编写各个模块函数,调试解码程序。按照每个函数的所实现的功能,编写代码。调试时,以H.264的JM代码所生成的Baseline的码流为测试标准,最终实现的H.264解码输出和JM代码解码输出完全一致。程序中的反变换、帧内预测等计算模块以JM代码的算法为基础,但程序中的数据结构、解码控制模块和变字长解码、帧间运动补偿解码、反量化、反变换等计算模块和JM代码相比有较大区别。
4.2 基于DSP的H.264解码器的代码优化
在完成H.264解码器的C代码之后,很容易将该代码通过Blackfin 芯片的开发环境VisualDSP[9]移植到硬件平台。为了得到更好的解码效果,还要进行针对具体硬件平台的指令优化。本文的优化工作主要是两个方面:(1)DMA方式的窗口数据传递;(2)对插值计算代码部分进行手动汇编优化。
Blackfin系列的DSP可以使用DMA进行存储空间内部或者存储空间与外设之间的数据传递。DMA控制器允许Blackfin或外部设备制定数据传送操作,然后返回到正常操作中。DMA传送过程独立于处理器的活动,针对这一特点,本文的“窗口数据读取方式”采用DMA方式读取,可以节省大量的数据读取时间。比如:帧间运动补偿解码模块的DMA传输的过程是在宏块层解码出MVD信息之后,先计算宏块中各个分割块的MV矢量,然后启动DMA读取模式,根据MV从参考帧向“窗口数据”传送数据,同时处理器可以进行当前宏块的变换系数变字长解码(VLD),宏块的变字长解码完成之后,如果判断DMA已经传送完毕,就可以进行具体的插值计算。
虽然VisualDSP 本身已经带有C代码的汇编优化设置选项,但这种优化效果不能令人满意,需要对插值部分的计算模块进行人工汇编指令级优化,具体优化过程需要注意以下几个原则:
(1)节省寄存器资源。Blackfin533 提供了8 个32 位数据寄存器以及一系列的地址寄存器。对于这些寄存器, 应尽可能做到一个寄存器多次使用; 同时在能用较短数据类型的情况下用短的数据类型, 如能用short则不用int , 这样每个32 位寄存器可以作为两个16 位寄存器使用, 相当于增加了寄存器的数量。
(2)使用专用Blackfin指令。Blackfin533 提供了许多视频专用指令, 通过使用这些指令, 能大大提高代码的执行速度。
(3)使用并行指令。对于大多数指令都存在相对应的并行指令, 如一条运算指令可以并行两条数据读取指令。并行指令的使用能成倍提高代码的执行速度。
(4)内层循环展开。Blackfin533 有两个硬件循环器, 可提供两层的硬件循环。硬件循环实现了零开销的循环判断, 能大大提高循环指令的执行速度, 然而数据依赖的存在会阻止硬件循环的使用。所以要尽可能消除循环中的数据依赖。
以H.264的解码中的亮度插值算法为例,简要说明基于DSP的代码级优化过程。由于H.264像素插值运算主要操作可分为取数、处理、存储处理结果三个顺序执行的步骤。循环展开就是将循环的次数减半,两次循环合并成一次,这样在处理第一次循环的同时可以取出第二次循环所需的数据,然后在处理第二次循环的同时再存储第一次循环的结果,从而使效率得到提高。另外,还可以用向量指令来提高运算的效率。比如下面这条指令可以将R0和R1高低16位分别相加,然后放入R2中,这就相当于一次计算两个数之和,从而使效率加倍;同时它还能读入两个待操作的数据。具体指令为:
R2 = R0 +|+ R1 || R3 = [ I0 ++ ] || R4 = [ I1 ++ ]
数据的读入和存储可以用“窗口数据”DMA操作完成。Blackfin533在DMA传送数据前需对相关寄存器进行写操作,以便选择不同的传送模式。主要的寄存器有(1)配置寄存器;(2)内层循环计数寄存器;(3)内层循环地址增量寄存器;(4)外层循环计数寄存器;(5)外层循环地址增量寄存器:仅在二维DMA中使用,作用是当外层循环计数加1时,保存DMA操作地址在内存中的增量。DMA传送数据流程图如图3所示。
5 实验结果
为了说明本文的H.264解码器的实现方案和优化策略的可行性和有效性,我们分别在PC平台和Blackfin 533硬件平台做实验测试。PC平台的实验条件如下:处理器Intel Celeron Tualatin,主频1.0G,内存256M SDR,测试代码分别是JM86[5], 本文的H.264解码程序。以上的代码全部用C语言编写,均没有使用汇编优化,我们所编写的H.264解码程序的实验结果和JM程序结果完全一致。码流由JM代码提供的编码程序生成,编码配置:Baseline Profile,使用RD预测,1个参考帧,运动搜索范围[-32, 32]。实验测试结果如表1,可以看出本文实现的H.264解码程序在相同的条件下,和JM代码相比,解码速度平均提高5倍以上。本文C代码的H.264的解码速度的提高全部主要来源于较为合理的数据结构安排和算法流程,具体实现算法的优化,同时注意到在PC平台上“窗口数据读取方式”会增加一定的计算负荷。
表1 PC平台上解码数据测试结果
序列 | 码流速率(Kbit/s) | JM代码 | 本文C代码 | 速度提升倍数 | ||
每帧解码时间 | 每秒解码帧数 | 每帧解码时间 | 每秒解码帧数 | |||
New | 163.94 | 74 ms | 13.5 | 13 ms | 76.9 | 5.7 |
Claire | 153.80 | 76 ms | 13.1 | 14 ms | 71.4 | 5.4 |
Foreman | 253.60 | 89 ms | 11.2 | 19 ms | 52.6 | 4.7 |
Paris | 494.14 | 85 ms | 11.8 | 18 ms | 55.6 | 4.7 |
在ADI Blackfin533的硬件平台上,经过DMA和DSP指令级优化之后,最终实现了在400kps的码流下,CIF格式、每秒25帧的实时解码,所需时钟周期在420M以下。解码结果完全和JM代码解码结果一致。优化前和优化后的时钟周期测试结果如表2所示。在没有DMA和DSP指令级优化的情况下,只用开发系统的优化选项,如果需要实时解码,所需时钟周期大约在800M,而经过优化之后,需要实时解码,所需的时钟周期在420M以下。从实验数据的结果说明本文的优化效果是明显的,而且完全能够满足H.264实时解码的要求。
表2 ADI Blackfin533平台上解码数据测试结果
序列 | 码流速(Kbit/s) | 时钟周期数(Cycles) | ||
优化前 | DMA和DSP指令优化后 | |||
Claire | 136 | 564M | 213M | |
Paris | 408 | 670M | 321M | |
Foreman | 384 | 798M | 398M | |
Football | 424 | 773M | 412M |
6 结束语
本文主要介绍了在ADI Blackfin533的平台上H.264解码器的实现和优化方法。针对Blackfin 533芯片结构和H.264视频解码流程的自身特点,我们完成了基于DSP平台的H.264解码程序的设计和实现,然后将该代码移植到DSP平台上,进行针对DSP平台的指令级优化。实验结果表明优化效果明显,经过优化后的H.264解码器完全能够满足实时解码的要求。
参 考 文 献
[1] Draft ITU-T Recommendation and Final Draft International Standard of Joint Video Specification [S](ITU-T Rec. H.264 | ISO/IEC 14496-10 AVC), 7th Meeting: Pattaya, Thailand, 7-14 March, 2003.
[2] Jorn Ostermann, Jan Bormans and Peter List etc..Video coding with H.264/AVC: tools, performance, and complexity[J].Circuits and Systems Magazine, IEEE Volume 4, Issue 1, pp:7-28,First Quarter 2004.
[3] Horowitz M., Joch, A., Kossentini, F., Hallapuro, A. H.264/AVC baseline profile decoder complexity analysis[J]. IEEE Transaction Circuits And Systems Video Technology, vol. 13 , July 2003Page(s): 704- 716
[4] 陈峰. Blackfin 系列DSP 原理与系统设计[M]. 北京: 电子工业出版社, 2004.
[5] H.264/AVC Reference Software JM86 [EB/OL] http://iphome.hhi.de/sue hring/tml/download/
[6] ffmpeg source code [EB/OL] http://ffmpeg.mplayerhq.hu/
[7] x264 source code [EB/OL] http://developers.videolan.org/x264.html
[8] M Budagavi, W Rabiner, J Webb and R Talluri.Wireless MPEG-4 video communication on DSP chips[J]. IEEE Signals Processing Magazine,2000:36-53.
[9] AD Inc. Blackfin processor instruction set reference.Rev4.0, May 2005
- 上一条:实时无线视频系统中的传输差错处理
- 下一条:基于元语的语义描述模型构造方法