《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > NT下視頻采集及解壓驅動程序的設計與實現

NT下視頻采集及解壓驅動程序的設計與實現

2009-03-26
作者:彭 勇 黃瑞光

  摘? 要: 分析了多媒體設備驅動程序的體系結構及視頻采集與解壓卡的驅動程序設計方案。描述了核心態驅動程序的處理流程,提供了用戶態驅動程序的設計思路和具體算法。

  關鍵詞: 驅動程序? IRP(輸入輸出請求包)? 驅動程序對象? 設備對象

?

  Windows NT的結構決定了應用程序不能直接操作硬件設備,它只能通過一個中間層來讀寫和控制設備,這個中間層就是驅動程序。驅動程序位于計算機軟件的最低層(HAL為硬件抽象層),直接與硬件設備的特性聯系在一起。編寫驅動程序不僅要了解設備的特性,而且還要了解操作系統的結構,難度較大。本文比較詳細地分析了視頻采集與解壓卡的驅動程序設計思路。

1 視頻采集與解壓卡驅動程序的結構

  多媒體設備相對普通設備來說,有兩個特點:數據流量大;對最終期限要求高(即實時性要求比較高)。對于視頻采集與解壓卡這類多媒體設備來說,驅動程序的編寫有其特定的方式。多媒體驅動程序的結構如圖1所示。一般說來,根據其代碼運行的特權級可分為兩層:核心態的驅動程序和用戶態的驅動程序。核心態的驅動程序運行于內核模式,可以執行特權級指令,對任何I/O設備有全部的訪問權,還能夠訪問任何虛地址和控制虛擬內存硬件。

?

  用戶模式的驅動程序實質上是一個動態鏈接庫(DLL)。它運行在用戶態,應用程序向這個接口發出消息請求一定的操作。它們調用WIN32函數與內核模式的驅動程序通訊(WIN32函數又調用NT執行體提供的函數,這些執行體函數提供從用戶態到核心態的上下文轉換)。用戶模式的驅動程序根據接收的消息采取適當的操作,完成操作后將結果返回給應用程序。但是這種結構只適用于解壓一幅幅的位圖,并不適合采集和解壓本設備產生的視頻流。

  此卡既要采集又要解壓,若用標準模式進行設計,就要同時編寫視頻采集和視頻解壓的驅動程序,其中還要對解壓程序進行改造,編寫復雜,尤其調試會很困難。在這種情況下,使用本設計方案,既可滿足要求,又可減小設計難度。

  內核模式的驅動程序與一般驅動程序無多大的區別,只負責讀取數據和進行設備控制。用戶模式的驅動程序要處理大部分的事務。在解壓時,驅動程序要向設備寫入待解壓的數據,從設備中取得解壓后的數據,向應用程序提供一幀圖像的RGB數據。從設備得到的數據是分場存放的4:2:2的YCrCb格式的數據,驅動程序將每幀數據按行進行格式轉換,組合成完整的一幀數據(QCIF)交付給應用程序。

2 內核模式的驅動程序的設計

  由于多媒體的數據量很大,按照常規的方法(采用IRP包進行數據傳輸)設計將面臨著一個無法解決的問題——中斷太快驅動程序將來不及處理。因此必須采用一種新的方法:在驅動程序中建立兩塊緩沖區(分別用于讀寫),應用層驅動程序與核心層驅動程序共用緩沖區。當設備中斷發生時,根據發生的中斷進行處理。如果是讀中斷,先把數據從設備中讀到緩沖區中,發出一個DPC(推遲過程調用),通知應用層驅動程序該緩沖區數據可用,可以取走數據了。如果是寫中斷,先把緩沖區中的數據寫到設備的FIFO中,然后發出一個DPC,通知用戶模式驅動程序該緩沖區數據已失效,需要寫入新數據。

  驅動程序工作流程如圖2所示。內核模式向外顯露DriverEntry(驅動程序必須要有的一個例程)接口,其它的例程沒有固定的名字,為了讓I/O管理器找到這些例程,DriverEntry例程負責建立這些函數指針。I/O管理器從非分頁系統內存分配一個IRP,響應一個I/O請求,基于由用戶指定的I/O函數,把IRP傳遞給合適的驅動程序Dispatch例程,Dispatch例程檢查請求的參數,如果它們是有效的,使用IRP的內容設置設備操作。當操作完成時,在IRP中存放最后的狀態代碼,并把它送回I/O管理器;I/O管理器使用IRP中的信息完成請求,并把最后狀態發送給請求者。

