Uso del filtro mapper

[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.

Filter Mapper è un oggetto COM che enumera i filtri DirectShow in base a vari criteri di ricerca. Il filtro mapper può essere meno efficiente dell'enumeratore dispositivo di sistema, quindi, se sono necessari filtri da una determinata categoria, è consigliabile usare l'enumeratore dispositivo di sistema. Tuttavia, se è necessario individuare un filtro che supporta una determinata combinazione di tipi di supporti, ma non rientra in una categoria clear-cut, potrebbe essere necessario usare il filtro mapper. Un esempio è un filtro del renderer o un filtro decodificatore.

Filter Mapper espone l'interfaccia IFilterMapper2 . Per cercare un filtro, chiamare il metodo IFilterMapper2::EnumMatchingFilters . Questo metodo accetta diversi parametri che definiscono i criteri di ricerca e restituisce un enumeratore per i filtri corrispondenti. L'enumeratore supporta l'interfaccia IEnumMoniker e fornisce un moniker univoco per ogni filtro corrispondente.

L'esempio seguente enumera i filtri che accettano l'input DV (Digital Video) e dispongono di almeno un pin di output, di qualsiasi tipo di supporto. Il filtro DV Video Decoder corrisponde a questi criteri.

IFilterMapper2 *pMapper = NULL;
IEnumMoniker *pEnum = NULL;

hr = CoCreateInstance(CLSID_FilterMapper2, 
    NULL, CLSCTX_INPROC, IID_IFilterMapper2, 
    (void **) &pMapper);

if (FAILED(hr))
{
    // Error handling omitted for clarity.
}

GUID arrayInTypes[2];
arrayInTypes[0] = MEDIATYPE_Video;
arrayInTypes[1] = MEDIASUBTYPE_dvsd;

hr = pMapper->EnumMatchingFilters(
        &pEnum,
        0,                  // Reserved.
        TRUE,               // Use exact match?
        MERIT_DO_NOT_USE+1, // Minimum merit.
        TRUE,               // At least one input pin?
        1,                  // Number of major type/subtype pairs for input.
        arrayInTypes,       // Array of major type/subtype pairs for input.
        NULL,               // Input medium.
        NULL,               // Input pin category.
        FALSE,              // Must be a renderer?
        TRUE,               // At least one output pin?
        0,                  // Number of major type/subtype pairs for output.
        NULL,               // Array of major type/subtype pairs for output.
        NULL,               // Output medium.
        NULL);              // Output pin category.

// Enumerate the monikers.
IMoniker *pMoniker;
ULONG cFetched;
while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
    IPropertyBag *pPropBag = NULL;
    hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
       (void **)&pPropBag);

    if (SUCCEEDED(hr))
    {
        // To retrieve the friendly name of the filter, do the following:
        VARIANT varName;
        VariantInit(&varName);
        hr = pPropBag->Read(L"FriendlyName", &varName, 0);
        if (SUCCEEDED(hr))
        {
            // Display the name in your UI somehow.
        }
        VariantClear(&varName);

        // To create an instance of the filter, do the following:
        IBaseFilter *pFilter;
        hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
        // Now add the filter to the graph. Remember to release pFilter later.
    
        // Clean up.
        pPropBag->Release();
    }
    pMoniker->Release();
}

// Clean up.
pMapper->Release();
pEnum->Release();

Il metodo EnumMatchingFilters ha un numero abbastanza elevato di parametri, che vengono commentati nell'esempio. Quelli significativi per questo esempio includono:

  • Valore minimo di merito: il filtro deve avere un valore di merito sopra MERIT_DO_NOT_USE.
  • Tipi di input: il chiamante passa una matrice contenente coppie di tipi principali e sottotipi. Solo i filtri che supportano almeno una di queste coppie corrisponderanno.
  • Corrispondenza esatta: un filtro può registrare valori NULL per il tipo principale, il sottotipo, la categoria di pin o il supporto. A meno che non si specifica la corrispondenza esatta, un valore NULL funge da carattere jolly, corrispondente a qualsiasi valore specificato. Con corrispondenza esatta, il filtro deve corrispondere esattamente ai criteri. Tuttavia, se si assegna un parametro NULL nei criteri di ricerca, funge sempre da carattere jolly o "non importa", corrispondendo a qualsiasi filtro.

Enumerazione di dispositivi e filtri

Connessione intelligente