如何注册Filter

AX文件的一个对外接口DllRegisterServer,由外部调用,比如注册AX的时候:regsvr32 xxx.ax

       通常情况下,我们的filter可能注册在”Direct Show”目录下,那么直接调用
       // Creates registry entries for the DLL
STDAPIDllRegisterServer()
{
return AMovieDllRegisterServer2(TRUE);
}

AMovieDllRegisterServer2在DX的帮助文档内的说明如下:
The AMovieDllRegisterServer2 函数为g_Templates 数组中的每个组件创建注册入口. 然而这个函数有一些限制,

首先,它给每个filter分配“DirectShow Filters”分类(CLSID_LegacyAmFilterCategory), 但是不是每个filter都属于这个分类. 比如Capture filters and compression filters,有他们自己的分类.

第二,如果你的fitler支持一个硬件设备,你可能需要去注册两个增加AMovieDLLRegisterServer2 没有处理的信息pieces,: the medium and the pin category. A medium defines a method of communication in a hardware device, such as a bus. The pin category defines the function of a pin. For information on mediums, see KSPIN_MEDIUM in the Microsoft Windows Driver Development Kit (DDK). For a list of pin categories, see Pin Property Set.
      
如果我们的引擎需要注册到DirectShow之外的目录,又该如何做?
 // 注册Filter到Video Compressor
REGFILTER2 rf2FilterReg =
{
    1,                                    // Version 1 (no pin mediums or pin category).
    MERIT_NORMAL,       // Merit.
    1,                                   // Number of pins.
    &sudPins                    // Pointer to pin information.
};

//为DLL创建注册入口
STDAPI DllRegisterServer(void)
{
    HRESULT hr = E_FAIL;
    IFilterMapper2 *pFM2 = NULL;

    hr = AMovieDllRegisterServer2(TRUE);                // 这个还是要调用的
    if (FAILED(hr))       return hr;
hr = CoCreateInstance(CLSID_FilterMapper2, NULL,
                                           CLSCTX_INPROC_SERVER,
                                                     IID_IFilterMapper2, (void **)&pFM2);

    if (FAILED(hr))       return hr;

    hr = pFM2->RegisterFilter(CLSID_SomeFilter,                        // Filter CLSID.
                                                    g_wszName,                                   // Filter name.
                                                    NULL,                                               // Device moniker.
                                                   &CLSID_VideoCompressorCategory,           // Video compressor category.
                                                   g_wszName,                                   // Instance data.
                                                   &rf2FilterReg                                    // Pointer to filter information.
                                                   );
    pFM2->Release();
    return hr;
}

注销Filter
注销DirectShow内的引擎
// Removes registry entries for the DLL
STDAPI DllUnregisterServer()
{
return AMovieDllRegisterServer2(FALSE);
}

       注销指定目录下的引擎
       // 注销Video Compressor下的引擎
       // Removes registry entries for the DLL
STDAPI DllUnregisterServer()
{
    HRESULT hr = E_FAIL;
    IFilterMapper2* pFM2 = NULL;

    hr = AMovieDllRegisterServer2(FALSE);
    if (FAILED(hr))       return hr;

   hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
                                IID_IFilterMapper2, (void **)&pFM2);
    if (FAILED(hr))       return hr;

    hr = pFM2->UnregisterFilter(&CLSID_VideoCompressorCategory,
                                             g_wszName, CLSID_SomeFilter);

    pFM2->Release();
    return hr;
}

给Filter起个名字
// Pin的type分为Major Type 和 Subtype
// 比如,Major Type = Video, Subtype = MPEG-2
const AMOVIESETUP_MEDIATYPE sudPinTypes =
{
&MEDIATYPE_NULL,            // Major type
&MEDIASUBTYPE_NULL           // Subtype
};

