摘要:介绍了Windows95体系中视频收集卡驱动程序的原理和结构,较具体地介绍了虚拟设备驱动程序和Video For Window视频收集驱动程序规划技能。
关键词:视频收集 驱动程序 Windows95
在计算机视频运用中,视频收集卡承当着将模仿视频信号转化成数字视频信号的使命。Windows95是现在运用比较广泛的操作体系,许多视频运用体系是依据该渠道的。不光收集卡规划人员需求具体了解Windows95体系中视频收集卡驱程序规划技能,运用程序规划人员也需求了解驱动程序的作业原理,以便规划出功用更好的运用程序。本文以PCI总线视频收集为例,较具体地介绍了Windows95体系中视频收集卡驱动程序规划技能。
1 Windows95驱动程序原理
Windows95作为多线程抢占式多使命操作体系,对硬件设备进行了全面而完善的办理。其设备驱动程序的首要意图是使体系中的各个使命同享硬件设备,在使命切换时保证硬件设备共同性。Windows95设备驱动程序是分层规划的,层间界说了共同的接口,提高了程序的兼容性,便于体系升级和移值。体系将各类硬件设备的功用、行为进行归类收拾,将实践设备笼统成逻辑设备。逻辑设备具有某一类型设备所共有的特点,具有共同的行为,并以共同的办法进行操作。体系供给必要的函数和办法供运用程序操作某一类型的逻辑设备。运用程序被严厉制止进行直接的硬件设备操作,所需的操作应当调用相应的体系API函数来完结。视频收集卡的设备驱动程序归于MultiMedia类中的VideoCap子类,由虚拟设备驱动程序CAPTURE.VXD和可装置设备驱动程序CAPTURE.DRV构成。其结构框图见图1。
虚拟机办理器VMM构成了Windows95体系的中心。它是一个32位保护办法操作体系,它的首要职责是创立、运转、监督以及停止虚拟机。虚拟机是一个可履行的使命,它由内存空间、CPU寄存器组、运用程序以及运用程序的支撑软件如ROM BIOS、MS-DOS等组成,体系可一起具有多个虚拟机。当某个硬件设备的状况或许遭到使命切换的搅扰时,该谐和就需求相应的虚拟设备驱动程序的支撑。虚拟机办理器和虚拟设备驱动程序一起办理体系的软硬件资源,呼应中止,进行I/O操作,保证多个运用程序同享资源,互不搅扰。
Windows95视频收集卡设备驱动程序包含虚拟设备驱动程序和可装置设备驱动程序两部分,一般能够选用Microsoft Windows95 DDK(Device Driver Kit)进行原形、输入库以及一些样例代码,可是未供给编程所需求的编译、汇编和衔接程序。选用Visual C++ 5.0、Visual C++ 1.5以及MASM 6.0进行程序规划。设备驱动程序规划的好坏与收集卡的功用、功用、 兼容性及安稳性密切相关。为保证驱动程序的质量,应当严厉遵循Windows95 DDK的文档进行程序规划。
2 虚拟设备驱动程序规划
在视频收集卡的驱动程序中,虚拟设备驱动程序CAPTURE.VXD担任参加体系即插即用装备进程,办理视频收集卡的硬件设备,并向运转在权限级3的上层程序供给调用接口:一是将分配的资源回来,如内存挑选子、I/O地址、中止号等,使得上层驱动程序能够运用这资源来操作收集卡硬件设备;二是完结一些在权限级3所不能进行的操作,如分配DMA缓冲区、检查内存映射页表等。虚拟机办理器和虚拟设备驱动程序运转在一个单一的32位平板办法址空间中,权限级为0。体系树立两个基地址为0、界限为4GB的大局描述符挑选子别离用于代码段和数据段,程序不应当直接修改段寄存器、内存描述符表、中止描述符表。
2.1 设备声明
虚拟设备驱动程序有必要包含一个声明,它一般坐落程序的前部,声明中包含虚拟设备驱动程序的称号、版本号、调用接口等一些重要信息。声明由宏Declare_Virtual_Device完结,语法如下:
Declare_Virtual_Device设备称号>,主版本号>,次版本号>,设备操控进程>,设备标识符>,初始化次第>,,
设备称号界说了虚拟设备驱动程序的称号。设备操控进程承受来虚拟机办理器的音讯,并依据不同音讯进行不同的操作。设备标识符是一个16位整数,它是该程序在体系中的仅有标识。初始化次确认虚拟设备驱动程序的装载次第,首要装入初始化次第值较小的虚拟设备驱动程序。V86 API接口用于承受来自虚拟8086办法程序的调用。PM API接口承受来自16位保护办法程序的调用。
2.2 设备操控进程
虚拟机办理器在体系的运转状况产生改动时向设备操控进程发送体系操控音讯(System Control Message),以便虚拟设备驱动程序能够盯梢体系状况,进行必要的处理。发送音讯的机遇包含:体系初始化、体系退出、虚拟机状况改动、虚拟设备的驱动程序初始化等。一个设备操控进程的比如如下:
BeginProc WBD848_Control
Control_Dispatch Sys_Dynamic_Device_Init,WBD848_Dyn_Device_Init
Control_Dispatch Sys_Dynamic_Device_Exit,WBD848_Dyn_Device_Exit
Control_Dispatch PnP_New_DevNode,WBD848_PnP_New_DevNode
Control_Dispatch W32_DEDVICEIOCONTROL,WBD848_W32_DeviceIOControl
Clc
Ret
EndProc WBD848_Control
与视频收集卡即插即用装备进程相关的音讯是PnP_New_DevNode。体系首要检测视频收集卡硬件存在,然后依据PCI接口板厂商和器材标识在注册表中找到对应的虚拟设备驱动程序并装入内存,随后体系向该虚拟设备驱动程序发送PnP_New_DevNode音讯。由于视频收集卡归于多媒体设备,设备驱动程序的装入应由MMDEVLDR.VXD完结,所以虚拟设备驱动程序在处理PnP_New_DevNode音讯时,调用 MMDEVLDR.VXD的服务MMDEVLDR_Register_Device_Driver注册了回调函数PnP_Config_Handler,体系依据收集卡PCI装备空间为其分配资源后将调用此回调函数。在PnP_Config_Handler中能够运用 CM_Get_Alloc_Log_Conf服务取得体系为收集卡分配的资源。处理体系操控音讯PnP_New_DevNode的例程如下:
BeginProc WBD848_PnP_New_DevNode
Mov eax,ebx ;虚拟机句柄
Mov ebx, offset32 PnP_Config_Handler;即插却用处理例程
VxDCall MMDEVLDR_Register_Device _Driver
Mov eax,CR_SUCCESS
Stc
Ret
EndProc WBD848_PnP_New_DevNode
在回调函数PnP_Config_Handler中取得的资源包含内存、I/O、中止和DMA四种。PCI总线视频收集卡首要运用内存和中止资源,它包含一个内存窗口作为内存映射I/O和一个中止IRQ号。虚拟设备驱动程序运用运用_MapPhysToLonear服务将内存窗口物理地址映射到线性地址空间中,并运用_Allocate_GDT_Selector服务分配内存挑选字,以便16位运用程序拜访该内存区域。
2.3 运用程序接口
虚拟设备驱动程序为虚拟8086办法、16位及32位保护办法运用程序别离供给运用程序编程接口,使运转在权限级3上的运用程序能够拜访虚拟设备驱动程序。前两种接口在设备声明时界说,运用程序经过中止调用INT28H AX=1648H取得虚拟设备驱动程序的进口地址。32位接口经过W32_DEVICEIOCONTROL体系信息音讯完结,运用程序则运用体系API函数DeviceIoControl对虚拟设备驱动程序进行调用。
当16位运用程序对进口地址宣布远调用后,虚拟机办理顺将运用程序的寄存器内容保存在Client_Reg_Struc结构中,并将指向该结构的指针赋予EBP寄存器,然后调用相应的虚拟设备驱动程序。虚拟设备驱动程序有必要拜访 Client_Reg_Struc结构中的数据以取得运用程序的调用参数。一般运用AX寄存器传递功用号,运用其它寄存器传递参数,履行成果经过 Client_Reg_Struc结构回来。16位保护办法运用程序运用挑选子——偏移量地址模型,而虚拟设备驱动程序运用32位平板式地址模型,假如参数是以指针的办法传递给虚拟设备驱动程序,需求运用宏Client_Ptr_Flat进行转化。
本收集卡中虚拟设备驱动程序供给的首要功用是:(1)使运用程序取得体系为收集卡分配的资源,如内存映射、I/O地址和中止IRQ号,以便操作收集卡;(2)供给有关内存页表的信息,以便进行DMA操作。16位运用程序接口的部分代码如下:
;******** Copy Page Table ********
Client_Ptr_Flat eax,ES,BX ;es:bx指向页表缓冲区
Client_Ptr_Flat ebx,DI,SI ;di:si指向DMA缓冲区
Shr ebx,12 ;开端页号
Movz ecx,[ebp].Client_CX ;cx为需求复制的页表项个数
VMMcall _CopyPageTable
Mov [ebp].Client_EAX,eax ;ax回来履行成果
Ret
;********** Get Resource **********
movzx eax, _g_wSelector ;存储器映射I/O地址挑选子
mov [ebp].Client_EAX,eaz
movzx eax,_g_wIRQ
mov [ebp].Client_EBX,eax
ret
32位运用程序接口的功用与16位接口十分相似,仅仅将存储器映射I/O地址以32位线性地址的办法回来,以习惯32位平板办法的寻址要求。别的32位接口不回来中止IRQ号,由于32位运用程序中不进行有关中止的操作。
3 可装置设备驱动程序
可装置设备驱动程序实质上是一个16位动态链接库,能够依照一般的动态链接库规划办法进行规划。它具有人口函数DriverProc,用于接纳体系发送的音讯。
3.1 Video For Window编程模型
视频收集卡可装置设备驱动程序选用Video For Window程序模型,它从各式各样的视频收集卡笼统出一个共同的逻辑结构,以便上层程序调用。上层程序首要是指由AVICap32.dll等体系动态链接库构成的视频收集引擎。视频收集引擎担任显现视频数据、分配数据缓冲区、操作体系调色板、存储AVI文件等作业,它们将运用程序的高档调用翻译成初级音讯发送给可装置设备驱动程序。可装置设备驱动程序在音讯的操控下,操作收集卡硬件设备,完结视频数据的收集。Video For Window驱动程序逻辑结构如图2所示。
Video For Window驱动程序模型包含视频源、帧存储器、显现设备、CPU和四个视频数据通道。帧存储器只具有逻辑上含义,或许在收集卡上或坐落主机内存中或许根本上不存在。它在图2中只标明处于该闰置的应当是现已解码完好的视频数据。四个视频数据逻辑通道的功用如下:
External In代表视频信号由模仿向数字的转化进程,包含采样量化、解码等作业。该通道担任视频信号的挑选(摄像机、录像机、调谐器等),视频信号制式挑选(NTSC、PAL、SECAM等),亮度、对比度、色彩的调理等作业。
Video In 代表视频数据由帧存储器向体系缓冲区的传输进程。该通道担任视频图画数据的传输作业,如设定图画巨细、五颜六色格局,确认图画帧的同步守时等。
External Out 代表视频数据向显现设备的直接传输进程。该通道担任视频图画的实时显现作业,如确认显现窗数据格局,进行显现窗口的取舍等。
Video Out 代表视频数据由体系缓冲区向帧存储器的反向传输进程。该通道担任视频数据的回放,具有视频解紧缩功用的休集卡或许需求这种反向的传输,以便对紧缩数据进行解码。
一个最简略的视频收集驱动程序至少应当完结External In和Video In两路数据流,也便是完结视频信号的收集、解码和向主机内存的传输。一般PCI总线视频收集卡还能够完结External Out数据流,即完结视频数据的实时显现。
3.2 数据传输
驱动程序将收集到的数据传送到上层程序时运用VIDEOHDR结构,该结构包含了数据缓冲区、数据长度、时刻戳等信息,界说如下:
typedef struct {
LPSTR lpData; //address of video buffer
DWORD dwBufferLength; //size,in bytes,of the data buffer
DWORD dwBufferLength; //size,in bytes,of the data buffer
DWORD dwBytesUsed;
DWORD dwTimeCeptured;
DWORD dwUser; //user-specific data
DWORD dwFlags;
DWORD dwReserved[4];//reserved;do not use }VIDEOHDR;
LpData 视频数据缓冲区指针,由收集引擎填写;
dwBufferLength 视频数据缓冲区长度,由收集引擎填写;
dwBytesUsed 缓冲区中图画数据的实践长度,由驱动程序填写;
dwTimeCaptured 时刻戳,从收集榜首帧起以ms为单位记载,用于视频数据的同步,由驱动程序填写;
dwFlage 标志,驱动程序应当填写VHDR_DONE以表明收集完结,假如此帧为关键帧还能够一起运用VHDR_KEYFRAME标志。
缓冲区一般由视频收集引擎分配,并钭VIDEOHOR结构指针以音讯参数办法发送给驱动程序。当进行单帧收集时,驱动程序每收到一个DVM_FRAME音讯便收集一帧图画,驱动程序从DVM_FRAME音讯回来时将VIDEOHDR结构回来给收集引擎。
序列图画的收集比较复杂,驱动程序与收集引擎间以缓冲区行列的办法进行数据交换,保证了接连的实时收集。收集引擎运用DVM_ADDBUFFER音讯将空数据缓冲区不断地加到缓冲区行列的队尾。一起,驱动程序将空数据缓冲区从行列的队首取出,并进行视频收集。驱动程序将填充视频数据的缓冲区经过回调函数回来给收集引擎,由它进行显现、存盘等操作。增加缓冲区和取出缓冲区是两个相对独立的异步操作。收集引擎是缓冲区的生产者,它能够在体系闲暇时分配若干个缓冲区并加入队尾。驱动程序是缓冲区的顾客,在收集卡硬件中止的驱动下它不断取出空缓冲区,并将用过的缓冲区返还给收集引擎。经过运用缓冲区行列提高了体系的数据吞吐能力,保证了收集的实时性。
3.3 视频实时显现
视频图画实时显现功用又称为Overlay,它将视频图画以窗口办法在计算机屏幕上实时显现,显现的画面具有杰出的视觉效果,显现窗口与Windows95的图形具有杰出的视觉效果,显现窗标语 Windows95的图形界面合作默契。要完结这些功用,首要收集卡有必要具有将数据直接传输至显现卡的硬件设备,由于实时显现数据传输量巨大,主机CPU 是不或许承当这样的使命的;其次要求软硬件设备默契合作,以便恰当处理显现窗口的巨细、定位及取舍。这能够凭借DirectDraw中的Overlay功用完结。
DirectDraw是一种软件接口标准,供给了对显现设备的直接拜访。它将显现画面分红外表(Surface),每种外表具有不同的特点,如尺度巨细、五颜六色格局等。整个屏幕对应的外表称为主外表,程序能够在显存或内存中树立其它外表,并在这些外表中制作图形,然后经过某种操作这些外表的内容显现在主外表上,这些操作是高效率的,程序能够从中取得很高的功用。Overlay外表具有特别的性质,它坐落显存,而且能够掩盖显现在主外表的任何方位。为了避免Overlay外表隐瞒主外表中的某些重要部分如菜单、对话框等,Overlay 外表还高有色键功用,只要主外表中的色彩值与色键值相一起,Overlay外表才掩盖主外表。
当驱动程序的External Out通道收到DVM_STREAM_INIT音讯时,开端视频实时显现。首要发动DirectDraw接口,创立主外表和Overlay外表,并记载有关Overlay外表的信息,如尺度、数据格局、内存地址等,一起为Overlay外表挑选一个色彩作为色键,一般是洋红色。然后依据Overlay外表的信息初始化硬件设备,使DMA设备将视频数据直接关入Overlay外表地点的显存中。当显现窗口移动或改动巨细时,视频收集引擎会发送DVM_UPDATE音讯告诉驱动程序更新显现,驱动程序应当在视频窗口中填充色键的色彩,并移动Overlay外表使其与视频窗口对齐。由于可装置设备驱动程序是16位模块,而DirectDraw坐落32位模块中,在收集卡驱动程序中不能直接调用DirectDraw接口,成心需凭借Flat Thunk在16位与32位模块间树立联络。
本设备驱动程序向阳区别运用PCI总线的带宽和Windows95体系资源,取得了较高的收集速率(384×288×24bits 25fps),完结了实时视频显现。驱动程序功用安稳,兼容性杰出,在运转Windows95的586以上体系中可安稳运转,并可运转于Windows95上。