部门代码编码

2024-08-20

部门代码编码

1.部门代码编码 篇一

在过去十年来, 随着人们对数字电视, 有线/无线可视电话, 多媒体应用和视频在介质上存储的广泛关注, 视频压缩编码技术有了巨大的发展。目前最常用的技术是基于运动估值, DCT的混合视频编码方案, 并出现了ITU-T H.261/3、MPEG-I/2、MPEG-4等国际标准。这些技术的计算密集的特点对其实时实现提出了挑战。

采用DSP进行视频压缩不仅缩短了开发时间而且具有高度的适应性。但由于DSP系统存储器资源相当有限, 所以必须对编写的程序进行优化。本文从改写程序代码的角度, 提出了减小存储器占用的策略。

本文软件环境为TI公司的CCS 2.1。系统优化的硬件平台采用了TI公司提供的评估板 (EVM) 。

2. MPEG-4简介

MPEG是活动图像专家组 (Moving Picture Expert Group) 的英文缩写。它的任务是开发运动图像及其声音的数字编码标准, 成立于1988年。专家组最初的任务有三个:实现1.5Mb/s、10Mb/s、40Mb/s的压缩编码标准, 即MPEG-1, MPEG-2, MPEG-3。但因为MPEG-2的功能已使MPEG-3为多余, 所以MPEG-3于1992年撤销。MPEG-4项目是1991年5月建议并于1993年7月确认, 其目标是甚低数码率的音频压缩编码 (码率低于28.8Kb/s) 。

MPEG-4[1]的视频部分支持以下功能:高效压缩、基于内容的交互 (操作、编辑、访问等) 及基于内容的分级扩展 (空成分级、时域分级) , 以基于内容的方式表示数据。MPEG-4基于内容的功能支持视频对象V O P (V i d e o O b j e c t Plane) 间的分离编码和解码;这一特点为用户的交互控制提供了最基本的机制;对压缩的图像和视频的VOP进行灵活的表示与控制, 而不必在接收端做进一步的分割和变换编码。

3. MPEG-4编码程序优化

本文利用现有的能在PC机环境下运行的MPEG-4 Simple Profile视频编码C代码。因为它是作为一个可调用的编码库存在的, 又将其修改成为一个独立的编码器程序。这样一个在PC机上正常运行的程序要移植到DSP-EVM硬件平台上还要注意一些问题。下面就这些问题进行一一论述。

起初原始程序移植到DSP平台上时, 效率是十分低下的。利用CCS的profile功能, 统计出编码QCIF格式的1帧就需要1000M个CPU周期。其中90%时间都花在了DCT上, 因此先把DCT模块作为优化的首选。

3.1 DCT/IDCT模块优化

DSP的仿真调试工具中自带了专门用于图像处理的库函数, 这些函数是经过手工汇编优化的, 效率很高, 其中有DCT/IDCT模块, DCT模块需要的周期数为:

48+160*需要DCT的8x8块的个数

因此, 完成一个亮度宏块和两个色度块共6个块的D C T只需48+160*6=1008个周期。同样, IDCT模块所需的周期数为:

62+168*需要IDCT的8x8块的个数

完成6个块的I D C T需要62+168*6=1070个时钟周期。

这样, 把DCT/IDCT模块用汇编替代, 替代的时候要注意汇编模块要求的数据存储格式, 两个模块均需要数据按照块的顺序连续存储下来, 同时, 数据类型为short型, IDCT模块另外还需要在数据的末尾增加一个块的存储空间。于是, 在程序中定义一个数组为block。这样替代之后, 新的DCT并未降低图像质量, PSNR没有显著变化。

