多路MPEG-4监控系统的设计与实现
在本系统中,音频编码模块和EPLD控制模块的输出与IME6400的音、视频输入模块相连接,然后由IME6400完成音、视频信号的MPEG-4压缩编码。IME6400利用主机接口和PCI总线控制模块之间的相连,构成数据和控制通道。同时,外挂SDRAM用来存储已编码的码流,而内部1KByte的FIFO用来实现编码码流的快速传输。外部主机可以按照规定的流程对一些恰当的主机接口控制寄存器进行读或写操作,还可以完成直接寄存器读写、IME6400系统内存的访问、FIFO缓冲区的访问和firmware软件的下载等操作。 除了上述功能外,IME6400还可以根据主机自定义的运动检测要求实现运动检测,并将检测到的信息以包的形式传送给主机。 3 PCl 总线控制模块 PCI总线控制模块采用的是PHILIPS公司的SAA7146A PCI桥芯片。它具有三个视频DMA通道和四个音频DMA通道,同时集成了一些单元模块,如MMU、BPS和HPS等。它还包含了众多接口,可以和众多的音、视频处理芯片实现无缝连接,为多媒体数据的传输和处理提供比较广泛的应用。SAA7146A的原理框图[2]如图3所示。 数据扩展总线接口(DEBl)为外围设备提供了8/16位的数据传输和控制功能,支持立即传输和块传输两种方式。在系统中,SAA7l46A的DEBI跟MPEG-4压缩编码模块相连接,实现MPEG-4压缩码流的接收。同时,通过PCI总线接口模块,利用DMA传输方式在计算机和硬件板卡间实现压缩码流的高速传输。SAA7146A具有I2C总线接口,可以很方便地对具有12C接口的外围芯片进行控制。 SAA7146A中的D1接口可以和视频解码芯片或视频压缩芯片相连接,利用HPS可以对视频信号进行定标、缩放等处理,也可以利用BRS对视频信号进行CIF、QCIF或者QQCIF格式转换。 除此之外,SAA7146A还提供了与音频处理芯片连接的多个接口。 4 高速数据传输机制的设计 整个系统的软件主要由两部分组成。一是设备驱动程序,主要负责硬件板卡和计算机之间的交互;二是上层应用程序,用于实现系统的功能。由于多路监控系统的数据传输量非常大,因此设计一个高效的驱动程序以实现高速数据传输对整个系统的性能具有重要的影响。图34.1 驱动程序的设计 本系统的设备驱动程序采用了Windows 2000下的Windows Driver Model(WDM)驱动程序。在Windows2000中,系统有两种命名设备的方法:一种是使用符号连接名,但它的安全陛不是很好[4];另一种是利用具有唯一性的GUID号表示设备接口。上层应用程序可以通过上面两种方法获得有效的设备句柄,并利用这个设备句柄实现对设备驱动程序的访问。当上层应用程序调用WIN32AHI函数后,将由Win32子系统调用I/O服务接口,并传送给内核模式下的I/O系统服务模块。接着,I/0管理器将检查这个请求的参数,然后创建一个合适的I/O请求包(1RP)。这个IRP经过分层驱动程序的处理传送给一个合适的设备驱动程序,并由这个程序通过硬件抽象层对硬件进行操作,完成这个IRP请求。最后,I/O管理器把结果和数据还回给应用程序[3]。 在本系统的Windows2000的WDM驱动程序中,除了基本的功能模块[3](如PNP模块、Dispatch模块、Power模块等)外,可以把其余部分大概分为板卡初始化模块、参数设置模块、中断服务模块和DMA传输模块等。 为了能够使PCI总线控制模块实时地从压缩编码模块中读取压缩码流,并及时地传送给计算机,本系统采用了中断机制。当压缩编码模块中的FIFO满时,压缩编码模块产生一个中断信号,通知PCI总线控制模块启动DMA,利用块传输方式读取FIFO中的数据。同时,IME6400将后面的编码数据暂存在外挂的SDRAM中。 PHILIPS公司的SAA7146A是一片具有总线主控DMA控制器的PCI桥芯片,可以实现内存和设备间快速的数据传输。本系统采用“基于包”的DMA传输方式;同时,为了进一步提高速度,使DMA将数据直接搬移到用户应用程序中所申请的循环缓存区中。DMA的流程如图4所示。其中,Saa7l46Read例程的主要功能是进行DMA的初始化操作,并启动编码码流输出。AdapterCon-trol例程确保计算机处理器高速缓存中的内容为当前使用的内存缓冲区中的内容。DpcForIsr例程完成内存物理地址和传输的数据长度的获得,并把它们写到DMA控制寄存器中,该例程还在合适的条件下与应用程序利用事件进行通信。 4.2 传输机制的设计 在数字监控系统中,为了实现数据的实时传输,应该仔细设计设备驱动程序和上层应用程序间的数据传输机制,来确保数据的完整性和实时性。 Windows2000操作系统把虚拟内存地址空间分为用户模式的虚拟地址空间和内核模式的地址空间。一般来讲,内核模式驱动程序几乎不使用用户模式的虚拟地址来访问内存。实际上,Windows2000操作系统为驱动程序访问用户模式的数据缓冲区提供了一种方法:通过应用程序调用DeviceIoControl、ReadFile和WriteFile等API函数,传递给这些函数用户模式的虚拟地址和数据长度等参数,这样就相当于向I/O管理器提供了一个数据缓冲区。I/O管理器再根据设备驱动程序中指定的三种不同机制[3](buffer方式、direct方式和neither方式)中的一种,利用不同的实现方法来实现用户模式和内核模式间数据的共享。图4Buffer方式是一种在对速度要求不高的情况下常用的方法。在本系统的板卡初始化模块和参数设置模块中,由于对速度、数据量的要求都不是很高,所以采用了这种方式的共享方法。但是在DMA传输模块中,为了能够实现大量的MPEG-4码流的高速实时传输,本系统设法省去了数据传输中间的复制过程,将编码码流数据直接搬移到应用程序的一个循环缓冲区中去。本系统采用的这种方法有点像neither方式,具体的实现方法如下:应用程序申请并锁定一块循环缓冲区,然后将得到的这块内存的用户模式虚拟地址和长度传送给内核设备驱动程序。在设备驱动程序中,利用传送下来的用户模式地址和缓冲区长度为这块用户模式缓冲区创建MDL(内存描述符),并将它映射到内核模式地址空间,得到一个内核模式的虚拟地址,这样驱动程序就可以通过这个地址直接访问应用程序申请的共享内存块。 除了上述的方法外,共享内存块也可以由内核驱动程序申请的系统缓冲区来充当,并通过转换得到用户模式的虚拟地址,应用程序就可以通过这个地址直接访问系统地址。 另外,为了实现应用程序和驱动程序的同步,采用了共享事件的方法[4]。在Windows2000中,应用程序和内核驱动程序可以共享同一命名的事件,这个事件可以由任意一方创建。当其中一方创建了一个事件后,就可以把这个事件的句柄传送给另一方来实现事件的共享,然后通过一方捕获事件信号态、另一方设置事件信号态的方法实现两者间的通信。 在一台CPU速度为1.8G、内存为512M的工控机上,本系统可支持8块压缩板卡同时工作,从而提供对32路音视频数据的监控能力,系统的压缩率在较宽的范围内可调。












评论