摘要:本文完成了视频服务器的硬件设计,针对如何充分发挥DM642硬件平台的处理能力,提出了关于AVS-M算法的编码优化方案,该方案是对软件框架流程进行仔细考虑后提出的,避免了冗余操作,针对存储系统对各部分的数据结构进行了设计,而且通过DMA实现了计算与数据传输的并行处理。
关键字:AVS-M; DM642;视频服务器;实时编码
1引言
AVS是具有自主知识产权的数字音视频编解码技术标准,其包括系统、视频、音频、数字版权管理等四个主要技术标准和一致性测试等支撑标准。其中,移动视频标准AVS-M (AVS第七部分)适用范围包括视频会议、可视电话、移动多媒体等领域。
TMS320DM642是TI公司开发研制的一款专门面向多媒体应用的专用数字信号处理芯片,使用此DSP芯片并利用AVS-M算法来进行视频压缩,可大幅提高视频压缩率,减少传输流量,即使在低带宽情况下也可以有效保证实时性和监控需求。
我们开发的IMlab6421视频服务器,是基于Internet 的视/音频监控设备。核心DSP芯片采用DM642芯片。而应用软件、视频压缩算法是根据AVS-M标准进行设计、优化的。下面针对这款视频服务器的系统结构、视频优化的软件设计等进行详细的介绍。音频压缩的优化本文不做介绍。
2 硬件设计
视频服务器IMlab6421原理框图如图1所示,系统采用TMS320DM642 用于音视频压缩。DM642芯片包含一个64位的外部存储器接口,可驱动4个片选地址空间(CE0,CE1,CE2,CE3),它支持8,16,32,64位宽度的同步和异步访问。我们在 DM642的片外扩展了16M Bytes的SDRAM,位于EMIF的CE0地址空间,用于存放程序和数据。SDRAM工作时钟为100MHz,是由DM642芯片的CPU工作时钟6分频产生的。数据更新由DM642自
动完成。还在DM642板上设计有512K Bytes的Flash存储器,位于DM642的CE1地址空间,宽度为8 bits。另外能实现与Internet连接的以太网处理器采用的是CRYSTAL公司的
CS8900A,它高度集成设计使其不再需要其它以太网控制器所必需的昂贵外部器件。
视频编码工作原理大致为:输入的模拟视频信号经TVP5150(支持PAL和NTSC两种制式)被数字化为YUV4:2:2的数字视频格式,经由I2C总线被送至输入缓冲区(采用三缓冲机制), DM642的CPU把捕捉到的视频数据从一个输入缓冲区中取出待编码图像数据进行压缩编码处理,形成的压缩码流放到输出缓冲区,然后打包通过网口直接传输到Internet。
图1 IMlab6421硬件原理框图
3 软件设计
DSP嵌入式程序受硬件资源的限制,对程序流程和数据组织需要从硬件资源和代码运行效率上做仔细的考虑。通过分析AVS-M编码器的程序流程,借助实验中积累的经验,本文给出了AVS-M编码器的优化方案,主要介绍Cache性能优化、存储空间的分配以及CPU与DMA的并行性设计等。
3.1存储结构及CACHE性能优化
(1)存储结构:DM642的存储器系统由片内内存L1、 L2和片外外存两部分组成,L1, L2和片外SDRAM构成了整个存储器系统的三级层次结构,如图2所示。其中,片内内存采用两级缓存结构,第一级由L1P和L1D组成,L1距离DSP核最近,数据访问速度最快,只需一个时钟周期,只能作为不能寻址的Cache使用。第二级L2是一个统一的程序/数据空间,可以整体作为SRAM映射到存储空间,也可以整体作为第二级Cache,或是二者按比例进行组合。第三级是片外外存,一般由SDRAM构成。L1P cache大小为16KB,直接映射,每行大小32 字节;L1D cache大小16KB, 2路映射,每行大小64 字节。L2是L1和外存储器的中间层,容量较大有256KB,访问速度较慢,根据 L2 配置为Cache 或SRAM 的不同选择,访问速度需8个或6个时钟周期。片外存储器容量很大但访问速度很慢,一般都会远远大于 8 个时钟周期。
图2 三级存储系统
(2)CACHE性能优化:要优化Cache的使用性能需了解Cache的具体结构,如Cache容量、行大小、组相联数等。下面总结了一些优化Cache性能的方法:合理配置L2;合理布置程序代码段和数据段的内存布局,为防止有效代码、数据在缓冲存储器中相互排挤,应尽量把顺序执行的代码、同时使用的数据放在相互邻接的物理空间当中;若函数模块和数据包含在一个循环中,循环体的大小应和Cache的容量相吻合,以便能把整个循环体全部放入Cache中。为了提高Cache中数据的重复利用率,把数据操作构成一条数据处理链,链中的下一级操作就能直接使用上一级操作留在Cache中的数据。此外还可以根据Cache行数据宽度信息调节数据在物理内存中的存放位置,从而利用数据预取增加Cache的命中率;挖掘L1D的不命中流水处理能力,加速待使用数据的读入速度;通过合理的数据填充策略,避免同一时钟周期对相同存储体的读写操作将造成存储器的存取冲突。
3.2存储空间的分配
在DSP上由于内存空间有限,需要合理分配内存空间,这对于程序的运行效率十分重要。使用的一个原则是:应尽量把数据和代码放入片内存储器。因为外存比CPU工作的速度要慢很多,如果用CPU来处理访问外部存储器的工作,大量时间将浪费在存取等待上。
DM642的L2片内存储器可以配置为SRAM或Cache。由于编码器的数据流程是有规律的,因此我们考虑用程序控制DMA控制器来进行内存和外存之间的数据交换,这样比硬件自动地来处理效率要高。
由于片内存储器容量的限制,不可能将编码器的所有数据都放入片内存储器。原始图像和重构图像是无法完全放到片内存储器中的。事实上,没有必要将这些数据放在片内,因为编码器的处理过程是以宏块为单位的,我们只需要在片内维护一个宏块的数据结构,CPU访问这些数据进行计算。每编码一个宏块的时候把该宏块需要的数据从外存调入内存,填到相应的这些数据结构中。利用DM642提供的QDMA机制,CPU发出QDMA请求后就可以继续对其它数据进行计算,由DMA负责将数据从外存调到内部存储器。因此如何设计使CPU与DMA之间协调工作很重要,本文2.3部分将详细讨论这个问题。
需要注意的问题是当前宏块编码过程中需要用到前面编码已经获得的一些信息。参考代码中是保留所有宏块的编码信息,这样的做法是不适合DSP实现的,需要的存储空间太大,片内存储器无法容纳。实际上编码当前宏块只需要参考它上面和左面的宏块。因此设计编码器中各模块的局部数据结构如图3所示。该数据结构保留上面一行的值和左边宏块的值,每编码完一个宏块,确定当前宏块的信息后更新这些缓冲区,这些数据可以放在L2中,不用访问外存。而且实验证明用来维护这样的数据结构所需要的计算时间很小。
图3模块的局部数据结构
经过优化的程序和常用的数据结构的大小可以放在L2中。所以按照上面的分析将L2配置为256KB SRAM,将程序代码段(.text)、变量初值表(.cint)、常量字符串(.const)、全局变量静态变量(.bss/.far)、堆栈段(.stack)等放入L2 SRAM当中,全局堆(.sysmem用于动态存储器分配)置于外部存储器。表1总结了编码器所要用到的存储空间分配情况。
表1 编码器存储空间的分配
数据名称 |
大小(字节) |
所属段名 |
存放位置 |
程序 |
130K |
.text |
L2 SRAM |
整像素运动估计参考缓冲区 |
9.5K |
.far |
L2 SRAM |
分像素运动估计参考缓冲区 |
10K |
.far |
L2 SRAM |
编码常用数据结构 |
40K |
.far |
L2 SRAM |
编码码表 |
9K |
.const |
L2 SRAM |
函数调用栈 |
8K |
.stack |
L2 SRAM |
当前编码帧 |
图像大小 |
.sysmem |
片外SDRAM |
当前重构帧 |
图像大小 |
.sysmem |
片外SDRAM |
整像素参考帧 |
图像大小 (两参考帧) |
.sysmem |
片外SDRAM |
分像素参考帧 |
图像大小的四倍 (两参考帧) |
.sysmem |
片外SDRAM |
其中整像素运动估计参考缓冲区包括亮度和色度。因为参考帧有两个,整像素运动估计参考缓冲区也有两个。分像素运动估计参考缓冲区也是两个:一个用来调入SKIP编码模式的预测值,一个用来做分像素运动估计。
3.3CPU与DMA并行性设计
I帧编码可以说是P帧编码的特例,如果P帧中不用运动估计的话,则与I帧编码流程相同。因此下面对于CPU与DMA的并行性的讨论只针对P帧。
我们要解决的问题是CPU什么时候发QDMA请求,命令DMA控制器将需要的数据调入内存中。而且这种调度方式要保证CPU发命令之后可以进行其它的计算,等CPU需要这些数据的时候,DMA已经将其调入内存中了。
为了解决这个问题需要了解编码器各个模块的运行时间,以及DMA调度数据到内存所需要的时间。通过在DM642上运行优化过的程序,一个参考帧情况下测得各部分占程序运行时间的比例大致如表2所示:
表2 程序各部分运行时间所占比例
模块名称 |
所占比例 |
1/2插值 |
10% |
初始化 |
2% |
整像素运动估计 |
35% |
分像素运动估计 |
15% |
帧内亮度预测 |
15% |
重构和扫描 |
10% |
环滤波 |
6% |
熵编码 |
4% |
其它 |
3% |
图4中由CPU指向DMA的箭头表示启动QDMA传输。每个DMA传输所用的时间相对于程序运行的时间比例是:传输原始像素占1%,传输SKIP和分像素运动估计参考区各占3%,传输整像素亮度和色度参考区共15%,传输环路滤波结果5%。整个DMA传输的时间大概占CPU计算时间的30%。通过这些数据可以看出,按照图4进行安排可以达到上面所述目标。
图4 CPU与DMA并行工作
只依靠上面这些方法进行优化,视频压缩还不能达到实时要求,还需要进行算法级优化,以及对编码器中各个模块进行程序代码级的优化。常通过采用内联函数、软件流水、线性汇编优化等方法,以及合理使用针对视频处理而设计的特殊指令集,充分利用DM642内部的并行计算单元,提高了程序的运行速度。由于篇幅有限,对这些优化方法本文不再重点论述。
4. 结论
结合AVS-M视频压缩处理流程的特点,本文完成了一个基于DM642平台的编码器的设计与实现。通过对编码流程的合理安排使得CPU能与DMA控制器并行工作,CPU不用等待数据,需要的数据已经被DMA调到内存中。实验表明通过系统级优化、程序级优化、汇编级优化、算法级优化等优化之后,基于这款视频服务器(实物图见图5),能达到2路CIF352x288格式实时视频压缩,以及音频实时编码、解码处理,且图像主观效果及音频效果良好。
本文创新点是:把具有自主知识产权的数字音视频编解码技术标准第七部分(AVS-M)应用于视频服务器的视频压缩,目前市场上还没有采用此压缩标准的产品,此产品具有极高得性价比,采用此压缩标准还可以避免产品产业化之后知识产权之争,具有很好的应用前景。
图5 IMlab6421视频服务器实物图
参考文献:
[1]周大山,李华,张淑芳等。AVS-M视频解码器设计和实现. 电视技术,2005,8:10-11
[2]李方慧,王飞,何佩琨.TMS320C6000系列DSPs原理及应用.电子工业出版社,2003.
[3]许海燕,闫健恩,陈静. H.264视频编码在DM642上的实现与优化,微计算机信息,2006,8-2:160-162