图1:消费性媒体产品的简化软件结构。
您在消费性产品的研制中是如何开发音视频软件的呢?本文中,两位专家将根据多年的实际经验给您提供一些指导性的意见。消费性媒体产品中的音、视频软件有时十分复杂,涉及实时信号处理、网络协议、复杂的I/O,以及精细的用户接口。本文探讨了在实现消费性产品中的音、视频(A/V)软件时需要考虑的几个重要方面,尤其是编解码器软件。文中介绍的方法都是在多年开发机顶盒、蜂窝电话、PDA、互联网设备等产品的音、视频软件的经验上总结出来的。
媒体设备的软件组成
消费性媒体设备通常是个复杂的系统,其中包含几个软、硬件子系统。图1给出了主要的软件子系统,其中有播放器、压缩算法(图中以编码器和解码器,即编解码器表示)、I/O模块和实时操作系统(RTOS)。RTOS主要为多任务实时应用提供关键的任务调度和任务切换服务。其中,编解码器是对计算能力要求最大的一部分,在设计这部分时,需要进行大量的软件优化工作。因此,我们在讨论软件优化时,主要讨论编解码器的优化,但我们所介绍的技术也可以用于其他类型的A/V软件。
编解码器软件设计
编解码器的作用是压缩音频和视频内容以便传输或存储,或者将压缩后的内容解压,以便播放。如今在消费性产品上应用的编解码器算法有很多种,表1中列出了几种常用的A/V编解码器算法。
MPEG-2视频算法是当前用得最多的视频压缩算法。MPEG-2标准于1994年发布,至今该算法已经在DVD电影、机顶盒和卫星电视(DSB/DVB)等应用中广泛使用。此外,微软的Windows Media Video和RealNetworks的RealVideo等视频压缩算法也很常用。
用于音频压缩的MPEG格式一般是MPEG-1/2 layer III,也叫“MP3”。Windows Media Audio(WMA)和 Dolby AC-3(也叫做Dolby Digital)在音频压缩上也用得很多。许多便携式数字音乐播放器都支持WMA,而几乎所有的DVD都采用AC-3音频压缩。
根据所选的算法不同,编解码器软件可以由编解码器创建者、芯片厂商或者独立的开发商提供。这些厂商在提供编解码器软件时可以选择多种方式,可以是可读性较高(但效率不高)的高级参考实现,也可以是针对某个特别的处理器进行高度优化的软件实现。虽然常用处理器都有一些现成的优化编解码器实现,但系统开发商往往还是需要针对特定的产品进行编解码器软件的实现、优化,甚至可能是定制。
图2:迭代优化过程。
软件优化
在消费性媒体产品的软件中,音、视频编解码器通常是对资源需求最大的一部分。现今的产品数据率高,采用的算法对计算能力要求也较高,并且常用价格较低(也可能是低功耗)的处理器,因此要想设计出具有竞争力的消费性媒体产品,往往需要对编解码器软件进行仔细优化。即便是在并非严格要求优化的情况下,优化仍是有益的。通过优化可以降低功耗,将处理器资源解放出来以便添加更多其他特性,或者方便较低价处理器的使用。
软件的效绩性能
编解码器软件的优化过程可以针对几个不同的性能方面进行,如软件运行速度、存储器使用情况、能耗大小以及音频/视频质量。有时,在对某个性能进行优化时,另一种性能也得到了优化,而有时不同性能的优化要求又会产生冲突。大多数情况下,开发商都会主要针对运行速度、存储器的使用和能耗这三个方面进行优化,而信号的音频和视频质量只需保持在一个足够的范围内即可。
为使设备具备实时性,通常需要针对软件实现的运行速度进行大量优化。之所以需要进行如此高级的优化,原因主要有二:一是压缩和解压算法(这些算法需要在很高的数据率下执行复杂的数学操作)对计算能力要求很高,二是产品中通常使用的是性能有限的低成本处理器。
优化过程
优化是一个迭代过程,如图2所示,首先进行软件剖析(profiling),然后分析,接着再进行具体的优化实现,重复这个过程直到软件性能满足要求。
软件剖析
第一步是在功能一级剖析编解码器软件,得到每个子函数所需执行时间占处理器总执行时间的百分比,或者每个子函数被调用的次数。剖析结果通常都能够大致符合80/20规律,即20%的软件占用了处理器80%的执行时间,而剩下80%的软件只占用20%的执行时间。在表2中列出的三大类操作中,S-rate的一类操作通常都是处理器负荷的主要来源。
在表2这个分类表中,相邻级别的操作发生的频率相差2到3个数量级,因此,每一级别操作的执行成本也相差2到3个数量级。优化I-rate和K-rate操作通常不会对整个软件的执行时间产生什么影响,因为这类函数出现的频率相对较低。但对出现频率很高的S-rate操作就必须进行彻底的优化才能使软件的效率达到最佳。
信号处理函数中通常既有K-rate的操作也有S-rate的操作。根据80/20规律,编解码器软件中只包含相对较少的S-rate函数。利用这一特性,我们就能极大简化优化过程,因为所有函数中,只有很小一部分需要仔细地进行优化。
在媒体应用软件的优化中可以采用许多种优化技术。本文将这些技术分为两大类:处理器无关的软件优化技术和处理器定制的软件优化技术。
表1 常用的压缩/解压算法。
优化过程通常从剖析后认定的最耗时的函数开始,首先要对函数进行分析,然后才开始制定优化策略。常用的策略是首先考虑采用处理器无关的优化技术,因为这种技术能够保持软件的可移植性。如果还需要进一步优化,才采用处理器定制的优化技术进行高级语言优化,例如算法转换。后者尽管是针对某个特定的处理器进行的,但也不会完全破坏软件的可移植性,只是经过这样优化的软件在其他处理器上可能无法达到良好的性能。最后才考虑在汇编语言一级再进行处理器定制的优化。这种优化能够最大程度地提高软件的效率,但牺牲了软件的可移植性。
处理器无关的优化技术
第一种优化技术就是处理器无关的软件优化。大多数A/V压缩算法都是先用C来实现的,而且通常作者在初次编写一个编解码器软件时并没有考虑使软件效率达到最优。例如,有些参考实现就是以文档清晰而非软件效率为目的。因此,通过修改或者重写高级语言代码往往就很可能大大降低软件的处理和存储要求。例如,许多编译器都采用了一种叫做强度折减(strength reduction)的优化技术,采用这种技术后,就可能用简单的操作来取代那些耗费资源的操作。但有时编译器做得不够好,或者算法的有关信息不足以让编译器应用强度折减技术。这时一个好的程序员应该能够通过重写代码来避免这些耗费资源的操作。如果通过优化技术回避掉的是S-rate操作,那么带来的资源节省将十分可观。
另外还有一些处理器无关的优化技术,包括函数内嵌和存储缓冲的回收利用。通过内嵌函数来平化函数调用层次,将一些常用的低级操作限制在他们自己函数内部,能够大大加快软件的运行速度。回收存储缓冲主要用于减少存储器的使用,但因为这样同时也改善了存储系统的性能(例如提高缓存命中率)所以缓存回收有时也能帮助加快软件运行速度。处理器定制的优化技术
第二种优化技术是处理器定制的优化技术,可用于高级语言或汇编代码级的优化。
1. 算法修改和转换
顾名思义,算法修改就是修改算法的内部操作,以便更好的配合可用的硬件资源。在算法修改过程中,通常都要在使用存储器和进行计算之间作出权衡。例如许多算法都采用了大查找表,这样的查找表占用的存储器空间往往超过了目标系统中可用的存储器空间或者处理器的一级数据存储器(离处理器内核最近的存储器)能够有效提供的空间。这时,常用的方法是通过一些算法步骤来计算出表中原来记录的值,以计算来代替存储查找表。或者采用一种折中的办法,省略查找表中的一些值,将查找表缩小,然后用插值的方式得到从表中省略的那些值。这种方法对存储器的要求比单纯基于查找表的方法小,其执行时间又比单纯依靠算法的方法短。