摘? 要: 介紹了Windows95系統中采集卡" title="采集卡">采集卡" title="視頻采集卡" title="視頻采集卡">視頻采集卡">視頻采集卡驅動程序的原理和結構,較詳細地介紹了虛擬設備驅動程序" title="設備驅動程序">設備驅動程序和Video For Window視頻采集驅動程序設計技術。
關鍵詞: 視頻采集? 驅動程序? Windows95
???????????????????????????????????????
在計算機視頻應用中,視頻采集卡承擔著將模擬視頻信號轉換成數字視頻信號的任務。Windows95是目前應用比較廣泛的操作系統,許多視頻應用系統是基于該平臺的。不但采集卡設計人員需要詳細了解Windows95系統中視頻采集卡驅動程序設計技術,應用程序" title="應用程序">應用程序設計人員也需要理解驅動程序的工作原理,以便設計出性能更好的應用程序。本文以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)進行設計。DDK中提供了進行設計所必要的文檔、底層函數原形、輸入庫以及一些樣例代碼,但是未提供編程所需要的編譯、匯編和連接程序。采用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_DEVICEIOCONTROL,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號。虛擬設備驅動程序應當使用_MapPhysToLinear服務將內存窗口物理地址映射到線性地址空間中,并使用_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, eax
??? movzx??????????? eax, _g_wIRQ????????????????? ;IRQ號
??? 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等系統動態鏈接庫構成的視頻采集引擎。視頻采集引擎負責顯示視頻數據" title="視頻數據">視頻數據、分配數據緩沖區、操縱系統調色板、存儲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 dwBytesUsed;
DWORD dwTimeCaptured;
DWORD dwUser;????????? ????? // user-specific data
DWORD dwFlags;??
DWORD dwReserved[4]; ??? // reserved; do not use
}VIDEOHDR;
lpData???????????????????? 視頻數據緩沖區指針,由采集引擎填寫;
dwBufferLength???????????? 視頻數據緩沖區長度,由采集引擎填寫;
dwBytesUsed? ??? 緩沖區中圖像數據的實際長度,由驅動程序填寫;
dwTimeCaptured?????????? 時間戳,從采集第一幀起以ms為單位記錄,用于視頻數據的同步,由驅動程序填寫;
??? dwFlags?????????????????? 標志,驅動程序應當填寫VHDR_DONE以表示采集完成,如果此幀為關鍵幀還可以同時使用
? VHDR_KEYFRAME標志。
緩沖區通常由視頻采集引擎分配,并將VIDEOHDR結構指針以消息參數形式發送給驅動程序。當進行單幀采集時,驅動程序每收到一個DVM_FRAME消息便采集一幀圖像,驅動程序從DVM_FRAME消息返回時將VIDEOHDR結構返回給采集引擎。
序列圖像的采集比較復雜,驅動程序與采集引擎間以緩沖區隊列的形式進行數據交換,確保了連續的實時采集。采集引擎使用DVM_ADDBUFFER消息將空數據緩沖區不斷地加到緩沖區隊列的隊尾。同時,驅動程序將空數據緩沖區從隊列的隊首取出,并進行視頻采集。驅動程序將填充視頻數據的緩沖區通過回調函數返回給采集引擎,由它進行顯示、存盤等操作。添加緩沖區和取出緩沖區是兩個相對獨立的異步操作。采集引擎是緩沖區的生產者,它可以在系統空閑時分配若干個緩沖區并加入隊尾。驅動程序是緩沖區的消費者,在采集卡硬件中斷的驅動下它不斷取出空緩沖區,并將用過的緩沖區返還給采集引擎。通過使用緩沖區隊列提高了系統的數據吞吐能力,確保了采集的實時性。
3.3 視頻實時顯示
視頻圖像實時顯示功能又稱為Overlay,它將視頻圖像以窗口方式在計算機屏幕上實時顯示,顯示的畫面具有良好的視覺效果,顯示窗口與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以上系統中可穩定運行,并可運行于Windows98上。
?
參考文獻
1 Microsoft Corporation.Microsoft Windows95 Device Driver Kit. 1997
2 曹家智,王蓉,劉乃琦.80486/80386系統設計和應用.成都:電子科技大學出版社,1992