Auflisten von Medientypen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Pins unterstützen die IPin::EnumMediaTypes-Methode , die die bevorzugten Medientypen einer Pin aufzählt. Es wird ein Zeiger auf die IEnumMediaTypes-Schnittstelle zurückgegeben. Die IEnumMediaTypes::Next-Methode ruft Zeiger auf AM_MEDIA_TYPE Strukturen ab, die Medientypen beschreiben.

Der Medientyp-Enumerator ist in erster Linie vorhanden, um dem Filter Graph Manager dabei zu helfen, intelligente Verbindungen herzustellen, und Ihre Anwendungen verwenden ihn wahrscheinlich nicht. Ein Pin gibt nicht unbedingt bevorzugte Medientypen zurück. Darüber hinaus können die zurückgegebenen Medientypen von der Verbindung status des Filters abhängen. Beispielsweise kann der Ausgabepin eines Filters einen anderen Satz von Medientypen zurückgeben, je nachdem, welcher Medientyp für den Eingabenadel des Filters festgelegt wurde.

Im folgenden Beispiel wird ein bevorzugter Medientyp gesucht, der mit einem angegebenen Haupttyp, Untertyp oder Formattyp übereinstimmt.

// Given a pin, find a preferred media type 
//
// pPin         Pointer to the pin.
// majorType    Preferred major type (GUID_NULL = don't care).
// subType      Preferred subtype (GUID_NULL = don't care).
// formatType   Preferred format type (GUID_NULL = don't care).
// ppmt         Receives a pointer to the media type. Can be NULL.
//
// Note: If you want to check whether a pin supports a desired media type,
//       but do not need the format details, set ppmt to NULL.
//
//       If ppmt is not NULL and the method succeeds, the caller must
//       delete the media type, including the format block. 

HRESULT GetPinMediaType(
    IPin *pPin,             // pointer to the pin
    REFGUID majorType,      // desired major type, or GUID_NULL = don't care
    REFGUID subType,        // desired subtype, or GUID_NULL = don't care
    REFGUID formatType,     // desired format type, of GUID_NULL = don't care
    AM_MEDIA_TYPE **ppmt    // Receives a pointer to the media type. (Can be NULL)
    )
{
    *ppmt = NULL;

    IEnumMediaTypes *pEnum = NULL;
    AM_MEDIA_TYPE *pmt = NULL;
    BOOL bFound = FALSE;
    
    HRESULT hr = pPin->EnumMediaTypes(&pEnum);
    if (FAILED(hr))
    {
        return hr;
    }

    while (hr = pEnum->Next(1, &pmt, NULL), hr == S_OK)
    {
        if ((majorType == GUID_NULL) || (majorType == pmt->majortype))
        {
            if ((subType == GUID_NULL) || (subType == pmt->subtype))
            {
                if ((formatType == GUID_NULL) || 
                    (formatType == pmt->formattype))
                {
                    // Found a match. 
                    if (ppmt)
                    {
                        *ppmt = pmt;  // Return it to the caller
                    }
                    else
                    {
                        _DeleteMediaType(pmt);
                    }
                    bFound = TRUE;
                    break;
                }
            }
        }
        _DeleteMediaType(pmt);
    }

    SafeRelease(&pEnum);
    if (SUCCEEDED(hr))
    {
        if (!bFound)
        {
            hr = VFW_E_NOT_FOUND;
        }
    }
    return hr;
}

Hinweis

In diesem Beispiel wird die SafeRelease-Funktion verwendet, um Schnittstellenzeiger freizugeben.

 

Auflisten von Objekten in einem Filtergraphen

IEnumMediaTypes