專利名稱:采用過(guò)濾驅(qū)動(dòng)獲取圖形設(shè)備接口調(diào)用的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)圖形及圖像處理領(lǐng)域,具體涉及一種通過(guò)過(guò)濾 驅(qū)動(dòng)獲取計(jì)算機(jī)顯示設(shè)備圖形數(shù)據(jù)的方法。
背景技術(shù):
PC計(jì)算能力的增強(qiáng)和配套的圖形處理器使得PC上的圖形圖像處 理能力逐步增強(qiáng),從早期的2D位圖、向量應(yīng)用走向支持3D和視頻。 豐富內(nèi)容帶給用戶更好的體驗(yàn)的同時(shí)也給需要同步獲得顯示內(nèi)容的應(yīng) 用,比如遠(yuǎn)程控制、遠(yuǎn)程投影、多用戶共享和屏幕靜態(tài)截圖等帶來(lái)很 大挑戰(zhàn),特別是需要實(shí)時(shí)獲取屏幕內(nèi)容的應(yīng)用。
關(guān)于實(shí)時(shí)獲取屏幕內(nèi)容的技術(shù)有軟件實(shí)現(xiàn)方式和硬件實(shí)現(xiàn)方式。 通過(guò)硬件來(lái)實(shí)時(shí)獲取屏幕內(nèi)容的技術(shù)是直接截取顯示適配器的視頻輸 出信號(hào),并將其作為輸入源,輸入到視頻壓縮卡中,通過(guò)壓縮卡壓縮 后以流的形式記錄下來(lái)。這種硬件實(shí)現(xiàn)方案比較簡(jiǎn)單,由于使用硬件 壓縮卡處理視頻信號(hào),對(duì)計(jì)算機(jī)的處理能力沒(méi)有額外要求。但是這種 方案的缺點(diǎn)是需增加額外的視頻壓縮卡硬件,設(shè)備配置復(fù)雜,導(dǎo)致用 戶使用不便。此外,在硬件實(shí)現(xiàn)方案中,信號(hào)經(jīng)過(guò)兩次數(shù)模轉(zhuǎn)換,損 失了一定精度,存在較大失真,不能為用戶提供高質(zhì)量的畫面。
下面簡(jiǎn)單介紹通過(guò)軟件來(lái)實(shí)時(shí)獲得屏幕內(nèi)容的技術(shù)。在Windows 操作系統(tǒng)下,應(yīng)用程序通過(guò)GDI (圖形設(shè)備接口)完成屏幕的繪制, GDI支持圖元操作和點(diǎn)陣接口。圖元級(jí)接口相對(duì)高級(jí),需要的描述數(shù) 據(jù)少,但無(wú)法直接顯示,需要Windows顯示體系和顯卡硬件配合才能 轉(zhuǎn)換成點(diǎn)陣輸出。點(diǎn)陣級(jí)接口相對(duì)低級(jí),數(shù)據(jù)量大,但截獲的數(shù)據(jù)可 以直接顯示。因此,在軟件實(shí)現(xiàn)方案中,截獲GDI數(shù)據(jù)既可以在點(diǎn)陣 層次進(jìn)行,也可以在圖元調(diào)用層次進(jìn)行,或者二者結(jié)合進(jìn)行。
第一種軟件實(shí)現(xiàn)方案是采用一個(gè)用戶態(tài)應(yīng)用程序定時(shí)獲取
FmmeBuffer (幀緩沖),然后將獲取的幀圖像進(jìn)行后繼處理。第二種 軟件實(shí)現(xiàn)方案是采用微軟公司定義的顯示Mirror體系,加載映象顯示 驅(qū)動(dòng)程序(mirror),實(shí)時(shí)復(fù)制當(dāng)前顯示屏的各個(gè)更新,然后將映象后 的數(shù)據(jù)進(jìn)行壓縮以并流的形式記錄下來(lái)。
在第一種軟件實(shí)現(xiàn)方案中,每次獲取的是整個(gè)屏幕,不管區(qū)域有 沒(méi)有更新。而且該方案只能采用點(diǎn)陣接口,所以數(shù)據(jù)量大、處理慢、 帶寬要求高,適用于靜態(tài)單個(gè)屏幕截獲處理的應(yīng)用。在第二種軟件實(shí) 現(xiàn)方案中,只獲取屏幕變化的部分,因而獲取圖像數(shù)據(jù)的速度更快, 在圖像顯示的同時(shí)即可被復(fù)制(實(shí)時(shí)性更高),被廣泛采用。但是,由 于視頻和3D處理源數(shù)據(jù)量大,而且需要復(fù)雜的本地計(jì)算,通常由顯 卡硬件的GPU (圖形處理單元)進(jìn)行加速處理,所以微軟定義Mhror 體系時(shí)自動(dòng)禁止了本地計(jì)算機(jī)的視頻和3D加速支持,使得依賴于3D 和視頻加速的應(yīng)用程序無(wú)法運(yùn)行,采用Mhror的應(yīng)用程序的運(yùn)行效果 受到很大限制。
因此,需要尋找一種類似Miiror的快速截獲GDI調(diào)用的方法,同 時(shí)支持視頻和3D加速。
發(fā)明內(nèi)容
鑒于上述問(wèn)題,完成了本發(fā)明。本發(fā)明的目的是提供一種采用圖 形過(guò)濾驅(qū)動(dòng)獲取圖形設(shè)備接口調(diào)用的方法,以支持本地計(jì)算機(jī)的視頻 和3D加速。
在本發(fā)明的一個(gè)方面,提出了一種采用過(guò)濾驅(qū)動(dòng)截取圖形設(shè)備接 口調(diào)用的方法,所述過(guò)濾驅(qū)動(dòng)對(duì)圖形設(shè)備接口引擎和真實(shí)顯示驅(qū)動(dòng)是
透明的,所述方法包括步驟復(fù)制從真實(shí)顯示驅(qū)動(dòng)返回的DDI函數(shù)表; 修改需要截取屏幕更新的真實(shí)顯示驅(qū)動(dòng)的DDI函數(shù);創(chuàng)建輔助緩沖
區(qū),作為截獲的屏幕更新的更新緩沖區(qū);以及對(duì)更新緩沖區(qū)進(jìn)行進(jìn)一
步處理。
利用本發(fā)明的方法,可以通過(guò)軟件來(lái)實(shí)現(xiàn)對(duì)本地計(jì)算機(jī)的視頻和
3D加速支持,為用戶提供了高質(zhì)量的畫面和顯示效果。與現(xiàn)有技術(shù)的
Mhror體系相比,由于本發(fā)明未采用Mirror體系,系統(tǒng)的圖形設(shè)備接 口引擎并不知道存在過(guò)濾驅(qū)動(dòng),顯卡的視頻和3D加速功能仍然存在, 這些功能在系統(tǒng)中仍然可以獲得支持,采用視頻和3D加速的應(yīng)用程 序可以正常運(yùn)行。
圖1示出了根據(jù)本發(fā)明實(shí)施例的方法中所使用的圖形過(guò)濾驅(qū)動(dòng)與 GDI引擎和真實(shí)顯示驅(qū)動(dòng)之間的邏輯關(guān)系。
圖2是用來(lái)說(shuō)明根據(jù)本發(fā)明實(shí)施例的方法的流程圖。
圖3是示出了在加載圖形過(guò)濾驅(qū)動(dòng)的過(guò)程中需要復(fù)制和處理的接 口的名稱的DDI列表。
圖4以記錄更新點(diǎn)陣的TextOut為例示出了上述方法的步驟中的 處理流程。
具體實(shí)施例方式
以下對(duì)照附圖詳細(xì)說(shuō)明本發(fā)明的具體實(shí)施方式
。在下面的說(shuō)明中 省略了本領(lǐng)域公知的一些技術(shù)的細(xì)節(jié),因?yàn)閷?duì)這些公知技術(shù)的詳細(xì)描
述將會(huì)導(dǎo)致本發(fā)明的一些特點(diǎn)和優(yōu)點(diǎn)變得不清楚。
在Windows操作系統(tǒng)中,顯示驅(qū)動(dòng)被要求支持一系列圖形設(shè)備驅(qū) 動(dòng)接口DDI,這些接口大致可以分為管理驅(qū)動(dòng)的設(shè)備對(duì)象、Surface、 鼠標(biāo)、設(shè)備位圖、DirectX和繪制DDI。 一個(gè)程序只要實(shí)現(xiàn)了 DDI接 口就可以作為顯示驅(qū)動(dòng)被系統(tǒng)加載。
圖l示出了根據(jù)本發(fā)明實(shí)施例的方法中所使用的圖形過(guò)濾驅(qū)動(dòng)150 與GDI引擎100和真實(shí)顯示驅(qū)動(dòng)200之間的邏輯關(guān)系。
如圖1所示,本發(fā)明在GDI引擎100與真實(shí)顯示驅(qū)動(dòng)200之間加 入了一個(gè)過(guò)濾層,稱為圖形過(guò)濾驅(qū)動(dòng)150。通過(guò)安裝該圖形過(guò)濾驅(qū)動(dòng) 150并對(duì)系統(tǒng)進(jìn)行初始化,該過(guò)濾層對(duì)Windows GDI引擎100表現(xiàn)為 真實(shí)顯示驅(qū)動(dòng)200,而對(duì)真實(shí)顯示驅(qū)動(dòng)200則表現(xiàn)為Windows GDI引 擎100。也就是說(shuō),這里的圖形過(guò)濾驅(qū)動(dòng)150對(duì)GDI引擎100和真實(shí) 顯示驅(qū)動(dòng)200是透明的。
對(duì)于每個(gè)顯示更新對(duì)應(yīng)的繪制DDI,圖形過(guò)濾驅(qū)動(dòng)150的DDI首 先獲得調(diào)用,執(zhí)行時(shí)先調(diào)用真實(shí)顯示驅(qū)動(dòng)的對(duì)應(yīng)DDI完成本地顯示更 新,然后將該調(diào)用參數(shù)保存到調(diào)用更新表300中,或者調(diào)用GDI引 擎100轉(zhuǎn)化為點(diǎn)陣,同時(shí)記錄下顯示的畫面中變化的區(qū)域。
圖2是用來(lái)說(shuō)明根據(jù)本發(fā)明實(shí)施例的方法的流程圖。如圖2所示, 在步驟S210,將上述的圖形過(guò)濾驅(qū)動(dòng)150安裝為當(dāng)前顯卡的虛擬驅(qū)動(dòng)。
在安裝過(guò)程中,安裝程序獲取當(dāng)前系統(tǒng)的主顯示設(shè)備的PND DeviceID (即插即用設(shè)備標(biāo)識(shí)),枚舉并匹配顯卡注冊(cè)項(xiàng) (4d36e968-e325-llce-bfcl-08002bel0318〉下每個(gè)注冊(cè)項(xiàng)的DeviceID。 對(duì)于匹配的注冊(cè)項(xiàng),修改其Settings (設(shè)置)鍵下的 InstalledDisplayDrivers注冊(cè)項(xiàng),將該Key的值修改為本發(fā)明的圖形過(guò) 濾驅(qū)動(dòng)150的名字。
在步驟S220,操作系統(tǒng)通過(guò)圖形過(guò)濾驅(qū)動(dòng)的名字獲得顯示驅(qū)動(dòng)的 模塊名稱并加載到系統(tǒng)中,從而將圖形過(guò)濾驅(qū)動(dòng)150加載到系統(tǒng)中。
在系統(tǒng)加載圖形過(guò)濾驅(qū)動(dòng)期間,在驅(qū)動(dòng)入口函數(shù)DrvEnableDriver 中,圖形過(guò)濾驅(qū)動(dòng)150加載真實(shí)顯示驅(qū)動(dòng)200,并將真實(shí)顯示驅(qū)動(dòng)200 返回的DDI函數(shù)表復(fù)制一份,對(duì)需要截取屏幕更新的DDI函數(shù),將 其在函數(shù)表中的值修改成指向過(guò)濾驅(qū)動(dòng)對(duì)應(yīng)函數(shù)的指針,同時(shí)保存原 始函數(shù)指針,對(duì)不需要處理的函數(shù),比如視頻和3D加速接口,仍然 保留為真實(shí)顯示驅(qū)動(dòng)的函數(shù)指針,復(fù)制的函數(shù)表返回給GDI。這樣, 圖形過(guò)濾驅(qū)動(dòng)150實(shí)現(xiàn)了對(duì)真實(shí)顯示驅(qū)動(dòng)200調(diào)用的過(guò)濾功能。
圖3是示出了在加載圖形過(guò)濾驅(qū)動(dòng)的過(guò)程中需要復(fù)制和處理的接 口的名稱的DDI列表。
在這些接口 DDI中,圖形過(guò)濾驅(qū)動(dòng)150需要實(shí)現(xiàn)所有的驅(qū)動(dòng)管理 DDI,以實(shí)現(xiàn)將GDI要求的驅(qū)動(dòng)加載、驅(qū)動(dòng)禁止等功能截獲下來(lái),創(chuàng) 建內(nèi)部的管理數(shù)據(jù),并將調(diào)用轉(zhuǎn)發(fā)給真實(shí)驅(qū)動(dòng)的相應(yīng)函數(shù)。
此外,繪制DDI是截獲內(nèi)容的重點(diǎn),所有的屏幕更新都是通過(guò)繪 制DDI完成的,在這些函數(shù)中,圖形過(guò)濾驅(qū)動(dòng)150記錄下更新DDI 的參數(shù)和更新的源數(shù)據(jù),保存到更新調(diào)用表300中,并調(diào)用真實(shí)顯示 驅(qū)動(dòng)200的相應(yīng)DDI完成本地繪制。如果需要,圖形過(guò)濾驅(qū)動(dòng)150也
可以將更新DDI的調(diào)用轉(zhuǎn)換成點(diǎn)陣,保存到更新幀緩沖中。
此外,鼠標(biāo)控制DDI實(shí)現(xiàn)鼠標(biāo)位置和形狀更新,圖形過(guò)濾驅(qū)動(dòng) 150將這些信息記錄下來(lái)供后繼處理400。
在步驟S230,圖形過(guò)濾驅(qū)動(dòng)200的DrvEnableSurface DDI獲得調(diào) 用,該DDI負(fù)責(zé)創(chuàng)建一個(gè)主Surface,后繼的所有繪制DDI的輸出結(jié) 果都保存到該主Surface中,如果過(guò)濾驅(qū)動(dòng)要保存更新緩沖,圖形過(guò) 濾過(guò)濾驅(qū)動(dòng)150創(chuàng)建一個(gè)輔助Smface,作為截獲的屏幕更新的更新緩 沖,當(dāng)后繼的繪制DDI被調(diào)用時(shí),將繪制點(diǎn)陣保存在這個(gè)輔助Surface 中。
在步驟S240,需要截取屏幕更新的繪制DDI得到調(diào)用,圖形過(guò) 濾驅(qū)動(dòng)150將調(diào)用參數(shù)和更新數(shù)據(jù)源保存到更新調(diào)用表300中,先通 過(guò)保存的原始函數(shù)指針調(diào)用真實(shí)驅(qū)動(dòng)的DDI,完成真實(shí)顯卡的顯示更 新,如果要保存幀緩沖,圖形過(guò)濾驅(qū)動(dòng)150自己或者借助GDI引擎 100在輔助Surface上完成繪制。這樣,在輔助緩沖區(qū)中的內(nèi)容就與顯 示屏幕得到了同步更新。
圖4以記錄更新點(diǎn)陣的TextOut為例示出了上述方法的步驟S240 中的處理流程。
如圖4所示,在步驟S410,系統(tǒng)首先判斷真實(shí)顯示驅(qū)動(dòng)200是否 支持該DDI,如果支持,則在步驟S420,調(diào)用真實(shí)顯示驅(qū)動(dòng)200的函
數(shù)更新本地顯示,否則跳過(guò)本地更新。
然后,在步驟S430,系統(tǒng)判斷圖形過(guò)濾驅(qū)動(dòng)150是否在工作狀態(tài), 如果不工作,則結(jié)束。如果圖形過(guò)濾驅(qū)動(dòng)在處于截屏狀態(tài),則在步驟 S440,查找在DrvEnablePDEV階段創(chuàng)建的過(guò)濾驅(qū)動(dòng)的結(jié)構(gòu)。在步驟 S450,判斷是否找到。如果找到,說(shuō)明該結(jié)構(gòu)的確是過(guò)濾驅(qū)動(dòng)創(chuàng)建, 在步驟S460,鎖定輔助Surface,在步驟S470,將點(diǎn)陣?yán)L制到該輔助 Surface中并在步驟S480解鎖該輔助Surface。在步驟S4卯,對(duì)獲得的 點(diǎn)陣進(jìn)行后繼處理。
本發(fā)明的采用過(guò)濾驅(qū)動(dòng)截獲GDI數(shù)據(jù)的方法可以應(yīng)用于支持視 頻和3D應(yīng)用的無(wú)線投影方案中,在該方案中對(duì)截獲的繪制DDI通過(guò) 調(diào)用GDI Engine的對(duì)應(yīng)函數(shù)完成繪制處理,然后將保存在更新緩沖區(qū)
中的點(diǎn)陣通過(guò)其它模塊進(jìn)行了壓縮編碼并通過(guò)網(wǎng)絡(luò)發(fā)送到投影機(jī)遠(yuǎn) 端;也可以將截獲的繪制元語(yǔ)進(jìn)行區(qū)分,對(duì)涉及點(diǎn)陣操作的DDI的點(diǎn) 陣數(shù)據(jù)進(jìn)行壓縮處理,而對(duì)非點(diǎn)陣數(shù)據(jù)則直接處理更新緩沖中的繪制 元語(yǔ),兩種數(shù)據(jù)一起發(fā)送到投影機(jī)端進(jìn)行解壓縮和元語(yǔ)繪制,以復(fù)制 主機(jī)端的畫面。
以上所述,僅為本發(fā)明中的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍 并不局限于此,任何熟悉該技術(shù)的人在本發(fā)明所揭露的技術(shù)范圍內(nèi), 可輕易想到的變換或替換,都應(yīng)涵蓋在本發(fā)明的包含范圍之內(nèi)。因此, 太發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求書的保護(hù)范圍為準(zhǔn)。
權(quán)利要求
1.一種采用過(guò)濾驅(qū)動(dòng)截取圖形設(shè)備接口調(diào)用的方法,所述過(guò)濾驅(qū)動(dòng)對(duì)圖形設(shè)備接口引擎和真實(shí)顯示驅(qū)動(dòng)是透明的,所述方法包括步驟復(fù)制從真實(shí)顯示驅(qū)動(dòng)返回的DDI函數(shù)表;修改需要截取屏幕更新的真實(shí)顯示驅(qū)動(dòng)的DDI函數(shù);創(chuàng)建輔助緩沖區(qū),作為截獲的屏幕更新的更新緩沖區(qū);以及對(duì)更新緩沖區(qū)進(jìn)行后繼處理。
2. 根據(jù)權(quán)利要求l所述的方法,其特征在于,所述修改需要截取屏幕更新的DDI函數(shù)的步驟包括將需要截取屏幕更新的DDI函數(shù)在函數(shù)表中的值修改成指向過(guò)濾 驅(qū)動(dòng)對(duì)應(yīng)函數(shù)的指針,同時(shí)保存原始函數(shù)指針。
3. 根據(jù)權(quán)利要求l所述的方法,其特征在于,所述調(diào)用真實(shí)顯示 驅(qū)動(dòng)的相應(yīng)繪制DDI以完成本地顯示更新的步驟包括通過(guò)保存的原始函數(shù)指針調(diào)用真實(shí)顯示驅(qū)動(dòng)的繪制DDI,完成真 實(shí)顯卡的顯示更新。
4. 根據(jù)權(quán)利要求l所述的方法,其特征在于,所述對(duì)更新緩沖區(qū)的后繼處理的步驟包括根據(jù)需要將更新緩沖區(qū)進(jìn)行繪制成點(diǎn)陣或者直接處理截獲的元語(yǔ)。
5. 根據(jù)權(quán)利要求l所述的方法,其特征在于,還包括調(diào)用真實(shí)顯示驅(qū)動(dòng)的相應(yīng)繪制DDI,以完成本地的顯示更新。
全文摘要
公開(kāi)了一種采用過(guò)濾驅(qū)動(dòng)截取圖形設(shè)備接口調(diào)用的方法,所述過(guò)濾驅(qū)動(dòng)對(duì)圖形設(shè)備接口引擎和真實(shí)顯示驅(qū)動(dòng)是透明的,所述方法包括步驟復(fù)制從真實(shí)顯示驅(qū)動(dòng)返回的DDI函數(shù)表;修改需要截取屏幕更新的真實(shí)顯示驅(qū)動(dòng)的DDI函數(shù);創(chuàng)建輔助緩沖區(qū),作為截獲的屏幕更新的更新緩沖區(qū);以及對(duì)更新緩沖區(qū)進(jìn)行后繼處理。利用本發(fā)明的方法,可以通過(guò)軟件來(lái)實(shí)現(xiàn)對(duì)本地計(jì)算機(jī)的視頻和3D加速支持,為用戶提供了高質(zhì)量的畫面和顯示效果。與現(xiàn)有技術(shù)的Mirror體系相比,由于本發(fā)明未采用Mirror體系,系統(tǒng)的圖形設(shè)備接口引擎并不知道存在過(guò)濾驅(qū)動(dòng),顯卡的視頻和3D加速功能仍然存在,這些功能在系統(tǒng)中仍然可以獲得支持,采用視頻和3D加速的應(yīng)用程序可以正常運(yùn)行。
文檔編號(hào)G06F9/44GK101105746SQ20061010323
公開(kāi)日2008年1月16日 申請(qǐng)日期2006年7月14日 優(yōu)先權(quán)日2006年7月14日
發(fā)明者渤 劉, 孫成昆, 彭紹平, 李洪偉, 顏毅強(qiáng) 申請(qǐng)人:聯(lián)想(北京)有限公司