天天看點

如何給filter添加自定義接口及調用

本例子是在virtualcamera的基礎上添加的自定義接口用來實作exe控制osd的顯示。

1. 接口部分

#ifndef __h_myfilter__ #define __h_myfilter__ #ifdef __cplusplus extern "c" { #endif //#include <initguid.h> //extern_guid extern_guid(iid_imyfilter,   0xef31f705, 0x32a7, 0x477a, 0x90, 0xc9, 0x2c, 0x7e, 0x81, 0xeb, 0x2, 0x5d); declare_interface_(imyfilter,iunknown) { stdmethod(setosd) (this_ int osd_en) pure; }; } #endif  

2.filter繼承接口

#include "myfilter.h"

class cvcam : public csource ,public imyfilter

public:

    static cunknown * winapi createinstance(lpunknown lpunk, hresult *phr); 

stdmethodimp nondelegatingqueryinterface(refiid riid, void **ppv);//????

declare_iunknown;

stdmethodimp  setosd(int osd_en);

    ifiltergraph *getgraph() {return m_pgraph;}

    int osd_enable;

private:

    cvcam(lpunknown lpunk, hresult *phr);

cvcampin *m_ppin;

/////////////////////////////////////

stdmethodimp  cvcam::setosd(int osd_en)

osd_enable = osd_en;

return s_ok;

stdmethodimp cvcam::nondelegatingqueryinterface(refiid riid, void **ppv)

if(riid == _uuidof(iamstreamconfig) || riid == _uuidof(ikspropertyset))

// m_pastreams[0]->queryinterface(riid, ppv);

return m_pastreams[0]->queryinterface(riid, ppv);

else if (riid == iid_imyfilter)

return getinterface((imyfilter *) this, ppv);

else

return cbasefilter::nondelegatingqueryinterface(riid, ppv);//修改

3.應用程式調用

        //根據guid 查找filter

 hr = cocreateinstance(clsid_myfilter, 0, clsctx_inproc_server, iid_ibasefilter, reinterpret_cast<void**>(&psrcfilter));  

         imyfilter *pinterface = null; 

         hr = psrcfilter->queryinterface(iid_imyfilter, (void **)&pinterface);//從filter上查詢接口

        pinterface->setosd(0);//使用接口函數

如何給filter添加自定義接口及調用

繼續閱讀