多路MPEG-4监控系统的设计与实现
了一种方法:通过应用程序调用DeviceIoControl、ReadFile和WriteFile等API函数,传递给这些函数用户模式的虚拟地址和数据长度等参数,这样就相当于向I/O管理器提供了一个数据缓冲区。I/O管理器再根据设备驱动程序中指定的三种不同机制[3](buffer方式、direct方式和neither方式)中的一种,利用不同的实现方法来实现用户模式和内核模式间数据的共享。
图4
Buffer方式是一种在对速度要求不高的情况下常用的方法。在本系统的板卡初始化模块和参数设置模块中,由于对速度、数据量的要求都不是很高,所以采用了这种方式的共享方法。但是在DMA传输模块中,为了能够实现大量的MPEG-4码流的高速实时传输,本系统设法省去了数据传输中间的复制过程,将编码码流数据直接搬移到应用程序的一个循环缓冲区中去。本系统采用的这种方法有点像neither方式,具体的实现方法如下:应用程序申请并锁定一块循环缓冲区,然后将得到的这块内存的用户模式虚拟地址和长度传送给内核设备驱动程序。在设备驱动程序中,利用传送下来的用户模式地址和缓冲区长度为这块用户模式缓冲区创建MDL(内存描述符),并将它映射到内核模式地址空间,得到一个内核模式的虚拟地址,这样驱动程序就可以通过这个地址直接访问应用程序申请的共享内存块。
本文链接地址:http://www.oyaya.net/fanwen/view/152648.html
图4
Buffer方式是一种在对速度要求不高的情况下常用的方法。在本系统的板卡初始化模块和参数设置模块中,由于对速度、数据量的要求都不是很高,所以采用了这种方式的共享方法。但是在DMA传输模块中,为了能够实现大量的MPEG-4码流的高速实时传输,本系统设法省去了数据传输中间的复制过程,将编码码流数据直接搬移到应用程序的一个循环缓冲区中去。本系统采用的这种方法有点像neither方式,具体的实现方法如下:应用程序申请并锁定一块循环缓冲区,然后将得到的这块内存的用户模式虚拟地址和长度传送给内核设备驱动程序。在设备驱动程序中,利用传送下来的用户模式地址和缓冲区长度为这块用户模式缓冲区创建MDL(内存描述符),并将它映射到内核模式地址空间,得到一个内核模式的虚拟地址,这样驱动程序就可以通过这个地址直接访问应用程序申请的共享内存块。
除了上述的方法外,共享内存块也可以由内核驱动程序申请的系统缓冲区来充当,并通过转换得到用户模式的虚拟地址,应用程序就可以通过这个地址直接访问系统地址。
另外,为了实
现应用程序和驱动程序的同步,采用了共享事件的方法[4]。在Windows2000中,应用程序和内核驱动程序可以共享同一命名的事件,这个事件可以由任意一方创建。当其中一方创建了一个事件后,就可以把这个事件的句柄传送给另一方来实现事件的共享,然后通过一方捕获事件信号态、另一方设置事件信号态的方法实现两者间的通信。
在一台CPU速度为1.8G、内存为512M的工控机上,本系统可支持8块压缩板卡同时工作,从而提供对32路音视频数据的监控能力,系统的压缩率在较宽的范围内可调。
《多路MPEG-4监控系统的设计与实现(第3页)》