// directshow inte***ces
igraphbuilder *pgb = null;
imediacontrol *pmc = null;
imediaeventex *pme = null;
ivideowindow *pvw = null;
ibasicaudio *pba = null;
ibasicvideo *pbv = null;
imediaseeking *pms = null;
imediaposition *pmp = null;
ivideoframestep *pfs = null;
然後例項化乙個過濾器圖表管理器,並查詢各界面:
// get the inte***ce for directshow's graphbuilder
cocreateinstance(clsid_filtergraph, null, clsctx_inproc_server,
iid_igraphbuilder, (void **)&pgb);
// queryinte***ce for directshow inte***ces
pgb->queryinte***ce(iid_imediacontrol, (void **)&pmc);
pgb->queryinte***ce(iid_imediaeventex, (void **)&pme);
pgb->queryinte***ce(iid_imediaseeking, (void **)&pms);
pgb->queryinte***ce(iid_imediaposition, (void **)&pmp);
// query for video inte***ces, which may not be relevant for audio files
pgb->queryinte***ce(iid_ivideowindow, (void **)&pvw);
pgb->queryinte***ce(iid_ibasicvideo, (void **)&pbv);
// query for audio inte***ces, which may not be relevant for video-only files
pgb->queryinte***ce(iid_ibasicaudio, (void **)&pba);
3.3 建立過濾器圖表
應用directshow建立過濾器圖表時,使用者完全不需要操心系統使用了哪一類過濾器以及過濾器是怎樣連線的。只要呼叫igraphbuilder::renderfile函式,就可以建成乙個完整的過濾器圖表。
// run the graph to play the media file
pmc->run();
3.4 使用directshow的事件響應機制
directshow的事件響應機制是過濾器圖表管理器與使用者進行互動的介面,directshow處理的可以是一些事先可以預期的事件,比如資料流的結束;也可以是一些無法預期的錯誤。有的事件可以由過濾器圖表管理器自己處理,但如果過濾器圖表管理器自己無法處理這些事件,它就把事件的通知放在事件佇列裡。使用者程式就可以通過imediaeventex介面得到事件,並對它做出相應的處理。
3.5 清除directshow
在程式結束時必須呼叫release函式釋放directshow的介面指標,並呼叫couninitialize函式來解除安裝com庫,釋放所有的動態鏈結庫和資源。
4 結束語
DirectShow元件原理分析及應用
的形式存在,它是建立在二進位制規範上的物件。com定義並實現了軟部件 如應用程式 資料物件 控制項及服務 機制,並把他們統稱為 物件 每個軟部件物件由資料以及訪問資料的函式組成,訪問軟部件物件資料的函式集合稱為 介面 在應用程式看來com是乙個黑箱,可呼叫com提供的方法但不知道它的具體實現。在使用...
react元件渲染原理
jsx 經過babel編譯成react.createelement的表示式。element在react裡,是組成虛擬dom 樹的節點,用來描述在瀏覽器上看到什麼。它的引數有三個 1 type 標籤 2 attributes 標籤屬性,沒有的話,可以為null 3 children 標籤的子節點 e....
函式式元件原理
前一篇文章分析了函式式元件用法 這篇文章從原始碼的角度看看函式式元件,看看它怎麼是無狀態的,以及怎麼沒有例項的。我們就用之前文章的例子來進行分析。要渲染的元件如下 list view comp 就是函式式元件 在options裡面定義了functional屬性為true id和list data是傳...