?

  當驅動程序被加載到系統中時,I/O管理器將創建一個驅動程序對象(在系統中代表一個獨立的驅動程序,并且為I/O管理器記錄每個驅動程序的調度例程的地址),然后調用其初始化例程。

  在DriverEntry這個初始化例程中完成的任務是:

  ·把驅動程序的入口填入該驅動程序對象中。

  ·用設備的VID和DID查找每條總線上的每個插槽,找到這塊圖像壓縮解壓卡,并用IoCreateDevice創建設備對象,用IoCreateSymbolicLink建立符號連接。

  ·初始化放在非分頁區中的Device Extension中的各個分量。包括讀寫IRP,以及保護各自隊列的自旋鎖等。

  ·設備有兩塊專有內存,必須將其總線相關地址轉換成系統范圍內的地址,并將其映射到系統虛空間。對于I/O端口,將其總線相關地址轉換成系統范圍內的地址即可。

  ·用ExAllocatePool()分配兩塊非分頁緩存,并把它映射到用戶地址中。

  在驅動程序讀寫設備之前,必須進一步初始化,表明設備驅動程序的用途:解碼或編碼。上層的驅動程序調用DeviceIoControl對工作模式進行設置,驅動程序收到此IRP后設置壓縮解壓芯片的工作模式及視頻采集芯片、總線接口芯片的參數。在開始編碼或解碼之前,上層的驅動程序必須調用DeviceIoControl取回共用緩沖區的地址。

3 用戶模式的驅動程序設計

  用戶模式的驅動程序要完成以下功能:采集時,從設備中讀取一定量(一般是一幀)的數據傳遞給應用程序。解碼相對復雜,不僅要向設備寫入待解壓的數據,從設備中讀取一幀解壓后的數據,由于讀取的數據是CCIR656的視頻流不適合應用程序的顯示,還要對其進行格式轉換,轉換成適合計算機顯示的RGB格式,向應用程序提供QCIF(356×288)大小的圖像。因此可將其劃分為兩部分:存取數據部分和數據轉換部分。

3.1 數據存取

  鏈接庫向外輸出一套函數供應用程序調用,包括初始化、采集、取得配置、設置配置參數、解壓函數等等。在應用程序使用其它輸出函數之前,必須調用初始化函數,指定此鏈接庫的用途:編碼(采集)還是解碼,還要注冊一個回調函數(驅動程序在采集或解壓完一幀或規定的數據后將調用此函數)。用于編碼端(采集)時,鏈接庫的工作比較簡單,根據應用程序的要求,從設備中采集一定量的數據,完成請求后,調用應用程序注冊的回調函數,在此函數中應用程序處理采集到的數據。編碼(采集)端開辟一個線程用于從設備中讀取壓縮后的數據,在進行讀寫設備時先打開在內核態驅動程序創建的用于通知的事件對象,等待其變為“已傳信”,待共用緩沖區的數據可用,將共用緩沖區中的數據拷貝到另外一個中間緩存(此緩存將作為參數傳遞給回調函數)。

  用于解碼時,工作則要復雜得多。首先必須向設備寫入待解壓的數據,再從設備中讀取解壓后的數據,并把解壓后的數據轉換成RGB格式的數據,從中提取出356×288大小的圖像數據。當完成這些工作后,調用回調函數。既要使設備充分工作,又不至于使系統開銷過大,所以在解碼端開辟兩個線程,分別用于向設備寫入待解壓的數據和讀取解壓后的數據。同樣,在進行讀寫設備時先打開在內核態驅動程序創建的用于通知的事件對象,等待其變為“已傳信”,待共用緩沖區的數據可用(讀數據)或數據需要更新時,根據要求處理緩沖區。需要注意的是在解碼時既要從設備收集解壓數據,同時又要對解壓后的數據進行格式轉換,進行格式轉換是一件很費時間的工作,所以數據格式轉換例程最好能采用另外一個線程。

3.2 數據格式轉換

3.2.1 CCIR656數據流的格式

  CCIR656的數據是分場的數據流(分為奇偶場),在每行數據的開始有SAV(有效視頻數據的開始),數據的結尾有EAV(有效視頻數據的結尾)。每場(奇場和偶場)數據、場逆程數據的SAV和EAV均不相同。CCIR656數據流格式如圖3所示。

?

?

  鏈接庫只需向應用程序提供QCIF(356×244)的圖像數據,而每行數據有720個有效象素,一般每行數據的開始和最后的幾個象素點是無關緊要的,因此通過舍棄每行數據的開始和結束的4個象素后再進行點抽樣,可得到每行356個有效象素。每場數據有244行有效數據(剛好是一場)剛好可以滿足需求,并且還可容納一定的錯誤。如果第一場數據出現錯誤,則丟掉此場數據,接著轉換第二場數據;若第二場數據未發生錯誤,則將此場數據送給應用程序;若這一幀的兩場數據均有問題,則只有丟掉此幀數據;若第一場數據正確,則不用轉換第二場數據。

