Schritt 3A. Implementieren der CheckInputType-Methode

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

Dies ist Schritt 3A des Tutorials Schreiben von Transformationsfiltern.

Die CTransformFilter::CheckInputType-Methode wird aufgerufen, wenn der Upstream Filter dem Transformationsfilter einen Medientyp vorschlägt. Diese Methode verwendet einen Zeiger auf ein CMediaType-Objekt , bei dem es sich um einen dünnen Wrapper für die AM_MEDIA_TYPE-Struktur handelt. Bei dieser Methode sollten Sie jedes relevante Feld der AM_MEDIA_TYPE-Struktur untersuchen, einschließlich der Felder im Formatblock. Sie können die in CMediaType definierten Accessormethoden verwenden oder direkt auf die Strukturmember verweisen. Wenn ein Feld ungültig ist, geben Sie VFW_E_TYPE_NOT_ACCEPTED zurück. Wenn der gesamte Medientyp gültig ist, geben Sie S_OK zurück.

Im RLE-Encoderfilter muss der Eingabetyp beispielsweise 8-Bit- oder 4-Bit-unkomprimiertes RGB-Video sein. Es gibt keinen Grund, andere Eingabeformate wie 16- oder 24-Bit-RGB zu unterstützen, da der Filter diese in eine niedrigere Bittiefe konvertieren müsste, und DirectShow stellt zu diesem Zweck bereits einen Filter für den Farbraumkonverter bereit. Im folgenden Beispiel wird davon ausgegangen, dass der Encoder 8-Bit-Video unterstützt, aber kein 4-Bit-Video:

HRESULT CRleFilter::CheckInputType(const CMediaType *mtIn)
{
    if ((mtIn->majortype != MEDIATYPE_Video) ||
        (mtIn->subtype != MEDIASUBTYPE_RGB8) ||
        (mtIn->formattype != FORMAT_VideoInfo) || 
        (mtIn->cbFormat < sizeof(VIDEOINFOHEADER)))
    {
        return VFW_E_TYPE_NOT_ACCEPTED;
    }

    VIDEOINFOHEADER *pVih = 
        reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
    if ((pVih->bmiHeader.biBitCount != 8) ||
        (pVih->bmiHeader.biCompression != BI_RGB))
    {
        return VFW_E_TYPE_NOT_ACCEPTED;
    }

    // Check the palette table.
    if (pVih->bmiHeader.biClrUsed > PALETTE_ENTRIES(pVih))
    {
        return VFW_E_TYPE_NOT_ACCEPTED;
    }
    DWORD cbPalette = pVih->bmiHeader.biClrUsed * sizeof(RGBQUAD);
    if (mtIn->cbFormat < sizeof(VIDEOINFOHEADER) + cbPalette)
    {
        return VFW_E_TYPE_NOT_ACCEPTED;
    }

    // Everything is good.
    return S_OK;
}

In diesem Beispiel überprüft die -Methode zunächst den Haupttyp und den Untertyp. Anschließend wird der Formattyp überprüft, um sicherzustellen, dass der Formatblock eine VIDEOINFOHEADER-Struktur ist. Der Filter könnte auch VIDEOINFOHEADER2 unterstützen, aber in diesem Fall würde es keinen wirklichen Nutzen geben. Die VIDEOINFOHEADER2-Struktur fügt Unterstützung für Interlacing und nicht quadratische Pixel hinzu, die in 8-Bit-Videos wahrscheinlich nicht relevant sind.

Wenn der Formattyp korrekt ist, überprüft das Beispiel die Elemente biBitCount und biCompression der VIDEOINFOHEADER-Struktur , um zu überprüfen, ob das Format 8-Bit-unkomprimiertes RGB ist. Wie dieses Beispiel zeigt, müssen Sie die

pbFormat

Zeiger auf die richtige Struktur basierend auf dem Formattyp. Überprüfen Sie immer die Formattyp-GUID (formattype) und die Größe des Formatblocks (cbFormat), bevor Sie den Zeiger umwandeln.

Im Beispiel wird auch überprüft, ob die Anzahl der Paletteneinträge mit der Bittiefe kompatibel ist und der Formatblock groß genug ist, um die Paletteneinträge aufzunehmen. Wenn alle diese Informationen korrekt sind, gibt die Methode S_OK zurück.

Weiter: Schritt 3B. Implementieren Sie die GetMediaType-Methode.

Schreiben von DirectShow-Filtern