在directshow系統概述中介紹了directshow的總體系統框架。本文我們從程式設計師的角度,進一步深入**一下directshow的應用以及filter的開發。
學習directshow filter的開發,不外乎以下幾種方法:看幫助文件、看示例**和看sdk基類源**。看幫助文件,應著重於總體概念上的理解;看示例**應與基類源**的研究同步進行,因為自己寫filter,關鍵的第一步是選擇乙個合適的filter基類和pin的基類。對於filter的把握,一般認為要掌握以下三方面的內容:filter之間pin的連線、filter之間的資料傳輸以及流**的隨機訪問(或者說流的定位)。下面就開始分別進行闡述。
所謂的filter pin之間的連線,實際上是pin之間media type(**型別)的乙個協商過程。連線總是從輸出pin指向輸入pin的。要想深入了解具體的連線過程,就必須認真研讀sdk的基類源**(位於dxsdk/samples/**********/directshow/baseclasses/amfilter.cpp,類cbasepin的connect方法)。連線的大致過程為,列舉欲連線的輸入pin上所有的**型別,逐一用這些**型別與輸出pin進行連線,如果輸出pin也接受這種**型別,則pin之間的連線宣告成功;如果所有輸入pin上列舉的**型別輸出pin都不支援,則列舉輸出pin上的所有**型別,並逐一用這些**型別與輸入pin進行連線。如果輸入pin接受其中的一種**型別,則pin之間的連線到此也宣告成功;如果輸出pin上的所有**型別,輸入pin都不支援,則這兩個pin之間的連線過程宣告失敗。
有一點需要注意的是,上述的輸入pin與輸出pin一般不屬於同乙個filter,典型的是上一級filter(也叫upstream filter)的輸出pin連向下一級filter(也叫downstream filter)的輸入pin。如下圖所示:
當filter的pin之間連線完成,也就是說,連線雙方通過協商取得了一種大家都支援的**型別之後,即開始為資料傳輸做準備。這些準備工作中,最重要的是pin上的記憶體分配器的協商,一般也是由輸出pin發起。在directshow filter之間,資料是通過乙個乙個資料報傳送的,這個資料報叫做sample。sample本身是乙個com物件,擁有一段記憶體用以裝載資料,sample就由記憶體分配器(allocator)來統一管理。已成功連線的一對輸出、輸入pin使用同乙個記憶體分配器,所以資料從輸出pin傳送到輸入pin上是無需記憶體拷貝的。而典型的資料拷貝,一般發生在filter內部,從filter的輸入pin上讀取資料後,進行一定意圖的處理,然後在filter的輸出pin上填充資料,然後繼續往下傳輸。下面,我們就具體闡述一下filter之間的資料傳送。
進一步的了解,請認真研讀sdk的基類源**(位於dxsdk/samples/**********/directshow/baseclasses/transfrm.cpp的類方法ctransformoutputpin::nondelegatingqueryinte***ce實現和ctlutil.cpp中類cpospassthru的實現)。
以上我們介紹了一下如何學習directshow filter開發,以及一些開始寫自己的filter之前的預備知識。下一講,筆者將根據自己開發filter的經驗,手把手教你如何寫自己的filter。
directshow 9 程式設計
定義 cb videocapfilters tcombobox cb audiocapfilters tcombobox cb videoformats tcombobox cb audioformats tcombobox cb inputlines tcombobox audiosourcefi...
分享DirectShow程式設計的一點經驗
在 型別傳遞時,會有cmediatype的formattype成員,是乙個guid,其對應的結構型別我總結如下 format videoinfo videoinfoheader,videoinfo bigger than videoinfoheader,compatible with videoin...
程式設計之我見
激情不夠,活也不行 部分專注專案,理論不行。或當下的技術棧完全可以勝任工作,拿到可觀的薪水,溫水之中做乙隻安逸的青蛙。學好程式設計必須富有激情,充滿了性趣。理論 沒有理論支撐,實踐只是機械性的死記硬背 實踐 將理論穿插進實踐,將理論都玩明白,姿勢要舒服。經驗 遇到的問題多了,解決的多了,經驗就多了。...