3.2.2 設計方案

  在第一次調用此函數時,由于不知道有效數據從何處開始,所以需要在遍歷緩沖區查找SAV,找到后再開始處理。在后面的運行中,起始位置可由前一個緩沖區的偏移位置提供定位參考。在抽樣轉換過程中,有可能遇到下一個有效象素點(全部或部分分量)或者要處理的定位碼(SAV和EAV)不在此緩沖區內(在下一個緩沖區),這時應記錄這個象素或者定位碼所缺分量的偏移和已得到的部分分量。對于驗證部分SAV,須決定從哪個字節開始驗證。

  如果緩沖區開始的數據就是有效數據的分量,首先查看上一個象素是否已得到完整的處理,否則找到所缺的分量,轉換此象素,再對其余象素進行抽樣轉換處理。對于驗證EAV,驗證完畢后,跳過行逆程數據,設置合適的偏移量(下一個有效數據行的開始在緩沖區中的位置),進入下一次循環。對于出錯的處理,如果已發現正在處理的那一場數據有錯誤(每個象素的分量不可能是255和0,若是說明出錯),開始再次搜索SAV。此場余下的點不再轉換,處理點位置只簡單地向后移動,以便得到下一步處理所需的偏移。如果奇場數據出錯,便處理偶場數據,否則偶場數據不用處理。格式轉換流程如圖4所示。

?

?

  由于壓縮后的數據較少,PIO(程序控制的I/O)所需的時間較短,并且不需進行后續處理;而解壓后的數據量大,有27Mb/s,PIO所需的時間長,還要進行格式轉換。所以本驅動程序每秒可壓縮25~30幀圖像,可解壓10~15幀圖像。若考慮在壓縮時只傳出一場壓縮后的數據,可解壓的幀數會更多,圖像質量不會下降,但只能提供356×288格式的圖像,不能提供更高分辨率的圖像數據。

?

參考文獻

1 Art Baker.Windows NT 設備驅動程序設計指南.北京:機械工業出版社,1997

2 Jeffrey Richer.Windows 高級編程(第三版).北京:清華大學出版社,1999

3 Walter Oney.Programing? the? windows driver model. Microsoft? Press,1999

4 Peter G. Viscarola? NT Device Driver Development.北京:電子工業出版社,2000

5 Windows NT技術內幕(第二版).Microsoft Press,1999

6 NT DDK document.Microsoft,1996

7 VC技術內幕(第四版).北京:清華大學出版社,1998

