关键词:MPEG;监控系统;压缩/解压;设备驱动程序
1 MPEG-4标准及其在多媒体监控系统中的应用
多媒体监控系统是多媒体技术在安防领域的新应用。目前已广泛应用到金融、文博、酒店、交通、商业、医院、工厂、学校、住宅小区物业管理等各个领域。从目前趋势看,多媒体监控系统的应用领域还在不断扩展。
音视频压缩技术是多媒体监控系统中的关键技术。在数字多媒体压缩(特别是视频压缩)领域内有很多国际标准(如ISO/ITU-T技术委员会的JPEG标准、CCITT制定的H.263标准以及著名的MPEG标准等)。其中,MPEG-1标准适用于传输1.5Mbps的运动图形及其伴音编码,它具有较高的压缩比,其基本算法对于压缩水平方向为360个像素、垂直方向为288个像素,并以每秒24~30帧画面运动的图像有较好的效果。早期的监控系统很多都采用此标准(如著名的以色列芯片Z1510即采用MPEG-1标准);而MPEG-4标准的主要特点是可对图像中的内容进行编码,其核心是基于内容尺度可变性(Content-based scalability)。内容尺度可变性意味着可以给图像中的各个对象分配优先级。其中,比较重要的对象用较高的空间和(或)时间分辨力表示。对于比较低的比特率应用系统来说,尺度可变性是一个关键的因素,因为它提供了自适应可用资源的能力。例如,这个功能允许对具有较高优先级的对象用可接受的质量进行显示,第二优先级的对象则用较低的质量显示,而其余内容(对象)则不显示。对于监控系统来说,在绝大部分时间内,监视画面的背景都保持不变,因此,在要求的比特率比较低时,对于监视画面的背景部分可以以较低的质量显示,这样并不会影响整个画面的效果。
本系统采用MPEG-4压缩标准,选择的实现方式是硬压缩和硬解压,所用的压缩解压芯片为VWEB公司的VW2010。
2 硬件设计原理
2.1 VW2010的主要特点
VW2010是VWEB公司开发的实时MPEG-4音视频压缩/解压芯片(CODEC)。该芯片具有以下主要特点:
(1)片内集成有3个信号处理/控制单元,包括一个视频编码(压缩)器、一个视频解码(解压)器和一个片内CPU(内部扩展一个音频编码DSP、一个音频解码DSP、一个多路复合单元和一个多路解复合单元)。VW2010芯片的内部结构图如图1所示。
(2)具有可编程、高性能和低功耗特点,因为每个信号处理/控制单元都由一个RISC处理器和专用的硬件加速器构成。此外,视频编、解码器内部还集成了一个专用的SDRAM。
(3)在系统上电/复位时,视频编、解码器的固件程序可由外部主机(host)载入各自专用的SDRAM;而片内CPU的固件程序则可载入VW2010外挂的SDRAM。
(4)芯片的主机接口采用标准PCI接口。符合PCI局部总线规范2.2。
(5)为了使编、解码性能达到最佳,VW2010内部集成了一个双通道DMAC。系统host可直接通过主机接口对VW2010进行控制,MPEG数据流采用DMA方式传输。
(6)提供有与PHILIPS公司兼容的I2C总线,可方便地对外围芯片进行控制。
2.2 基于VW2010的压缩/解压卡硬件设计
图2所示是用VW2010设计的压缩卡的原理框图。图中,CVBS信号先经过视频接收电路进行前端处理(包括阻抗匹配、限幅和钳位),然后通过视频解码电路产生符合VW2010视频接口标准的ITU656信号。 视频解码电路的核心是一个视频解码芯片,该解码芯片用于对CVBS信号进行A/D转换和编码,以产生ITU656标准的并行数字电视信号。高档的视频解码器还支持图像尺寸缩放(scaling)和帧提取(decimating)功能,如PHILIPS公司的SAA7114、SAA7115以及Rockwell公司的BT829A等。由于VW2010的视频输入为ITU656/D1格式,所以只需要选择具有基本A/D转换和编码功能的视频解码芯片如SAA7113即可。
在模拟音频信号经过模拟音频接收电路进行前端处理后,便可通过音频ADC电路产生符合VW2010音频接口标准的I2S信号。
VW2010是压缩卡的核心处理芯片,该芯片除可完成音、视频信号的编码外,还可提供对解码器和ADC的控制(通过I2C总线),其编码产生的MPEG流可通过芯片内部集成的PCI接口输出。VW2010的解压操作是压缩操作的逆过程,基本原理类似,基于VW2010的解压卡原理框图如图3所示。
3 Linux下VW2010设备驱动程序设计
3.1 分层软件体系结构
按照操作系统的观点,系统软件体系结构应为表1所列的分层结构。驱动程序工作在核心态,并向下通过Chip API实现对VW2010芯片的直接控制,向上则为应用程序提供驱动程序接口(Driver API)。按照Rubini先生的观点,驱动程序提供的是机制,而不是策略。换句话说,驱动程序的主要任务是为应用提供全面、高效而可靠的服务,具体如何使用硬件则是应用需要解决的问题。
表1 分层软件体系结构示意图
Software | Mode |
Application | User mode |
Driver API | |
Driver | Kernel mode |
Chip API | |
Firmware | HardWare layer |
考虑到Linux系统下的设备驱动程序开发技术已经相当成熟,笔者不打算详细介绍驱动程序的完整框架和各个模块,而是在分析VW2010芯片与host通信机制的基础上,着重讨论在驱动程序中如何实现对VW2010芯片的有效控制以及如何通过应用程序实现VW2010芯片间数据的有效传输。
3.2 VW2010与host的通信机制
VW2010提供了三种与host通信的机制:直接访问内部寄存器、共享存储区(shared memory)和DMA。VW2010允许host直接访问其内部寄存器和外部存储单元,寄存器方式主要用于调试目的和下载固件程序;DMA方式则负责VW2010芯片和应用缓冲区之间的数据传输(如MPEG数据流);共享存储区机制是设备驱动程序和VW2010间的主要通信方式。
(1) 共享存储区(shared memory)
VW2010采用共享存储区机制接收host的命令并返回命令执行结果。host与VW2010进行通信的共享存储区(以下简称SM_PC2VW)位于encoder SDRAM中地址3F1800处,共128字节;而VW2010与host进行通信的共享存储区(以下简称SM_ VW2PC)则位于encoder SDRAM中的地址3F1880处,也是128字节。
SM_PC2VW的格式如表2所列。表中,CMD为命令码,分别为:读数据(CMD=1)、发IOCTL码(CMD=2)、写数据(CMD=3)、打开命令(CMD=4)和关闭命令(CMD=5);IntFlag为中断标识,IntFlag为1时,VW2010执行完CMD定义的任务后将产生一个中断,为0则不产生中断;Device Handle由打开命令从firmware中获得,当CMD不同时,Parameters有不同的含义。
表2 host到VW2010的共享内存区格式
Address | 31:16 | 15:8 | 7:0 |
3F1800 | Reserved | IntFlag | CMD |
3F1804 | Reserved | Reserved | Reserved |
3F1808 | Reserved | ||
3F180C | Device Handle | ||
3F1810 | Parameters | ||
3F1814 | …… |
表3 VW2010到host的共享内存区格式
Address | 31:16 | 15:8 | 7:0 |
3F1880 | Reserved | Reserved | Reserved |
3F1884 | Reserved | ACK/NACK | CMD |
3F1888 | Return Code | ||
3F188C | Device Handle | ||
3F1890 | Parameters | ||
3F1894 | …… |
SM_VW2PC的格式如表3所列。ACK/NACK的含义是:如果SM_PC2VW中的IntFlag为1,且命令CMD成功执行,则为ACK;如果SM_PC2VW中IntFlag为1,而执行命令CMD失败,则为NACK,并将错误码保存在Return Code字段。
一般在发送其它命令之前,必须先发送打开命令,此时,Device Handle字段应为0,Parameters字段为打开类型(TSMUX,PSMUX,TSDEMUX或PSDE-MUX)。如果该命令成功执行,则会在SM_VW2PC的Device Handle字段返回所分配的Device Handle,并在SM_VW2PC的Parameters字段返回辅助参数区的首地址(下面简称为X)。辅助参数区由firmware在encoder SDRAM中动态分配,主要用于传递与命令有关的参数。
在结束使用共享内存区后,必须发送关闭命令以释放辅助参数区。
(2)信号灯
由于共享存储区是临界资源,所以必须提供一种机制,以保证VW2010和host使用时不发生冲突。为此,VW2010分别给SM_PC2VW和SM_ VW 2PC提供了两个硬件信号灯,它们由寄存器REG_INT1和REG_INT2的最低位控制。此外,VW2010还为信号灯定义了以下两种操作。
写操作:向REG_INT1或REG_INT2最低位写入1,然后释放共享存储区。
读操作:返回REG_INT1或REG_INT2最低位的值,同时清该位为0。
(3) host到VW2010的中断
host通常通过向VW2010发中断的方式通知VW2010从共享存储区读取主机命令。VW2010用寄存器REG_DHIU5实现host到VW2010的中断。
REG_DHIU5的最低四位用于保存中断计数,第五位为中断屏蔽位。host向REG_DHIU5每写一次,中断计数加1;VW2010每读REG_DHIU5一次,中断计数减1。只要中断计数不为0,VW2010内部的中断请求信号将一直保持有效。
3.3 VW2010的数据读写和IOCTL方法的实现
VW2010的数据读写和IOCTL的实现依赖于上述的共享存储区机制,下面通过假设已经用打开命令(CMD=4)从firmware获取了Device Handle和辅助参数区(首地址为X)来进行讨论。
(1) 数据读写的实现
图4和图5分别给出了VW2010在系统调用部分和中断服务部分的读数据流程图。
VW2010采用DMA方式实现与应用空间的数据交换。读/写命令用于建立从VW2010到host的DMA通道并启动数据传输,它并不等待数据传输完成,而是让DMA传输在后台运行,当DMA传输结束后,VW2010将中断主机。
当应用程序要读写数据时,它首先会分配一些缓冲区用于保存读写数据。这些缓冲区可以用首地址和长度标识,如可以使用(Address,Len)代表首地址为Address、长度为Len的缓冲区。在发送读/写数据命令时,SM_PC2VW的Parameters字段为X,辅助参数区的内容为应用空间数据缓冲区的信息,其格式即为上述的首地址和缓冲长度标识对(Address,Len)。VW2010根据这些缓冲区信息来建立应用空间的DMA通道。
(2)IOCTL的实现
使用时,可定义多种IOCTL码以用于控制VW2010芯片,各IOCTL码的参数各不相同。需要注意的是,此处的IOCTL码不同于Driver API中的IOCTL码。该命令与读写数据命令的主要区别在于其命令辅助参数存储区的格式不同,而控制流程类似,限于篇幅,这里不再赘述。
4 结论
为了测试压缩/解压卡和设备驱动程序的性能,作者在Linux Redhat 7.3下编写了测试程序。在测试中,分别让VW2010芯片工作在手动录像模式、定时录像模式和动态侦测录像模式。结果表明:该系统卡在各种模式下都能稳定工作。