Dichiarazione delle informazioni sul filtro

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il primo passaggio consiste nel dichiarare le informazioni sul filtro, se necessario. DirectShow definisce le strutture seguenti per descrivere filtri, pin e tipi di supporti:

Struttura Descrizione
AMOVIESETUP_FILTER Descrive un filtro.
AMOVIESETUP_PIN Descrive un pin.
AMOVIESETUP_MEDIATYPE Descrive un tipo di supporto.

 

Queste strutture sono annidate. La struttura AMOVEIESETUP_FILTER ha un puntatore a una matrice di strutture AMOVIESETUP_PIN e ognuna di queste ha un puntatore a una matrice di struttureAMOVEIESETUP_MEDIATYPE. Queste strutture forniscono informazioni sufficienti per l'interfaccia IFilterMapper2 per individuare un filtro. Non sono una descrizione completa di un filtro. Ad esempio, se il filtro crea più istanze dello stesso pin, è necessario dichiarare una sola AMOVIESETUP_PIN struttura per tale pin. Inoltre, un filtro non è necessario per supportare ogni combinazione di tipi di supporti registrati; né è necessario registrare ogni tipo di supporto supportato.

Dichiarare le strutture di configurazione come variabili globali all'interno della DLL. Nell'esempio seguente viene illustrato un filtro con un pin di output:

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

Il nome del filtro viene dichiarato come variabile globale statica, perché verrà usato di nuovo altrove.

Come registrare filtri DirectShow