8 錢能.C++ 程序設計教程.北京:清華大學出版社,1999

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲电影观看| 欧美在线啊v一区| 韩国在线视频一区| 国产精品自拍小视频| 欧美亚韩一区| 欧美日在线观看| 欧美老女人xx| 欧美激情黄色片| 欧美成人免费观看| 欧美成人精品福利| 欧美a级理论片| 免费一级欧美在线大片| 免费看成人av| 欧美成人午夜77777| 欧美成人免费在线观看| 蜜臀91精品一区二区三区| 久久综合一区二区| 另类激情亚洲| 欧美激情一区二区三区蜜桃视频| 免费在线观看精品| 欧美国产日韩一区二区在线观看| 欧美~级网站不卡| 欧美国产日韩二区| 欧美另类99xxxxx| 欧美日韩在线大尺度| 欧美三级视频在线播放| 国产精品久久久久久久久久ktv | 国产精品亚洲成人| 国产日韩欧美一区| 黄色成人av| 亚洲国产精品久久| 日韩午夜在线| 亚洲欧美日韩久久精品| 久久成人国产精品| 91久久精品国产91久久| 日韩视频在线观看国产| 亚洲小说欧美另类婷婷| 香蕉成人伊视频在线观看| 久久精品国产清高在天天线| 另类成人小视频在线| 欧美黄在线观看| 国产精品久久久久久久久久妞妞| 国产区亚洲区欧美区| 一区在线影院| 99re8这里有精品热视频免费| 亚洲在线观看| 久久精品国产亚洲a| 日韩午夜精品| 欧美亚洲免费高清在线观看| 久久嫩草精品久久久精品| 欧美激情偷拍| 国产伦精品一区二区三区四区免费| 国内久久婷婷综合| 日韩视频一区二区三区在线播放免费观看 | 欧美一区二区三区播放老司机 | 一本色道久久综合亚洲精品小说| 亚洲砖区区免费| 亚洲国产成人91精品| 中国日韩欧美久久久久久久久| 欧美一区二区三区在线| 欧美成人a∨高清免费观看| 欧美午夜电影网| 黄色精品一区| 夜夜狂射影院欧美极品| 亚洲电影欧美电影有声小说| 亚洲一区二区av电影| 麻豆av一区二区三区久久| 欧美午夜精品一区| 伊人春色精品| 亚洲一区三区电影在线观看| 亚洲精品久久久久久久久久久久久| 亚洲一区在线播放| 免费亚洲电影在线观看| 国产精品视区| 99国产欧美久久久精品| 亚洲高清视频的网址| 午夜精品久久久久久99热软件| 欧美高清不卡| 国产在线视频不卡二| 一区二区三区视频在线观看| 亚洲欧洲在线观看| 欧美在线亚洲综合一区| 欧美揉bbbbb揉bbbbb| 影音先锋亚洲电影| 亚洲在线网站| 中文一区字幕| 欧美91大片| 国产在线一区二区三区四区 | 亚洲国产女人aaa毛片在线| 亚洲自拍高清| 欧美伦理在线观看| 在线观看精品一区| 欧美一区二区三区免费观看视频| 一卡二卡3卡四卡高清精品视频| 久久精品国内一区二区三区| 欧美三级视频在线播放| 最新69国产成人精品视频免费| 欧美在线影院| 欧美在线一二三区| 国产精品久久久久高潮| 日韩视频在线观看免费| 亚洲精品偷拍| 免费美女久久99| 国产一区久久久| 欧美一级专区免费大片| 午夜日本精品| 国产精品二区在线| 日韩午夜精品视频| 一本色道久久综合亚洲精品按摩| 欧美电影电视剧在线观看| 韩国视频理论视频久久| 午夜精品久久久久久久99水蜜桃 | 国产精品女人网站| aa国产精品| 亚洲香蕉网站| 欧美午夜精品一区| 在线一区二区日韩| 亚洲欧美不卡| 国产精品乱码妇女bbbb| 中国亚洲黄色| 午夜欧美视频| 国产色综合久久| 久久成人国产| 久久免费的精品国产v∧| 国产综合色产在线精品| 亚洲丶国产丶欧美一区二区三区| 久久亚洲精品伦理| 国内精品免费午夜毛片| 久久成人免费视频| 另类激情亚洲| 亚洲欧洲精品一区二区三区 | 欧美午夜精品伦理| 亚洲视频在线免费观看| 午夜精品视频一区| 国产美女精品人人做人人爽| 性欧美8khd高清极品| 久久久青草婷婷精品综合日韩| 国产一区二区三区丝袜| 亚洲国产成人av好男人在线观看| 老**午夜毛片一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美日韩高清一区| 亚洲精品欧美一区二区三区| 欧美另类高清视频在线| 欧美经典一区二区三区| 国产精品久久一区主播| 影音先锋亚洲视频| 亚洲精品影院| 欧美三日本三级三级在线播放| 亚洲国产美女精品久久久久∴| 一区二区欧美在线观看| 国产精品麻豆成人av电影艾秋| 午夜精品电影| 免费在线国产精品| 一区二区三区国产在线观看| 久久国产精品一区二区三区四区| 在线观看成人小视频| 亚洲午夜羞羞片| 国内外成人在线| 99视频有精品| 国产精品日韩在线播放| 亚洲电影欧美电影有声小说| 欧美人与性动交cc0o| 亚洲欧美日韩国产成人精品影院| 美女脱光内衣内裤视频久久影院| 亚洲精品久久久久久久久久久| 亚洲欧美中文字幕| 亚洲第一二三四五区| 亚洲欧美精品在线观看| 在线看片日韩| 午夜精品理论片| 亚洲国产激情| 亚洲欧美在线免费观看| 亚洲大胆美女视频| 亚洲欧美国产制服动漫| 极品日韩久久| 亚洲欧美日韩人成在线播放| 极品日韩av| 欧美一区二区三区免费观看视频| 亚洲电影免费在线观看| 欧美在线free| 亚洲日本视频| 久久九九久精品国产免费直播| 亚洲精品美女久久7777777| 久久久久久婷| 亚洲天堂av在线免费| 欧美成人在线免费观看| 亚洲淫性视频| 欧美日韩国产成人高清视频| 欧美自拍偷拍午夜视频| 国产精品久久久久久久久久久久 | 久久福利毛片| 国产精品捆绑调教| 夜夜夜精品看看| 一区精品在线播放| 久久av一区二区三区漫画| 一区二区欧美亚洲| 欧美激情女人20p| 久久精品亚洲一区二区| 国产精品综合不卡av|