const AMOVIESETUP_PIN psudPins[] =
{
       // 定义Input Pin的信息
{
L"Input",                 // String pin name
FALSE,             // Is it rendered
FALSE,             // Is it an output
FALSE,             // Allowed none
FALSE,             // Allowed many
&CLSID_NULL,        // Connects to filter
0           // Connects to pin
1,                  // Number of types
&sudPinTypes
},     // The pin details
{
L"Output",          // String pin name
FALSE,              // Is it rendered
TRUE,               // Is it an output
FALSE,              // Allowed none
FALSE,              // Allowed many
&CLSID_NULL,        // Connects to filter
0,          // Connects to pin
1,                  // Number of types
&sudPinTypes        // The pin details
       }
};

// Declare filter information
const AMOVIESETUP_FILTER sudFilter =
{
&CLSID_MPKiller,       // Filter CLSID
L"HQ MP Killer",        // Filter name
0x8800000,                    // Its merit
2,                      // Number of pins
psudPins                      // Pin details
};

// declare a global array of CFactoryTemplate class instances, named g_Templates. Each
// CFactoryTemplate class contains registry information for one filter. Several filters can
// reside in a single DLL; simply include additional CFactoryTemplate entries. You can
// also declare other COM objects, such as property pages
// 在同一个DLL或者AX内,可以有多个引擎,比如系统目录下的quartz.dll。
// 所以,如果有多个引擎,相应的数组的大小就是引擎的个数。
CFactoryTemplateg_Templates[] =
{
{
L"HQ MP Killer",
&CLSID_MPKiller,
CImplement::CreateInstance,
NULL,
&sudFilter
}
};

int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);       // 有几个引擎

允许Filter应用
// CreateInstance 是CFactory的一个接口,在Filter内部实现它
CUnknown* WINAPI CImplement::CreateInstance(    LPUNKNOWN pUnk,
                                                                                    HRESULT *pHr)
{
    CImplement *pFilter = new CImplement ();
    if (!pFilter)
    {
        *pHr = E_OUTOFMEMORY;
    }
    return pFilter;
}

Filter的Merit
Graph 会使用“傻子”机制联接不同的filter,这就要通过filter的merit值的高低进行“傻子”联接。

该联接要使用IFilterMapper2::EnumMatchingFilters方法。
Merit:
enum
{
    MERIT_PREFERRED     = 0x800000,
    MERIT_NORMAL        = 0x600000,
    MERIT_UNLIKELY      = 0x400000,
    MERIT_DO_NOT_USE    = 0x200000,
    MERIT_SW_COMPRESSOR = 0x100000,
    MERIT_HW_COMPRESSOR = 0x100050
};
<= MERIT_DO_NOT_USE的Merit的Filter,系统是不会去“傻子”联接的。当然Merit值可以是任意值,而不一定是枚举出来的。

确定Filter的用途
不同的Filter有不同的用途,可以选择不同的基类,实现不同的方法。详见DirectX 文档。Filter的种类,在内进行了详细的描述root\DirectShow\DirectShow Reference\Constants and GUIDs\Filter Categories。

添加属性页
CFactoryTemplateg_Templates[2] =
{
    {
              g_wszArcIPCam,                       // Name
              &CLSID_ArcIPCam,                  // CLSID
              CArcIPCam::CreateInstance, // Method to create an instance of MyComponent
              NULL,                                     // Initialization function
              &sudArcIPCamSourceFilter      // Set-up information (for filters)
    },

       {
                     // 这些数据,为属性页准备
              g_wszArcIPCamProperty,
              &CLSID_ArcIPCamProperty,
              CArcIPCamProperty::CreateInstance
       }
};
     
class CArcIPCam : public xxx, public IArcIPCam, public ISpecifyPropertyPages
{
private:
    // Constructor is private because you have to use CreateInstance
    CArcIPCam(IUnknown *pUnk, HRESULT *phr);
    ~CArcIPCam();

    CArcIPCamPin *m_pPin;

public:
    static CUnknown * WINAPI CreateInstance(IUnknown *pUnk, HRESULT *phr);
    DECLARE_IUNKNOWN;

           // Property Page---
           STDMETHODIMP GetClassID(CLSID *pClsid);
    // Basic COM - used here to reveal our property interface.
    STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
    // return our property pages
    STDMETHODIMP GetPages(CAUUID * pPages);
}
       这三个函数必须实现。

