Declarando informações de filtro

[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

A primeira etapa é declarar as informações do filtro, se necessário. O DirectShow define as seguintes estruturas para descrever filtros, pinos e tipos de mídia:

Estrutura Descrição
AMOVIESETUP_FILTER Descreve um filtro.
AMOVIESETUP_PIN Descreve um pino.
AMOVIESETUP_MEDIATYPE Descreve um tipo de mídia.

 

Essas estruturas estão aninhadas. A estrutura AMOVEIESETUP_FILTER tem um ponteiro para uma matriz de estruturas AMOVIESETUP_PIN e cada uma delas tem um ponteiro para uma matriz de estruturas AMOVEIESETUP_MEDIATYPE . Juntas, essas estruturas fornecem informações suficientes para a interface IFilterMapper2 localizar um filtro. Eles não são uma descrição completa de um filtro. Por exemplo, se o filtro criar várias instâncias do mesmo pino, você deverá declarar apenas uma estrutura AMOVIESETUP_PIN para esse pino. Além disso, um filtro não é necessário para dar suporte a cada combinação de tipos de mídia que ele registra; nem é necessário registrar todos os tipos de mídia compatíveis.

Declare as estruturas de configuração como variáveis globais em sua DLL. O exemplo a seguir mostra um filtro com um pino de saída:

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

O nome do filtro é declarado como uma variável global estática, pois ele será usado novamente em outro lugar.

Como registrar filtros do DirectShow