注册DirectShow Filter信息 转帖

注册DirectShow Filter信息 收藏

编写自己的 DirectShow Filter ,除了编写实现功能的代码之外,要使自己的 DLL 称为一个 Filter ,还有一个重要的工作需要做,那就是注册信息。 DirectShow Filter 有两种信息注册,一种是包含 Filter DLL 作为 COM 组件的注册信息,一种是注册 Filter 种类信息。

当应用程序通过 CoCreateInstane 创建 Filter 的时候,通过第一中注册信息定位 DLL

第二种信息注册后,可以通过系统 设备枚举器和 Filter Mapped 定位到 Filter ,这种信息不是必须注册,当不注册时候, Filter 被默认为 CLSID_LegacyAmFilterCategory 类型。

注册 Filter 种类信息分一下步骤:

一、声明 Filter 信息

  1. AMOVIESETUP_MEDIATYPE、 AMOVIESETUP_PIN、AMOVIESETUP_FILTER  
  2. 1.AMOVIESETUP_MEDIATYPE  
  3. typedef   struct   
  4. {  
  5.     const  CLSID *clsMajorType; //主媒体类型   
  6.     const  CLSID *clsMinorType; //子媒体类型,可以使用MEDIASUBTYPE_NULL   
  7. } REGPINTYPES;  
  8. typedef  REGPINTYPES AMOVIESETUP_MEDIATYPE,   
  9.     * PAMOVIESETUP_MEDIATYPE,   
  10. * LPAMOVIESETUP_MEDIATYPE;  
  11.   
  12. 2.AMOVIESETUP_PIN  
  13. typedef   struct  {  
  14.     LPWSTR             strName; //已经废弃,可以填充Output或者是Input,表示pin的类型   
  15.     BOOL               bRendered; //TRUE表示这是Render的Input Pin,其他的都使用FALSE   
  16.     BOOL               bOutput; //TRUE表示这是output Pin。   
  17.     BOOL               bZero; //TRUE表示Filter可以包含0个这个pin的实例。   
  18.     BOOL               bMany; //TRUE表示Filter可以包含两个或以上的这个pin的实例。   
  19.     const  CLSID       *clsConnectsToFilter; //已经废弃,填充CLSID_NULL   
  20.     const   WCHAR        *strConnectsToPin; //已经废弃,填充NULL   
  21.     UINT               nMediaTypes; //pin能支持多少中媒体类型   
  22.     const  REGPINTYPES *lpMediaType; // AMOVIESETUP_MEDIATYPE对象,描述媒体类型   
  23. } REGFILTERPINS;  
  24. typedef  REGFILTERPINS AMOVIESETUP_PIN,   
  25.     * PAMOVIESETUP_PIN,   
  26.     * LPAMOVIESETUP_PIN;  
  27.   
  28. 3.AMOVIESETUP_FILTER  
  29. typedef   struct  _AMOVIESETUP_FILTER {  
  30.     const  CLSID           *clsID; //Filter的CLASSID   
  31.     const   WCHAR          *strName; //Filter的名字   
  32.     DWORD                dwMerit; //   
  33.     UINT                   nPins; //lpPin中AMOVIESETUP_PIN对象的个数   
  34.     const  AMOVIESETUP_PIN *lpPin; // AMOVIESETUP_PIN对象指针   
  35. } AMOVIESETUP_FILTER, * PAMOVIESETUP_FILTER, * FAR LPAMOVIESETUP_FILTER;  

 

二、声明类工厂

  1. CFactoryTemplate g_Templates[] = {  
  2.         { L"MyFilter" //Filter名字   
  3.         , &CLSID_MyFilter//Filter 的CLASSID   
  4.         , CMySourceFilter::CreateInstance//Filter的实例化接口   
  5.         , NULL  
  6.         , &sudBallax }// AMOVIESETUP_FILTER对象   
  7.     };  
  8. int  g_cTemplates =  sizeof (g_Templates) /  sizeof (g_Templates[0]);  

 

三、重载 DllRegisterServer

  1. REGFILTER2 rf2FilterReg = {  
  2.     1,              // Pin使用 AMOVIESETUP_PIN,所以版本为1   
  3.     MERIT_NORMAL,   // Merit.   
  4.     1,              // Number of pins.   
  5.     &sudPins        // Pointer to pin information.   
  6. };  
  7.   
  8. STDAPI DllRegisterServer(void )  
  9. {  
  10.     HRESULT  hr;  
  11.     IFilterMapper2 *pFM2 = NULL;  
  12.   
  13.     //此处注册DLL信息    
  14.     hr = AMovieDllRegisterServer2(TRUE);  
  15.     if  (FAILED(hr))  
  16.         return  hr;  
  17.   
  18.     //以下注册Filter信息   
  19.     hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,  
  20.             IID_IFilterMapper2, (void  **)&pFM2);  
  21.   
  22.     if  (FAILED(hr))  
  23.         return  hr;  
  24.   
  25.     hr = pFM2->RegisterFilter(  
  26.         CLSID_SomeFilter,                // Filter CLSID.    
  27.         g_wszName,                       // Filter name.   
  28.         NULL,                            // Device moniker.    
  29.         &CLSID_VideoCompressorCategory,  // Video compressor category.   
  30.         g_wszName,                       // Instance data.   
  31.         &rf2FilterReg                    // Pointer to filter information.   
  32.     );  
  33.     pFM2->Release();  
  34.     return  hr;  
  35. }  

 

 

 

四、注销 Filter 的函数

  1. STDAPI DllUnregisterServer()  
  2. {  
  3.     HRESULT  hr;  
  4.     IFilterMapper2 *pFM2 = NULL;  
  5.   
  6.     hr = AMovieDllRegisterServer2(FALSE);  
  7.     if  (FAILED(hr))  
  8.         return  hr;  
  9.    
  10.     hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,  
  11.             IID_IFilterMapper2, (void  **)&pFM2);  
  12.   
  13.     if  (FAILED(hr))  
  14.         return  hr;  
  15.   
  16.     hr = pFM2->UnregisterFilter(&CLSID_VideoCompressorCategory,   
  17.             g_wszName, CLSID_SomeFilter);  
  18.   
  19.     pFM2->Release();  
  20.     return  hr;  
  21. }  

 

IFilterMapper2 RegisterFilter 接口注册 Filter 信息,接口的第四个参数决定 Filter 属于什么种类,如果使用 CLSID_VideoCompressorCategory ,在 GraphEdit 中看到的 Filter 就在 Video Capture Source 中。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值