DirectShow-Filter原理

11、Filter原理——概述
       Filter 是DirectShow中最基本的概念。DirectShow使用Filter Graph來管理Filter(管理者叫做Filter Graph Manager)。Filter Graph是Filter的“容器“,而Filter是Filter Graph中的最小功能模塊。    
Filter是一種COM組件。爲了實現在Filter Graph中的統一操作,每個Filter上都至少實現了IBaseFilter接口。IBaseFilter繼承自IMediaFilter。Filter Graph Manager正是通過IMediaFilter的接口方法來控制Filter Graph的狀態(運行、暫停、停止)轉換。
Filter的類別:
Source Filters主要負責獲取數據,數據源可以是文件也可以是設備。只有輸出Pin。
Transform Filters主要負責數據的格式轉換,例如數據流分離/合成、編碼/解碼等,然後將數據繼續往下傳輸。既有輸入Pin又有輸出Pin。
Rendering Filters主要負責數據的最終去向,送達設備或文件。只有輸出Pin。
 
12、Filter原理——註冊
實現Filter的文件一般是一個DLL,擴展名可以是.dll,但更多的時候是.ax。一般一個Filter項目都會包含一個.def文件,用於定義4個導出函數。
既然Filter是一種COM組件,使用前就必須先註冊。Filter的註冊信息一般包括兩部分:基本的COM信息和Filter特有信息。在.def文件定義的4個導出函數:DllGetClassObject在創建Filter對象的時候被調用,根據CLSID返回對應的類工廠對象;DllCanUnloadNow用於判斷是否可以從內存中卸載Filter DLL,即DLL中實現的所有COM對象是否都已經釋放;DllRegisterServer和DllUnregisterServer調用AMovieDllRegisterServer2函數完成COM組件的自注冊功能。
 
13、Filter原理——連接
Filter一般由一個或多個Pin組成,Filter之間通過Pin相互連接,構成一條順序的鏈路。
Filter的連接實際上也是Filter上Pin的連接,Pin的連接實際上是連接雙方使用的媒體類型的一個“協商”過程。試圖連接的兩個Filter必須處在同一個Filter Graph中,可以調用接口方法IFilterGraph::AddFilter將指定的Filter加入到Filter Graph。
整個連接過程的步驟大致如下:
A、Filter Graph Manager在輸出Pin上調用IPin::Connect;
B、如果輸出Pin接受連接,則調用輸入Pin上的IPin::ReceiveConnection;
C、如果輸入Pin也接受這次連接,則雙方連接成功。
 
14、Filter原理——動態重建技術
       由於一些原因,我們需要對已有的Filter Graph進行修改。通常的做法是,先將Filter Graph停止,進行修改之後,在重新啓動。另外還能夠在保持Filter Graph運行狀態的同時實現動態重建。Filter Graph的重建包括如下幾種情形:
       A、僅僅改變Filter之間連接的媒體類型;
       B、增加或刪除Filter,重新進行相關Filter之間的連接;
       C、對一條Filter鏈路(Filter Chain)進行操作。
 
15、Filter原理——數據傳送
每個Pin上都實現了IPin接口,這個接口主要用於Pin的連接,而不是數據傳送。真正用於數據傳送的一般是輸入Pin上實現的IMemInputPin接口和輸出Pin上實現的IAsyncReader接口。Filter之間的成功連接爲數據傳送做好了準備。Filter之間是以Sample的形式傳送數據的,Sample是一個封裝了一定大小數據內存的COM組件。Samplle是由分配器(Allicator,也是一個COM組件)來管理的。連接雙方的Pin必須使用同一個分配器,但是這個分配器到底由哪個Pin來創建也需要協商。
數據傳送主要有兩種模式:推模式(Push Model)和拉模式(Pull Model)。
DirectShow總是使用專門的線程來傳送數據。所以,DirectShow應用程序至少包含兩條線程,一條應用程序主線程以及至少一條數據傳送子線程。
 
16、Filter原理——狀態轉換
       Filter有3種狀態:停止(Stopped)、暫停(Paused)和運行(Running)。其中,暫停可以理解爲數據就緒狀態,是爲了快速切換到運行狀態而設計的。作爲一種中間狀態,暫停也是停止與運行之間切換所必經的一種狀態。
 
