引言
当前在视频监控,视频会议,网络流媒体等方面数字视频编码成为最核心,最基本的技术手段,尤其是视频监控现已成为最为普通的安保设备之一。基于电脑硬盘为存储体的数字DVR已日渐取代模拟DVR。数字DVR的最关键技术就是视频压缩技术,而视频压缩技术又含有两大选择。首先是视频压缩采用何种算法标准,当前视频算法的国际标准有MPEG2、MPEG4、H.264,H.264以其高压缩效率,在低码率下优良的图像质量成为目前视频监控系统中首选的压缩方式。
但任何事物都有其两面性,H.264编码的高效率,优质图像是用算法的复杂性来换取的。H.264编码器的复杂性是MPEG2的4-5倍。第二个选择是用什么芯片来实现,TI公司的TMS320DM642芯片,是一款专门用作媒体处理的高速DSP,其强大的图像处理能力为在监控系统中实时实现H.264编码提供了可能。为了降低成本,还必须充分运用DM642本身的资源,使一颗DM642能处理更多路的视频,这就是高效率优化的目的,本文首先对整个视频监控的硬件平台做了介绍,后结合DM642的结构特点,提出整个编码软件的框架的安排,对于占用系统资源最多的运动估计提出基于DSP的优化方法,最后以整数DCT为例,讨论了编写汇编代码的技巧。
硬件平台的介绍
整个视频监控的硬件系统的框架如图1所示。DM642芯片为了适应数字媒体处理的需求,增加了三个可配置的视频端口(VP0,VP1,和VP2),这些视频口外设为常用的编解码设备提供了无缝接口。因而不需要外加可编程逻辑器件和FIFO就可满足系统设计的要求。
为了节省成本,提高DSP芯片的利用率,在一块板卡可以同时处理多路的音视频,压缩卡与主机间的数据吞吐量会很大,为了保证数据存储的实时性,系统采用PCI板卡,其与主机通信数据传输速率最高达528MB/s(66MHz,64bit),完全满足大容量高速实时传输系统的需求。
图1 硬件系统框架
由于每个视频口可以接收两路8/10bit的视频信号,视频信号经过SAA7144A/D转换输出为8位BT.656格式的数字视频数据。这样就能利用一颗DM642芯片处理最多6路视频输入。每个视频端口的BT.656视频采集模式采集8bit或是10bit4:2:2格式的亮度和色度信号,并将它们复用到一个数据流里,视频数据以Cb,Y,Cr,Y,Cb,Y,Cr的顺序传送,其中Cb,Y,Cr代表同一位置的亮度和色度样点,紧接着后面的Y代表下一个位置的亮度样点。数据流经解复用后亮度和色度信息分别存放到各自的Y,Cb,CrFIFO中,再经EDMA搬移到SDRAM中,以备CPU读取进行压缩编码。编码后的视频流再经PCI口存入到电脑的硬盘上,从而完成整个视频监控的流程。
编码器整体框架的安排
JM代码是很多可选的H.264标准软件之一,它关心H.264全部的功能在代码上得到体现,所有的情况都得考虑,例如帧编码,场编码都有,内存的分派没有考虑到系统的实际情况,适合用来帮助理解H.264标准,不太适合移植到DSP平台上。为了高效的组织利用DM642有限的片内资源,就得重新组织代码,包括数据结构,数据存放的位置,程序存放的位置,精简地来安排程序。
首先要考虑的是L2的配置问题,第二级L2(256kB)是一个统一的程序/数据空间,可以整体作为SRAM映射到存储空间,也可整体作为第二级cache,或者二者的比例的组合使用。因为一旦二级缓存也不命中的话,那么读取数据申请将转由EDMA来完成,CPU至少有13个cycle的延迟。所以我们总是尽量把程序和数据放在片内存储器内。但是即使全部将L2配置成SRAM也只有256kB大小,以CIF格式图像为例,待编码的一帧图像大小是148.5kB,再加上运动估计的参考图像就大大超过256kB了。所以在配置L2时,笔者选择的是SRAM224kB,L2cache32kB。首先考虑要放到SRAM的是表格,全局变量,栈数据和一些调用频繁的核心程序,如运动搜索,DCT变换,量化……而整个待编码图像和参考图像就只能放在片外存储空间了。
既然图像数据被存放到了片外存储空间中,就要涉及到数据在片内存储跟片外存储间的数据搬移,这可交由DM642强大的EDMA引擎来完成,EDMA工作时不占用CPU的周期,把CPU从繁重的搬移数据的工作中解放出来,专致于运算工作。在编码程序时,为了避免CPU等待EDMA搬完数据后才能工作,可采用乒乓结构的双缓存区,当EDMA传送数据到其中一块存储区域时,CPU对另一块存储区域进行处理。待二者都处理完毕后,乒乓区域交换。
需要通过EDMA搬移的数据有待编码的宏块,前后帧对应的参考宏块,和编码后的重构宏块(B帧不需要),这些宏块都包括亮度块和色度块。EDMA在搬大量数据时才能将它的性能发挥到极致,如果每编完一个宏块就进行一次乒乓缓存交换,那么在频繁的配置EDMA通道参数上就耗费了过多的CPU周期。有限的片内存储空间,制约着不能一次搬太多的宏块,一般一次搬7--9个宏块为宜。由于EDMA的同步信息是由CPU发出的,我们自然想到QDMA,但QDMA适用于单个的,独立的快速搬移数据,对于这种周期性的,重复性的搬移并没有优势。
为了提高EDMA的效率,可以采用EDMA链,最多开辟12个EDMA通道,让其首尾相连,这样只需触发一次CPU,可将待编码的亮度块色度块,参考帧的亮度块和色度块……一次搬完,如图2所示。在配置EDMA通道时,我们注意到频繁更换的只是EDMA的源地址和目的地址,而其它参量是不变的。由于EDMA控制器是基于RAM结构的,每个通道是通过参数表来配置的,每一个通道的参数都可以在0x01A0000h~0x01A07ffh的2KB的配置表中找到自己固定的位置,所以在更新某一通道的源地址和目的地址时,直接往配置表写上新地址就行了,而不必调用CSL库中的相应的cache函数来修改源地址和目的地址。
图2 EDMA链示意图
图3 六边形搜索算法
快速运动算法的优化
包括MPEG2,MPEG4和H.261、H.263、H264在内的标准都是采取基于块的运动估计模型。当然不同的标准块的大小也不一样,在H.264标准中,支持七种块大小(16x16、16x8、8x16、8x8、8x4、4x8、4x4)。众所周知:运动估计对减少时间域的冗余起了很大的作用,从而能大大提高编码效率,但同时它的计算量特别大,占用了大概整个编码系统的70%~80%的资源。一个好的编码算法就是要在计算量和编码效率两者之间取得一个很好的平衡。
全搜索(FS)能够保证在全局范围内搜到一个最佳的位置,但是其计算量是惊人的。对于在嵌入式系统中应用是不现实的。一般在实际应用中都是把几种算法结合起来,在本系统中采取的是:六边形搜索法,如图3所示,先以预测点为中心进行大模式搜索,如果最优点不在六边形中心,则将六边形的中心移至改点,重复大模式搜索,直到最优点在六边形中点,然后在这点切换到小模式搜索,此搜索法相对于经典的三步法,四步法搜索的点更少。
由于是在DSP平台上,对监控系统实时性要求比较高,提出几种基于DSP平台的优化方法:为了提高L1D的cache的命中率,根据cache不命中流水的原理,一次将参考帧全部灌入L1D内,然后在做运动估计时将七个宏块一齐做,然后再做七个宏块的运动补偿,DCT,量化,反DCT,反量化,编码,写码流。而不是像一般的步骤,对每一个宏块先做运动估计,然后运动补偿,然后DCT,映射到L1D一次,如果每个宏块单独做,在做第一个宏块运动估计时参考帧会由L2映射到L1D,做第二次运动估计时,因为之前程序做过DCT,量化等运算,映射到L1D里的参考帧数据已经被冲走,还得从L2中重新载入。同样的对于程序段一级缓存L1P来说,DCT、量化、反DCT、反量化、编码、写码流等函数都只需映射一次到L1P,而不必被反复地映射,冲掉,再次映射。
在JVT的提案中有很多运动矢量预测算法,如利用运动矢量在时间域有很强的相关性这一特性,我们能够得到比较精确的起始搜索位置。但他不太适合DSP平台,因为这样我们就要保留整个一帧的运动矢量,以CIF图像格式为例,需要12kB的空间,保存在资源紧张的片内显然是不合适的。保存在片外存储空间,调用的时候,先从片外先映射到L2cache,再从L2映射到L1D,其间流水不命中等待的cycle数,还不如从开始不太精确的初始位置多搜几个点。
整数DCT的优化详解
DCT,量化,反DCT,反量化在整个编码程序中占用了大概20%~25%的时间,所以有必要对他们的优化花一番功夫,本文举整数DCT为例说明如何对程序进行汇编级的优化。H.264采用的整数DCT,不仅满足一般DCT的特性,将图像的能量集中到左上角位置,直流系数和低频系数中,还有它特有的几个优点:
-它是整数变换,所有的运算都是整数算法,变换矩阵系数十分简单,核心变换部分可以仅仅用加法和移位来实现。非常有利于在DSP实现。
-可以保证编码端的变换和解码端的反变换完全匹配,没有误差。
首先我们对变换矩阵做必要的调整,如表达式(1),(2)所示,这样做的好处是行变换和列变换的操作完全一样,简化了运算。接下来就是用线性汇编或纯汇编来实现两个矩阵的相乘。
因为DM642CPU有两个类似的可进行数据处理的通路A和B,每个通路有4个完全相同的运算单元(.L,.S,.M,.D)我们可将矩阵的一四两行的运算放在A侧进行,二三两行在B侧进行运算,这样可以保证A,B两侧可同时并行计算。由于整数DCT变换是在16比特精度下完成的,矩阵相乘我们自然会想到汇编指令DOTP2,但是不能全部用DOTP2来完成运算,否则一个周期内就只有.M单元在工作,而其他运算单元都闲着。由于整数DCT矩阵系数的特殊性,我们完全可以用加法指令和移位指令来代替乘法指令。表1是一个16x16宏块进行DCT变换,汇编优化前后的cycle数的对比。
表一 16x16宏块DCT所需的周期数
在写汇编指令时我们要尽量做到在同一个周期内,让位于A,B两侧的8个运算单元能够同时工作,在做DCT时我们发现M单元不够用,而有时在其他情况下,M单元根本就没用上,这时就要想办法用M去代替其他运算单元。如求残差时要把8位数扩展成16位数,一般用UNPKLU4和UNPKHU4指令来完成,也可以用DOTPU4乘以0x01010101,同样也可以完成扩展要求。
表二 H.264编码器性能测试
实验结果与总结
由于此编码器是针对监控系统的应用,在追求编码速度的时候,对图像质量做了一定的牺牲。下面是编码器的一些参数配置:图像皆为CIF大小,参考帧用了一帧,搜索范围是[-16,16],相邻两个P帧间插入两个B帧,即IBBPBBP……的编码方式,P帧和B帧做运动估计时最小块到8x8块,即只在16x16、16x8、8x16、8x8几种模式间做选择,量化步长设为30.。采用CAVLC编码方式。
本文针对实时视频监控的应用要求,结合DM642嵌入式系统的硬件特性,从程序的总体架构,数据的存放位置,数据的搬移进行了分析,给出了切实有效的优化方法。对占用系统资源较多的运动搜索给出了适合在DSP平台下的算法,对整数DCT进行了在汇编层面的优化,并总结了一下优化技巧。经测试基本达到视频监控的实时要求,并且有较好的图像质量和码率。
上一篇:基于DM642的视音频采集器的设计
下一篇:MAX3541一次变频电视调谐器
推荐阅读最新更新时间:2023-10-12 20:41