Aushandlung von Medientypen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Wenn der Filter Graph Manager die IPin::Connect-Methode aufruft, gibt es mehrere Optionen zum Angeben eines Medientyps:

  • Vollständiger Typ: Wenn der Medientyp vollständig angegeben ist, versuchen die Pins, eine Verbindung mit diesem Typ herzustellen. Wenn dies nicht möglich ist, schlägt der Verbindungsversuch fehl.
  • Teilmedientyp: Ein Medientyp ist teilweise , wenn der Haupttyp, Untertyp oder Formattyp GUID_NULL ist. Der Wert GUID_NULL fungiert als "Feldhalter", der angibt, dass jeder Wert akzeptabel ist. Die Pins verhandeln einen Typ, der mit dem Teiltyp konsistent ist.
  • Kein Medientyp: Wenn der Filter Graph Manager einen NULL-Zeiger übergibt, können die Pins jedem Medientyp zustimmen, der für beide Pins akzeptabel ist.

Wenn die Pins eine Verbindung herstellen, hat die Verbindung immer einen vollständigen Medientyp. Der Zweck des vom Filter Graph-Manager angegebenen Medientyps besteht darin, die möglichen Verbindungstypen einzuschränken.

Während des Aushandlungsprozesses schlägt der Ausgabenadel einen Medientyp vor, indem die IPin::ReceiveConnection-Methode des Eingabenadels aufgerufen wird. Der Eingabenadel kann den vorgeschlagenen Typ annehmen oder ablehnen. Dieser Vorgang wird wiederholt, bis entweder der Eingabenadel einen Typ akzeptiert oder der Ausgabepin keine Typen mehr aufweist und die Verbindung fehlschlägt.

Wie ein Ausgabenadel medientypen auswählt, die vorgeschlagen werden sollen, hängt von der Implementierung ab. In den DirectShow-Basisklassen ruft der Ausgabepin IPin::EnumMediaTypes auf dem Eingabenadel auf. Diese Methode gibt einen Enumerator zurück, der die bevorzugten Medientypen des Eingabenadels aufzählt. Andernfalls listet der Ausgabenadel seine eigenen bevorzugten Typen auf.

Arbeiten mit Medientypen

Überprüfen Sie in jeder Funktion, die einen AM_MEDIA_TYPE-Parameter empfängt, immer die Werte von cbFormat und formattype , bevor Sie das pbFormat-Element deferencieren. Der folgende Code ist falsch:

if (pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Wrong!
}

Der folgende Code ist richtig:

if ((pmt->formattype == FORMAT_VideoInfo) && 
    (pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
    (pbFormat != NULL))
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can dereference pVIH.
}