目標編寫一個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