使用程序AND过滤器源代码公开directshow过滤器属性示例

时间:2011-07-22 21:21:42

标签: com directshow

我正在尝试找到一个示例,其中可以通过filter属性页面控制的参数具有公开的getter / setter,这样在不加载属性页的情况下,filter属性可以由生成的父程序更改图表。

来自windows sdk的Ezrgb24有一个工作属性页面,但我没有看到如何公开属性页面中使用的函数,以便我的程序可以直接访问它们而不会使属性页本身无法使用。我查看了编程Microsoft Directshow书,看到它通过YUVGray示例过滤器,并提到可以公开使用的颜色,以便图表的父程序可以更改它们,但不提供示例如何。

同时,来自directshow.net的示例,如windows sdk示例,似乎只包含过滤器或仅包含程序源,我没有看到任何直接暴露此类属性的示例过滤器。但是像BitmapMixer这样的例子调用了IVMRMixerBitmap9.SetAlphaBitmap,它是VMR9的一个接口。我想要一个示例,它为我提供类似接口和过滤器的代码,以便我可以看到它们是如何相关的,以及程序,这样我就可以看到我的环境应该如何设置以利用接口。

我猜这是使用COM的一个基本练习,但我真的想要一个包含所有源代码的完整示例,这样我就可以完全理解所有内容是如何连接的。即使暴露的属性被轻易使用,也可以继续使用骨架。我错过了某个地方的例子吗?我在程序中使用C#但是一直在使用directshow.net并且可以设置并运行任何图形,所以C ++程序就可以了。

1 个答案:

答案 0 :(得分:2)

好的,我们走了:

我们将使用ezrgb24过滤器示例,该示例来自windows sdk附带的示例,因为它是免费和开源的。它也已经定义了这一侧的接口。请参阅iez.h文件中的接口,具体我们将从该文件中注意两件事:

1)我们的GUID是fd5010a3-8ebe-11ce-8183-00aa00577da1 - 对于C#端的代码我们需要它 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只是双重类的另一个名称。)

这就是您开始使用界面所需的一切。

例如,假设我使用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);
}

就是这样。我希望这有助于任何人寻找曝光和访问过滤器属性的完整画面!