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.