Поделиться через


Объявление сведений о фильтре

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Первым шагом является объявление сведений о фильтре, если это необходимо. DirectShow определяет следующие структуры для описания фильтров, контактов и типов мультимедиа:

Структура Описание
AMOVIESETUP_FILTER Описывает фильтр.
AMOVIESETUP_PIN Описывает закрепление.
AMOVIESETUP_MEDIATYPE Описывает тип носителя.

 

Эти структуры являются вложенными. Структура AMOVEIESETUP_FILTER имеет указатель на массив AMOVIESETUP_PIN структур, и каждая из них имеет указатель на массив AMOVEIESETUP_MEDIATYPE структур. В совокупности эти структуры предоставляют достаточно информации для поиска фильтра интерфейсом IFilterMapper2 . Они не являются полным описанием фильтра. Например, если фильтр создает несколько экземпляров одного контакта, следует объявить только одну структуру AMOVIESETUP_PIN для этого контакта. Кроме того, фильтр не требуется для поддержки каждой комбинации типов носителей, которые он регистрирует; не требуется регистрировать все поддерживаемые типы носителей.

Объявите структуры настройки как глобальные переменные в библиотеке DLL. В следующем примере показан фильтр с одним выходным закреплением:

static const WCHAR g_wszName[] = L"Some Filter";

AMOVIESETUP_MEDIATYPE sudMediaTypes[] = {
    { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB24 },
    { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB32 },
};

AMOVIESETUP_PIN sudOutputPin = {
    L"",            // Obsolete, not used.
    FALSE,          // Is this pin rendered?
    TRUE,           // Is it an output pin?
    FALSE,          // Can the filter create zero instances?
    FALSE,          // Does the filter create multiple instances?
    &GUID_NULL,     // Obsolete.
    NULL,           // Obsolete.
    2,              // Number of media types.
    sudMediaTypes   // Pointer to media types.
};

AMOVIESETUP_FILTER sudFilterReg = {
    &CLSID_SomeFilter,      // Filter CLSID.
    g_wszName,              // Filter name.
    MERIT_NORMAL,           // Merit.
    1,                      // Number of pin types.
    &sudOutputPin           // Pointer to pin information.
};

Имя фильтра объявляется как статическая глобальная переменная, так как оно будет использоваться в другом месте.

Регистрация фильтров DirectShow