查看單個文章
舊 2005-10-20, 06:14 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 DirectShow對硬體的支持原理

DirectShow對硬體的支持原理

作者:陸其明




關鍵詞: DirectShow User mode Kernel mode WDM VFW

大家知道,為了提高系統的穩定性,Windows操作系統對硬體操作進行了隔離;應用程式一般不能直接訪問硬體。DirectShow Filter工作在用戶模式(User mode,操作系統特權等級為Ring 3),而硬體工作在內核模式(Kernel mode,操作系統特權等級為Ring 0),那麼它們之間怎麼協同工作呢?

DirectShow解決的方法是,為這些硬體設計包裝Filter;這種Filter能夠工作在用戶模式下,外觀、控制方法跟普通Filter一樣,而包裝Filter內部完成與硬體驅動程式的交互。這樣的設計,使得編寫DirectShow應用程式的開發人員,從為支持硬體而需做出的特殊處理中解脫出來。



DirectShow已經整合的包裝Filter,包括Audio Capture Filter(qcap.dll)、VfW Capture Filter(qcap.dll,Filter的Class Id為CLSID_VfwCapture)、TV Tuner Filter(KSTVTune.ax,Filter的Class Id為CLSID_CTVTunerFilter)、Analog Video Crossbar Filter(ksxbar.ax)、TV Audio Filter(Filter的Class Id為CLSID_TVAudioFilter)等;另外,DirectShow為採用WDM驅動程式的硬體設計了KsProxy Filter(Ksproxy.ax,)。我們來看一下結構圖:
http://hqtech.nease.net/Article/Images/HardDriver.jpg


從上圖中,我們可以看出,Ksproxy.ax、Kstune.ax、Ksxbar.ax這些包裝Filter跟其它普通的DirectShow Filter處於同一個等級,可以協同工作;用戶模式下的Filter通過Stream Class控制硬體的驅動程式minidriver(由硬體廠商提供的實現對硬體控制功能的DLL);Stream Class和minidriver一起向上層提供系統底層層次的服務。




值得注意的是,這裡的Stream Class是一種驅動模型,它負責使用硬體的minidriver;另外,Stream Class的功能還在於協調minidriver之間的工作,使得一些資料可以直接在Kernel mode下從一個硬體傳輸到另一個硬體(或同一個硬體上的不同功能模組),提高了系統的工作效率。


(更多的關於底層驅動程式的細節,請讀者參閱Windows DDK。)

下面,我們分別來看一下幾種一般的硬體。
VFW視瀕採集卡。這類硬體在市場上已經處於一種淘汰的趨勢;新生產的視瀕採集卡一般採用WDM驅動模型。


但是,DirectShow為了保持向後相容,還是專門提供了一個包裝Filter支持這種硬體。和其他硬體的包裝Filter一樣,這種包裝Filter的新增不是像普通Filter一樣使用CoCreateInstance,而要通過系統枚舉,然後BindToObject。

音瀕採集卡(音效卡)。音效卡的採集功能也是通過包裝Filter來實現的;而且現在的音效卡大部分都有混音的功能。這個Filter一般有幾個Input pin,每個pin都代表一個輸入,如Line In、Microphone、CD、MIDI等。值得注意的是,這些pin代表的是音效卡上的物理輸入端子,在Filter Graph中是永遠不會連線到其他Filter上的。



音效卡的輸出功能,可以有兩個Filter供選項:DirectSound Renderer Filter和Audio Renderer (WaveOut) Filter。注意,這兩個Filter不是上述意義上的包裝Filter,它們能夠同硬體交互,是因為它們使用了API函數:前者使用了DirectSound API,後者使用了waveOut API。


這兩個Filter的區別,還在於後者輸出音瀕的同時不支持混音。(順便說明一下,Video Renderer Filter能夠訪問顯示卡,也是因為使用了GDI、DirectDraw或Direct3D API。)如果你的電腦上有音效卡的話,你可以通過GraphEdit,在Audio Capture Sources目錄下看到這個音效卡的包裝Filter。

WDM驅動的硬體(包括視瀕捕捉卡、硬體解壓卡等)。這類硬體都使用Ksproxy.ax這個包裝Filter。Ksproxy.ax實現了很多功能,所以有「瑞士軍刀」的美譽;它還被稱作為「變色龍Filter」,因為該Filter上定義了統一的接頭,而接頭的實現因具體的硬體驅動程式而異。


在Filter Graph中,Ksproxy Filter顯示的名字為硬體的Friendly name(一般在驅動程式的.inf文件中定義)。我們可以通過GraphEdit,在WDM Streaming開頭的目錄中找到本地機系統中安裝的WDM硬體。因為KsProxy.ax能夠代表各種WDM的音視瀕設備,所以這個包裝Filter的工作流程有點複雜。



這個Filter不會預先知道要代表哪種檔案類型的設備,它必須首先訪問驅動程式的內容集,然後動態組態Filter上應該實現的接頭。


當Ksproxy Filter上的接頭方法被應用程式或其他Filter使用時,它會將使用方法以及參數傳送給驅動程式,由驅動程式最終完成指定功能。


除此以外,WDM硬體還支持內核流(Kernel Streaming),即內核模式下的資料傳輸,而無需經過到用戶模式的轉換。因為內核模式與用戶模式之間的相互轉換,需要花費很大的計算量。



如果使用內核流,不僅可以避免大量的計算,還避免了內核資料與主機記憶體之間的拷貝程序。在這種情況下,用戶模式的Filter Graph中,即使pin之間是連接的,也不會有實際的資料流動。



典型的情況,如帶有Video Port Pin的視瀕捕捉卡,Preview時顯示的圖像就是在內核模式下直接傳送到顯示卡的顯示記憶體的。所以,你也休想在VP Pin後面截獲資料流。

講到這裡,我想大家應該對DirectShow對硬體的支持問題有了一個總體的認識。


對於應用程式開發人員來說,這方面的內容不用研究得太透,而只需作為背景知識瞭解一下就好了。其實,大量繁瑣的工作DirectShow已經幫我們做好了。
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次