17、Filter原理——媒體定位的實現
應用程序可以通過Filter Graph Manager上獲得的IMediaSeeking接口,實現對流媒體的隨機定位(Seeking)和調整媒體文件的回放速率。實際上,IMediaSeeking接口的真正實現在Filter上。
用於媒體定位的還有另外一個接口IMediaPosition,這是一個支持自動化(Automation)的接口,是爲那些弱類型編程語言(如VB)開發DirectShow應用程序而設計的。對於Filter開發人員來說,並不要求實現IMediaPosition。Filter Graph Manager會自動將IMediaPosition的接口方法調用轉換爲IMediaSeeking的接口方法調用。
 
18、Filter原理——質量控制的實現
數據線程是通過一種“壓迫式”方式往下傳送數據的。雖然Video Renderer接收到Sample後,會根據Sample上的時間戳來正確安排顯示時機,但僅僅這樣是不夠的,它並不能改善Filter Graph運行時的性能。因此,DirectShow另外設計了一種“自適應”的反饋機制:質量控制(Quality Control)。質量控制通過IQualityControl接口來實現。具體質量控制策略的實現取決於具體的Filter實現,可能調整發送速度,也可能是丟失部分數據。
 
19、Filter原理——音視頻同步解決方案
       在任何系統設計中,最關鍵的都是系統框架以及控制部分。DirectShow也不例外,這個重要的部分就是Filter Graph Manager,它向下直接控制Filter Graph中的所有Filter,向上對應用程序提供編程接口。可惜的是,微軟公司並沒有提供這些功能控制的源代碼。
DirectShow的音視頻同步解決方案就是爲Filter Graph選擇一個公共的參考時鐘(Reference Clock),並且要求傳送到Renderer Filter的每個Sample都打上時間戳(Time Stamp);Video Renderer或Audio Renderer根據Sample的時間戳以及參考時鐘當前的參考時間,來正確安排Sample的播放時機。
 
20、Filter原理——對硬件的支持
       爲了提高系統的穩定性,Windows對硬件操作進行了隔離,應用程序一般不能直接訪問硬件。DirectShowFilter工作在用戶模式下,而硬件工作在內核模式下,它們之間如何協同工作呢?DirectShow的解決方案是爲這些硬件提供包裝(Wrapper)Filter,這種Filter能夠工作在用戶模式下,其外觀和控制方法與普通Filter一樣,而包裝Filter在內部完成與硬件功能的交互。
 
21、Filter原理——VMR-9的發佈
       VMR(Video Mixing Renderer)是DirectShow的新一代Video Renderer。VMR有兩個版本:VMR-7和VMR-9。前者採用了DirectDraw 7技術,僅僅在Windows XP操作系統下可以獲得,並且是XP上默認的用於視頻顯示的Renderer(代替傳統的Video Renderer);後者採用了Direct3D 9的技術,是隨DirectX9.0一起發佈的,但任何時候都不是默認的Renderer。
       安裝了DirectX9.0以後,就有4個Video Renderer可供選擇使用:傳統的Video Renderer、Overlay Mixer、VMR-7和CMR-9。
       VMR主要利用了顯卡專有的圖形處理能力(VMR做視頻的合成和顯示時並不佔用系統的CPU資源),它能夠表現的性能對於硬件的依賴性很高。
 
22、Filter原理——Filter Graph的構建方法
(1)IFilterGraph::AddFilter:該參數提供一個Filter對象,將其加入到Filter Graph中。
(2)IFilterGraph::ConnectDirect:該參數提供輸出Pin、輸入Pin以及媒體類型,進行直接的連接。
(3)IGraphBuilder::AddSourceFilter:該參數提供源文件名,自動將一個Source Filter加載到Filter Graph中。
(4)IGraphBuilder::Connect:該參數提供輸出Pin和輸入Pin進行連接,如果連接失敗,自動嘗試在中間插入必要的格式轉換Filter。
(5)IGraphBuilder::Render:該參數提供輸出Pin,自動加入必要的Filter完成剩下部分Filter Graph的構建(直到連接到Rendering Filter)。
(6)IGraphBuilder::RnderFile:該參數提供源文件名,自動加入必要的Filter完成這個文件的回放Filter Graph的構建。
Filter通過Pin這樣的連接,就能“串聯”起來,從而構建完整的Filter Graph。後四種構建方法都有“自動”的功能,這種機制稱爲智能連接(Intelligent Connect)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章