DirectShow基礎編程 最簡單transform filter 編寫步驟

目標編寫一個transform filter,功能是對圖像進行翻轉。

MSDN中有一章 "Writing Transform Filters" 列出了編寫transform filter的六個基本步驟,我們按照這六個步驟一步一步來。

 

一、選擇基類

從CBaseFilter派生出三個用於編寫transform filter的類,分別是:CTransformFilter 、CTransInPlaceFilter 和CVideoTransformFilter ,三個基類的區別可以看MSDN的說明,我們選擇CTransformFilter類。

選擇好基類,我們就創建一個空的DLL工程,添加三個文件,分別是:FlipFilter.h、FlipFilter.cpp和FlipFilter.def。

 

二、聲明Filter類

在FlipFilter.h中添加下列代碼聲明

 

三、媒體類型協商

這一步是Filter的pin在連接的時候必須進行的步驟,主要重載三個函數:

1、HRESULT CheckInputType(const CMediaType *mtIn);

CTransformFilter使用CTransformInputPin類作爲輸入pin,CTransformInputPin::CheckMediaType(const CMediaType* pmt)中調用m_pTransformFilter->CheckInputType(pmt);因此我們可以簡單的認爲CheckInputType就是輸入pin的CheckMediaType。這樣設計的是爲了不需要重新定義輸入pin類,只需要定義Filter類,簡化編寫Transform filter的步驟,另外的幾個接口也是這樣的一個設計原理。

2、HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);

同樣的,這個函數也是爲輸入pin所寫。

3、HRESULT CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut);

這個函數是輸出pin調用。CTransformOutputPin::CheckMediaType(const CMediaType* pmtOut)中調用m_pTransformFilter->CheckTransform。

 

四、協商分配器的屬性,決定數據的屬性

這個函數由CTransformOutputPin::DecideBufferSize調用。

 

五、實現數據轉換

 

六、添加COM信息,使DLL成爲filter

1、創建filter實例,這是標準格式

2、聲明工廠類模版

3、註冊和註銷filter,DLL的全局入口

 

Filter編寫完成。

 

注:完整代碼下載:http://d.download.csdn.net/down/2435821/bwmwm

 

 

 

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