重新统计后, 做6个块的DCT仍需要19142个时钟周期, IDCT仍需要13062个时钟周期, 这是因为待处理的数据 (block存放在外部的SDRAM中, 读数据需要很长的等待时间, 从而造成流水线的停顿, 这可以通过CCS统计出来。对一次共6个block的DCT/I DCT进行统计, 得出表1中的结果。

从表1可以看出, 在总的block数中, 实际操作 (Execution Packet) 的个数远远小于流水线停顿的次数。造成流水线停顿的原因有两个, 一个是程序中存在跳转, 一个是由于慢速存储器造成的Memory停顿。因此, 程序运行总的周期数=Execution Packet数+Pipeline Stall个数。

由于待处理的数据存放在外部SDRAM中, 读取数据需要多于一个时钟周期的延时, 从而导致经过手工优化的代码不能很好的发挥其流水线的优势。因为手工优化的代码是假设数据存在内部RAM中, 从而不存在由于存储器的时序造成的延迟。这样, 得出一个结论memory是一个瓶颈问题。必须充分利用快速存储器, 同时尽量节省程序和数据的存储空间。

3.2 从Memory占用的角度优化C代码

在嵌入式系统应用中, 充分利用存储空间是非常重要的。特别是对于快速存储器的利用往往是影响一个系统性能的关键性因素。下面从几个方面来说明如何最优化地利用存储器资源。

3.2.1 数据类型问题

由于在PC机上运行程序时, 有足够的存储空间可以利用, 所以往往C语言程序中往往不太考虑对于空间的占用的问题, 变量的定义也比较随便, 有些可以定义成short的数据也定义成了int。但对于高效的DSP程序来说, 存储空间的使用是十分重要的。

一方面, DSP系统本身的存储空间就是有限的;另一方面, 程序代码如果足够短, 可以放在内部程序RAM。这样, 取指令就不需要延时。或者程序代码太长, 必须放在外部存储空间时, 较短的程序代码也可以提高cache的命中率。短的数据宽度更便于利用DSP数据处理的并行性, 例如相邻两个半字的处理, 可以用一个字的处理来代替等。

3.2.2 Memory的配置

给定了这些有限的memory资源后, 如何对程序合理配置这些资源是非常关键的, 因为慢速存储器造成的流水线停顿是造成程序性能低下的关键因素。

一个C语言源程序经过C6000编译以后, 生成的汇编文件包括如下分段[26]:

a) 初始化分段:

.cinit:变量初始化和常量表格

.text:可执行代码的空间

.switch:大的switch语句表格

.const:字符串, 浮点常量, 以及定义为const的数据

b) 未初始化分段:

.stack:存放局部变量以及函数调用时, 用于保存现场和参数传递。

.sysmem:用于动态内存分配的空间

.bss:全局和静态变量的空间

.far:说明为far的全局和静态变量

以上这些分段均可以根据系统的配置映射到不同的物理存储空间。下面就一些关键的分段说明其配置方法。

.text分段:由于生成的可执行代码即.text分段的长度大于64KB, 所以只能放在外部存储器, 而把内部程序RAM作为cache。

.stack分段:系统最常使用的变量往往是一些局部变量, 而局部变量是存放在栈中的, 所以需要尽量减小系统栈的大小, 使之能够放在D S P内部的数据RAM。.stack分段中除了局部变量之外, 还有函数调用时的某些参数, 函数的返回地址, 函数调用时的保存的中间变量等。将一些调用次数较少的函数直接用函数体代替, 可以减少由于函数调用而增加的现场保存, 也不会使代码长度增加很多, 从而提高效率。

.sysmem分段:在方法学中曾经提到存储空间静态配置的问题, 因此应用在这里就是将动态中请的空间静态化。在MPEG-4的原始程序中多次进行了动态空间的中请, 这些动态中请的空间均存在于堆中。由于动态的中请和释放空间本身就是比较耗时的, 另外由于这些空间都存在于一个分段, 且数据量很大, 因为原始帧数据, 以及编码重建帧, 参考帧, 误差帧等都是动态中请的, 所以只能放在一块巨大的外部存储空间, 这样如果想对其中的某些数据块进行专门的配置就很难了, 因此, 程序中把动态空间用静态数组来代替, 然后就可以对数组指定特定的存储空间。

经过上述的m e m o r y的配置后, MPEG-4程序的堆和栈都足够小, 可以放在DSP内部RAM, 其它的分段除了程序代码外, 基本都可以放在内部RAM, 对于较大的帧存数组也进行了合理配置, 从而使得整个程序的性能大大提高。

4. 结论

本文通过对原有的MPEG-4的C代码中的DCT/IDCT模块进行优化使得C代码的运行效率得到了提高。对memory进行合理配置后使得整个程序的性能大大提高。另外还可以通过对CCS进行设置, 已达到更充分的优化。

摘要:MPEG-4视频编码的C代码直接在DSP上运行具有效率低和占用存储空间较大的问题。本文通过对DCT模块和存储空间的配置, 使得优化后的C代码的运行效率得到了提高, 并且降低了占用的存储空间。

关键词:MPEG-4,DSP,优化

参考文献

[1]Lulin Chen, Zhihai He, Sethuraman, S., Chang Wen Chen.MPEG-4encoder implementation on MAP-CA.Consumer Electronics, 2002.ICCE.2002Digest of Technical Papers.International Conference on, 2002.Page (s) :276-277

上一篇:国有企业改革工作汇报下一篇:小学三月三活动方案