Экспонировать пример свойства фильтра directshow с программным И фильтром исходного кода - PullRequest
0 голосов
/ 23 июля 2011

Я пытаюсь найти пример, в котором параметр, которым можно управлять через страницу свойств фильтра, имеет открытый метод получения / установки, так что без загрузки страницы свойств свойство фильтра может быть изменено родительской программой, которая сгенерировалаграфик.

Ezrgb24 из Windows SDK имеет рабочую страницу свойств, но я не вижу, как выставить функции, используемые на странице свойств, чтобы моя программа могла получить к ним доступ напрямую, без инициализации самой страницы свойств.,Я просмотрел книгу «Программирование Microsoft Directshow» и увидел, что она проходит через пример фильтра YUVGray и упоминает, что используемые цвета могут быть выставлены так, чтобы родительская программа графика могла их изменить, но не дает пример того, как.

Между тем, сэмплы из directshow.net, например сэмплы windows sdk, содержат только фильтр или только исходный код программы, и я не видел ни одного примера фильтра, который бы имел такие свойства напрямую.Но примеры, такие как BitmapMixer, вызывают IVMRMixerBitmap9.SetAlphaBitmap, интерфейс для VMR9.Мне нужен пример, который дает мне код для аналогичного интерфейса и фильтр, чтобы я мог видеть, как они связаны, и программу, чтобы я мог видеть, как должна быть настроена моя среда для использования интерфейса.

Полагаю, это базовое упражнение по использованию COM, но я действительно хотел бы получить полный пример со всеми источниками, чтобы я мог полностью понять, как все связано.Даже если открытое свойство используется тривиально, скелета будет достаточно, чтобы продолжить.Есть ли где-то такой пример, который я пропустил?Я нахожусь в C # для программы, но использую directshow.net и могу настроить и запустить любой граф, так что программа на C ++ подойдет.

1 Ответ

2 голосов
/ 02 августа 2011

Хорошо, мы идем:

Мы будем использовать пример фильтра ezrgb24, который получается из примеров, которые поставляются с Windows SDK, потому что он бесплатный и с открытым исходным кодом. Он также уже определил интерфейс на этой стороне. См. Файл iez.h для интерфейса, в частности отметим две вещи из этого файла:

1) Наш GUID - fd5010a3-8ebe-11ce-8183-00aa00577da1 - он нам понадобится для кода на стороне C # 2) мы представляем функции get_IPEffect и put_IPEffect, которые определены в файле ezrgb24.cpp

Таким образом, вся работа на этой стороне уже проделана для нас, и это дает нам хорошее представление о том, как сделать наши собственные функции доступными.

Теперь в нашей программе на 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 - то же самое, и наши открытые функции соответствуют тому, что определено в коде фильтра (вы можете просто использовать [Out], когда функция C ++ запрашивает указатель, в этом конкретном случае помните, что REFTIME в ezrgb24 просто другое название для двойного класса).

Это все, что вам нужно, чтобы начать использовать интерфейс.

Например, скажем, я создаю граф с directshow.net и создаю экземпляр фильтра ezrgb24 (быстро и грязно - после регистрации моей скомпилированной dll из ezrgb24 с помощью regsvr32.exe, я просто посмотрел моникер в GraphEdit и добавил это так). Я назвал экземпляр фильтра ezrgb24, который использовал в своем графике IEfilter.

Я добавляю его на свой график и подключаю контакты как обычно. Затем я могу использовать интерфейсный класс, который я определил следующим образом, в любой момент, чтобы изменить свойства фильтра, без необходимости перезапускать график или вызывать страницу свойств:

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);
}

И это все. Я надеюсь, что это поможет любому, кто ищет полную картину раскрытия и доступа к свойствам фильтра!

...