时间: 2024-09-15 09:25:32

如何注册Filter的相关文章

利用 DirectShow 开发自己的 Filter

学习directshow已经有几天了,下面将自己的学习心得写下来,希望对其他的人有帮助. Filter实质是个COM组件,所以学习开发Filter之前你应该对com的知识有点了解.Com组件的实质是一个实现了纯虚指针接口的C++对象. 关于com的东西,这里不多讲. 一.给vc配置DirectShow的开发环境 无论开发Filter还是开发Dshow的应用程序都要配置一下开发环境的,其实就是包含一下dshow用到的头文件和动态库. 选择Tools菜单下面的Options.在弹出的Option对话

深入Jetty源码之Servlet框架及实现(Servlet、Filter、Registration)

概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层抽象隔离了HTTP服务器的实现细节,而Servlet规范定义了各个类的行为,从而保证了这些"服务器端运行的小程序"对服务器实现的无关性(即提升了其可移植性).在Servlet规范有以下几个核心类(接口):ServletContext:定义了一些可以和Servlet Container交互的

视频监控-开发filter(基于directshow)后,如何在别的机器上使用呢

问题描述 开发filter(基于directshow)后,如何在别的机器上使用呢 开发filter(基于directshow)后,在我做调试的电脑上安装了win7的sdk包,然后配置了directshow的开发环境,然后自己编写了一个filter实现一些功能,调试后可以使用! 现在的问题是,如何在别的机器上使用呢!需要安装的电脑上没有安装Windows7的sdk也没有安装vs,就是实现自己开发的监控软件可以使用???求大神们帮助啊 解决方案 就是解决如何在别的机器上注册filter啊?用regs

Java Web Filter 过滤器学习教程(推荐)_java

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过F

directshow filter 调试步骤

1,编写filter2,在debug模式下build3,注册filter:控制台cd到工程的debug目录下,即欲注册的filter(.ax文件)目录,xx:>regsvr32 contrast.ax,提示注册成功,否则请检查4,vs下按F5,出来如下对话框,在可执行文件名称下面选择graphedit.exe的路径 或者直接在工程属性进行设置,如下: 运行之后有如下提示窗口,选"是"即可 5,在graphedit中建立需要的graph:graphedit.exe菜单-graph-

架构师之路-在Dubbo中开发REST风格的远程调用

概述 dubbo支持多种远程调用方式,例如dubbo RPC(二进制序列化 + tcp协议).http invoker(二进制序列化 + http协议,至少在开源版本没发现对文本序列化的支持).hessian(二进制序列化 + http协议).WebServices (文本序列化 + http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化 + http协议)的支持. 有鉴于此,我们基于标准的Java REST API--JAX-RS 2.0(Java API for REST

深入Jetty源码之Servlet框架及实现(ServletContext)

概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层抽象隔离了HTTP服务器的实现细节,而Servlet规范定义了各个类的行为,从而保证了这些"服务器端运行的小程序"对服务器实现的无关性(即提升了其可移植性). 在Servlet规范有以下几个核心类(接口):ServletContext:定义了一些可以和Servlet Container交互

《Spring 5 官方文档》18. Web MVC 框架(五)

自定义WebDataBinder初始化 要通过Spring定制与PropertyEditor的请求参数绑定 WebDataBinder,可以使用@InitBinder控制器中的-annotated @InitBinder方法,@ControllerAdvice类中的方法或提供自定义 WebBindingInitializer.有关更多详细信息,请参阅"使用@ControllerAdvice和@RestControllerAdvice建议控制器"一节. 使用@InitBinder自定义数

shiro 拦截器链

Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com/blogs/subjects/Servlet-3-1了解Filter的工作原理.首先下图是Shiro拦截器的基础类图: 1.NameableFilter NameableFilter给Filter起个名字,如果没有设置默认就是FilterName:还记得之前的如authc吗?当我们组装拦截器链时会根据这个名字找到相应的拦截器实