Videoformataushandlung im Beispielvideo-DSP-Plug-In

Bevor Windows Media Player ein Video-DSP-Plug-In in die Signalkette einfügt, muss der Player bestimmen, ob das Plug-In das wiedergegebene Video verarbeiten kann. Der Prozess, mit dem das Plug-In und der Player über unterstützte Videoformate kommunizieren, wird als Formataushandlung bezeichnet.

Bereitstellen der unterstützten Eingabe- und Ausgabetypen

Wenn das DSP-Plug-In als DirectX-Medienobjekt (DMO) fungiert, fragt der Player das Plug-In über die unterstützten Formate ab, indem eine Sequenz von Aufrufen an IMediaObject::GetInputType und IMediaObject::GetOutputType erfolgt.

Wenn das DSP-Plug-In als Media Foundation Transform (MFT) fungiert, fragt der Player das Plug-In nach den unterstützten Formaten ab, indem er eine Sequenz von Aufrufen an DIE Aufrufe VONTRANSFORM::GetInputAvailableType und VONTRANSTRANSFORM::GetOutputAvailableType vornimmt.

Das vom Assistenten für Windows Media Player Plug-In generierte Beispielvideo-Plug-In speichert die Liste der unterstützten Videoformate als Array von GUIDs. Der folgende Code stammt aus der CPP-Hauptdatei:

static const GUID*    k_guidValidSubtypes[] = {
    &MEDIASUBTYPE_NV12,
    &MEDIASUBTYPE_YV12,
    &MEDIASUBTYPE_YUY2,
    &MEDIASUBTYPE_UYVY,
    &MEDIASUBTYPE_RGB32,
    &MEDIASUBTYPE_RGB24,
    &MEDIASUBTYPE RGB555,
    &MEDIASUBTYPE RGB565
};

Der Player kann IMediaObject::GetInputType und IMediaObject::GetOutputType in beliebiger Reihenfolge aufrufen, sodass der Plug-In-Code dies voraussehen muss. Auf ähnliche Weise kann der Player ÜBERTRANSFORM::GetInputAvailableType und ÜBERTRANSTRANSFORM::GetOutputAvailableType in beliebiger Reihenfolge aufrufen. Die Beispielimplementierungen von GetOutputType und GetOutputAvailableType testen, ob der Eingabetyp bereits definiert wurde. Wenn es über verfügt, antwortet das Plug-In, dass es nur diesen Typ unterstützt. Andernfalls gibt das Plug-In den Typ zurück, der dem angegebenen Index entspricht, wie der folgende Code zeigt:

// If input type has been defined, then use that as output type.
if (GUID_NULL != m_mtInput.majortype)
{
    hr = ::MoCopyMediaType( pmt, &m_mtInput );
}
else // Otherwise use default for this plug-in.
{
    ::ZeroMemory( pmt, sizeof( DMO_MEDIA_TYPE ) );
    pmt->majortype = MEDIATYPE_Video;
    pmt->subtype = *k_guidValidSubtypes[dwTypeIndex];     
}

Festlegen der Eingabe- und Ausgabetypen

Wenn das DSP-Plug-In als DMO fungiert, legt Windows Media Player den Medientyp fest, indem IMediaObject::SetInputType und IMediaObject::SetOutputType aufgerufen werden. An jede Funktion wird ein Zeiger auf eine DMO MEDIA _ _ TYPE-Struktur übergeben, die den angeforderten Medientyp darstellt.

Wenn das DSP-Plug-In als MFT fungiert, legt Windows Media Player den Medientyp fest, indem SIE DIE SCHNITTSTELLEN "POINTERTransform::SetInputType" und "POINTERTransform::SetOutputType" aufrufen. Übergeben Sie an jede Funktion einen Zeiger auf eine SCHNITTSTELLE VOM Typ "POINTERMediaType", die den angeforderten Medientyp darstellt.

Es gibt keine Garantie, dass der Player Formataushandlungsmethoden in einer bestimmten Reihenfolge aufruft, sodass Plug-In-Code jeden Fall verarbeiten muss. Wenn der Player beispielsweise SetOutputType vor dem Aufruf von SetInputType aufruft, ist es eine gültige Vorgehensweise für das Plug-In, den vorgeschlagenen Ausgabemedientyp abzulehnen. Der folgende Code aus der Beispielimplementierungen von IMediaObject::SetOutputType veranschaulicht dies:

if( GUID_NULL != m_mtInput.majortype )
{
    // Validate that the output media type matches our requirements 
    // and matches our input type (if set).
    hr = ValidateMediaType(pmt, &m_mtInput);
}
else
{
    hr = DMO_E_TYPE_NOT_ACCEPTED;
}

Die Plug-In-Beispielimplementierungen von SetInputType und SetOutputType rufen die benutzerdefinierte Funktion mit dem Namen ValidateMediaType auf. Diese Plug-In-Funktion führt eine Reihe von Tests für den vorgeschlagenen Medientyp aus, um sicherzustellen, dass der Medientyp wohlgeformt ist und vom Plug-In unterstützt wird. ValidateMediaType führt die folgenden Tests aus:

  • Überprüft, ob die Member majortype und formattype die richtigen Werte enthalten.
  • Überprüft, ob der Untertypmember mit einem der unterstützten Formate übereinstimmt.
  • Überprüft, ob die Informationen in den Strukturen BITMAPINFOHEADER und VIDEOINFOHEADER oder VIDEOINFOHEADER2 gültige Werte enthalten.
  • Testet, ob die Eingabe- und Ausgabemedientypen übereinstimmen, da das Plug-In keine Formate von der Eingabe in die Ausgabe konvertiert.

Wenn der vorgeschlagene Medientyp die Validierungstests besteht, wird er in einer Membervariablen gespeichert: m _ mtInput für den Eingabemedientyp, m _ mtOutput für den Ausgabemedientyp.

Implementieren eines Video-DSP-Plug-Ins