編寫DirectShow Filters 概述

2021-04-17 16:56:25 字數 2736 閱讀 7220

seeker

(一) 介紹directshow filter開發

本章提供開發乙個自定義directshow filter的簡單框架描述,也提供了鏈結到更詳細討論這些任務的主題。在閱讀本章之前,閱讀在about directshow主題,它描述了全面的directshow構架。

1. directshow基類庫

directshow sdk包括了編寫filters的一組c++類。雖然它們不是必需的,但推薦使用這些類來編寫乙個新的filter。為了使用這些基類,需要把它們編譯成靜態庫並鏈結.lib檔案到自己的專案中,如building directshow filters中的描述。

基礎類庫定義了filters的乙個根類,cbasefilter類。幾個其它的類繼承自cbasefitler,並且指定於其它特定型別的filters。如,ctransformfilter類設計為transform類。為了建立乙個新filter,實現繼承自filters類中的乙個的類。如,你的類宣告可能如下表示:

class cmyfilter : public ctransformfilter

;2. 建立pins

filter必須建立乙個或多個pin。pin的數目可能在設計時間固定或者根據需要建立。pin一般繼承自cbasepin類或者從繼承自cbasepin的類來繼承,如cbaseinputpin。filter的pin應該宣告為filter類的成員變數。一些filter類已經定義了pin,但如果你的filter繼承自cbasefilter,你必須在你的繼承類中宣告這些pin。

3. 協商pin連線

當filter graph manager試圖去連線兩個filters,pins必須在各種事情上達成一致。如果不能,連線試圖失敗。一般,pin協商如下列:

1) transport:transport是filters用來從output pin移動media sample到input pin的機制。例如,它們可以使用imeminputpin介面(推模型)或者iasyncreader介面(拉模型)。

2) media type : 大多數pins使用media type來描述它們傳遞的資料格式

3) allocator : allocator是建立緩衝區來儲存資料的物件。pins必須一致哪個pin來提供allocator。必須在buffers的尺寸上,buffers建立的數目上和其它buffer屬性上一致。

基類實現了這些協商的framework,你必須通過過載在基類中的各種方法來完成細節。這些過載的方法的設定依賴於類和自定義filter的功能性。

4. 處理和傳遞資料

大多數filters的主要功能是處理和傳遞資料。如何傳遞根據filter的型別

1) push source有乙個工作執行緒,它持續的用資料填充sample並傳遞到downstream。

2) pull source等待它臨近的downstream來請求乙個sample。它通過寫資料到乙個sample並傳遞這個sample到downstream filter來響應。這個 downstream filter建立傳遞資料流動的執行緒。

3) transform filter通過它臨近upstream filter傳遞samples。當它接收乙個sample,處理資料並傳遞到downstream

4) renderer filter從upstream接收sample,並依據時間戳安排它們rendering。

其它流任務包括從graph中flushing資料,處理流的結束,響應seek請求,

5. 支援com

directshow filter都是com物件,一般在dll中打包,基類庫實現了乙個支援com的框架。

(二) 生成directshow filters

directshow基類推薦用來實現directshow filter。為了生成基類,執行下列步驟:

1) 生成基類庫, 位於sdk根目錄下的samples/**********/directshow/baseclasses,有兩個庫版本:retail版(strmbased.lib) 和debug版(strmbasd.lib)。

2) 包括stream.h標頭檔案

3) 使用__stdcall呼叫轉換(c/c++->高階)

4) 使用多執行緒的c run-time庫(debug/retail)(c/c++->**生成)

5) 包括乙個定義檔案(.def)暴露dll函式,如下列範例:假定輸出檔名為myfilter.dll

library myfilter.dll

exports

dllmain             private

dllgetclassobject   private

dllcanunloadnow     private

dllregisterserver   private

dllunregisterserver private

6) 鏈結到下列庫檔案

debug build :strmbasd.lib, msvcrtd.lib, winmm.lib

retail build :strmbase.lib, msvcrt.lib, winmm.lib

7) 在linker 設定選擇"ignore default libraries"。

8) 在源**中宣告dll入口點,如下:

extern "c" bool winapi dllentrypoint(hinstance, ulong, lpvoid);

bool apientry dllmain(handle hmodule, dword dwreason, lpvoid lpreserved)

php 編寫mysql php mysql 編寫

表單資料插入 表單資料插入 if get act insert error reporting 0 禁止錯誤輸出 mysql query set names utf 8 con mysql connect localhost 3306 root 1234 建立資料庫連 mysql select db...

python怎樣編寫 PYTHON怎樣編寫自動化

1級2018 09 18 回答 就直接寫指令碼,給你舉給例子 編寫工具 1.設計目標 首先說一下我要工具的功能 遍歷某個目錄下包括其下子目錄中所有指定的字尾檔案,然後為這些檔案的頭部插入指定的字串。2.使用場景 設計這樣的工具起因是我最近在將之前 csdn 中的部落格搬運到自己的 hexo 部落格空...

python編寫庫存管理 python編寫商品管理

1 實現乙個商品管理的程式。輸出1,新增商品 2 刪除商品 3 檢視商品 新增商品 商品的名稱 商品如果已經存在的話,提示商品商品已經存在 商品的 x 數量只能為大於0的整數 商品的數量 數量只能為大於0的整數 2 刪除商品 輸入商品名稱 iphone 如果輸入的商品名稱不存在,要提示不存在 3 檢...