2011-07-22 47 views
0

我试图寻找到可能通过过滤器属性页来控制的参数有一个暴露的getter/setter,这样的例子,无需加载属性页中,过滤器属性可以由生成图形的父程序改变。揭露一个DirectShow Filter属性例如编程与过滤器源代码

从窗口sdk Ezrgb24有一个工作属性页,但我没有看到如何公开属性页中使用的功能,以便我的程序可以直接访问它们,而无需initalizing属性页本身。我浏览了微软Directshow编程书,看到它通过YUVGray示例过滤器,并提到所使用的颜色可能会暴露,以便图的父程序可以更改它们,但没有举例说明。

同时,从directshow.net样品,像在Windows SDK样本,似乎仅包括过滤器或仅节目源,以及我没有看到具有这种性质直接暴露任何示例过滤器。但是像BitmapMixer这样的例子调用了VMR9的接口IVMRMixerBitmap9.SetAlphaBitmap。我想要一个示例,它提供了一个类似接口和过滤器的代码,以便我可以看到它们是如何相关的,以及该程序,以便我可以看到如何设置我的环境以利用该接口。

我猜这是在利用COM一个基本的运动,但我真的想与所有源的完整的例子,所以我可以完全理解的一切是如何连接。即使暴露的财产被轻易使用,它也足以让一个骨架继续前行。我错过了一个这样的例子吗?我是用C#编写的程序,但一直在使用directshow.net,并且可以设置并运行任何图形,所以一个C++程序就可以。

回答

2

好吧,我们开始吧:

我们将使用出来,与Windows SDK的船,因为它是免费和开源的样品的ezrgb24过滤器的例子。它也已经定义了这方面的接口。请参阅接口的iez.h文件,具体来说,我们将从该文件中注意到两件事情:

1)我们的GUID是fd5010a3-8ebe-11ce-8183-00aa00577da1 - 我们需要该代码2)我们公开了在ezrgb24.cpp文件中定义的get_IPEffect和put_IPEffect函数

因此,我们已经完成了这方面的所有工作,它为我们提供了一个好主意使我们自己的功能暴露。

在我们的C#程序

现在,我们要做出适应这种接口:

using System; 
using System.Runtime.InteropServices; 

... 

[ComImport, 
    System.Security.SuppressUnmanagedCodeSecurity, 
    Guid("fd5010a3-8ebe-11ce-8183-00aa00577da1"), 
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface IIPEffect 
{ 
    [PreserveSig] 
    void get_IPEffect([Out] out int effectNum, [Out] out double StartTime, [Out] out double Length); 

    [PreserveSig] 
    void put_IPEffect([In] int effectNum, [In] double StartTime, [In] double Length); 
} 

注意的GUID是相同的,我们暴露的功能匹配什么是过滤器的代码中定义(你可以在C++函数请求一个指针时使用[Out],在这种情况下请记住,ezrgb24中的REFTIME只是double类的另一个名称)。

这是所有你需要开始使用的接口。

例如,假设我用directshow.net创建了一个图形并制作了ezrgb24过滤器的实例(快速且肮脏 - 在用regsvr32.exe注册我编译过的ezrgb24的dll后,我只是在GraphEdit中查找了绰号,以这种方式添加它)。我打电话给我在图IEfilter中使用的ezrgb24过滤器的实例。

我把它添加到我的图形和连接引脚如常。 那么我可以用我定义为接口类遵循在任何时候改变滤波器的性能,而无需重新启动图形或调出属性页:

IIPEffect myIIPEffect = IEfilter as IIPEffect; 
int myInt; 
double myDouble1, myDouble2; 
if (myIIPEffect != null) //the cast will break if you didn't use the right GUID in your interface 
{ 
    myIIPEffect.put_IPEffect(1002, 6, 7); //for this filter, look at resource.h for what the int should be, in this case 1002 is the emboss effect 
    myIIPEffect.get_IPEffect(out myInt, out myDouble1, out myDouble2); 
} 

就是这样。我希望这可以帮助任何人寻找暴露和访问过滤器属性的完整画面!