4、**samples和allocators
filters通過pin的連線來傳遞資料,資料流是從乙個filter的輸出pin流向相連的filter的輸入pin。輸出pin常用的傳遞資料的方式是呼叫輸入pin上的imeminputpin::receive方法。
對於filter來說,可以有好幾種方式來分配**資料使用的記憶體塊,可以在堆上分配,可以在directdraw的表面,也可以採用gdi共享記憶體,還有其他的一些方法,在directshow中用來進行記憶體分配任務的是記憶體分配器(allocator),也是乙個com物件,暴露了乙個imemallocator介面。
當兩個pin連線的時候,必須有乙個pin提供乙個allocator,directshow定義了一系列函式呼叫用來確定由哪個pin提供allocator,以及buffer的數量和大小。
在資料流開始之前,allocator會建立乙個記憶體池(pool of buffer),在開始傳送資料流以後,源filter就會將資料填充到記憶體池中乙個空閒的buffer中,然後傳遞給下面的filter。但是,源filter並不是直接將記憶體buffer的指標直接傳遞給下游的filter,而是通過乙個media samples的com物件,這個sample是allocator建立的用來管理記憶體buffer。media sample暴露了imediasample介面,乙個sample包含了下面的內容:
乙個指向沒有傳送的記憶體的指標。
乙個時間戳
一些標誌
**型別。
時間戳表明了presentation time,renderer filter就是根據這個時間來安排render順序的。標誌是用來標示資料是否中斷等等,**型別提供了中途改變資料格式的一種方法,不過,一般sample沒有**型別,表明它們的**型別一直沒有改變。
當乙個filter正在使用buffer,它就會保持乙個sample的引用計數,allocator通過sample的引用計數用來確定是否可以重新使用乙個buffer。這樣就防止了buffer的使用衝突,當所有的filter都釋放了對sample的引用,sample才返回到allocator的記憶體池,供重新使用。
5、硬體裝置在graph中的作用
下面的這段話借用的是陸其明的一段文件,特此標記2005-1-26我覺得他對硬體的表述比較清楚。
大家知道,為了提高系統的穩定性,windows作業系統
對硬體操作進行了隔離;應用程式一般不能直接訪問硬體。directshow filter工作在使用者模式(user mode,作業系統特權級別為ring 3),而硬體工作在核心模式(kernel mode,作業系統特權級別為ring 0),那麼它們之間怎麼協同工作呢?
directshow解決的方法是,為這些硬體設計
包裝filter;這種filter能夠工作在使用者模式下,外觀、控制方法跟普通filter一樣,而包裝filter內部完成與硬體驅動程式的互動。這樣的設計,使得編寫directshow應用程式的開發
就是在核心模式下直接傳送到顯示卡的視訊記憶體的。所以,你也休想在vp pin後面截獲資料流。
講到這裡,我想大家應該對directshow對硬體的支援問題有了乙個總體的認識。對於應用程式開發人員來說,這方面的內容不用研究得太透,而只需作為背景知識了解一下就好了。其實,大量繁瑣的工作directshow已經幫我們做好了。
DirectShow開發快速入門之二資料流的流動
directshow資料流動概述 filter之間的資料是通過sample來傳送的。sample是乙個com元件,擁有自己的一段資料緩衝buffer,這個com元件暴露了imediasample介面。這個sample一般都有乙個叫做記憶體分配器 alloctor 的com物件來建立管理,這個物件具有...
DirectShow開發快速入門之事件通知機制
摘要 這篇文件描述directshow中事件產生的機制,以及應用程式是如何處理事件的。概述 事件是graph圖和應用程式之間互相通訊的機制,類似於訊息機制。當某個事件發生時,比如資料流結束,產生乙個錯誤等,filter就要給filter圖表管理器 graph manager 傳送乙個事件通知。fil...
DirectShow開發快速入門之資料流的流動
摘要 本篇文件中主要講述了graph圖表中資料流是如何傳遞的,如果你是做directshow的應用開發也許對於這些細節並不需要了解,如果你要開發自己的filter,就很有必要了解這些細節。directshow資料流動概述 filter之間的資料是通過sample來傳送的。sample是乙個com元件...