Freigeben über


Schritt 3B. Implementieren der GetMediaType-Methode

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

Dies ist Schritt 3B des Tutorials Schreiben von Transformationsfiltern.

Hinweis

Dieser Schritt ist für Filter, die von CTransInPlaceFilter abgeleitet werden, nicht erforderlich.

 

Die CTransformFilter::GetMediaType-Methode gibt einen der bevorzugten Ausgabetypen des Filters zurück, auf den durch die Indexnummer verwiesen wird. Diese Methode wird nie aufgerufen, es sei denn, der Eingabenadel des Filters ist bereits verbunden. Daher können Sie den Medientyp aus der Upstream Verbindung verwenden, um die bevorzugten Ausgabetypen zu bestimmen.

Ein Encoder bietet in der Regel einen einzelnen bevorzugten Typ, der das Zielformat darstellt. Decoder unterstützen im Allgemeinen eine Reihe von Ausgabeformaten und bieten diese in der Reihenfolge absteigender Qualität oder Effizienz an. Die Liste kann beispielsweise UYVY, Y211, RGB-24, RGB-565, RGB-555 und RGB-8 in dieser Reihenfolge sein. Effektfilter erfordern möglicherweise eine genaue Übereinstimmung zwischen dem Ausgabeformat und dem Eingabeformat.

Im folgenden Beispiel wird ein einzelner Ausgabetyp zurückgegeben, der durch Ändern des Eingabetyps erstellt wird, um die RLE8-Komprimierung anzugeben:

HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
    ASSERT(m_pInput->IsConnected());
    if (iPosition < 0)
    {
        return E_INVALIDARG;
    }
    if (iPosition == 0)
    {
        HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
        if (FAILED(hr))
        {
            return hr;
        }
        FOURCCMap fccMap = FCC('MRLE'); 
        pMediaType->subtype = static_cast<GUID>(fccMap);
        pMediaType->SetVariableSize();
        pMediaType->SetTemporalCompression(FALSE);

        ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
        VIDEOINFOHEADER *pVih =
            reinterpret_cast<VIDEOINFOHEADER*>(pMediaType->pbFormat);
        pVih->bmiHeader.biCompression = BI_RLE8;
        pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader); 
        return S_OK;
    }
    // else
    return VFW_S_NO_MORE_ITEMS;
}

In diesem Beispiel ruft die Methode IPin::ConnectionMediaType auf, um den Eingabetyp vom Eingabenadel abzurufen. Anschließend werden einige Felder wie folgt geändert, um das Komprimierungsformat anzugeben:

  • Es weist einen neuen Untertyp GUID zu, der aus dem FOURCC-Code "MRLE" mithilfe der FOURCCMap-Klasse erstellt wird.
  • Sie ruft die CMediaType::SetVariableSize-Methode auf, die das bFixedSizeSamples-Flag auf FALSE und das lSampleSize-Element auf 0 festlegt, um Beispiele mit variabler Größe anzugeben.
  • Sie ruft die CMediaType::SetTemporalCompression-Methode mit dem Wert FALSE auf, was angibt, dass jeder Frame ein Keyframe ist. (Dieses Feld ist nur informativ, sodass Sie es sicher ignorieren können.)
  • Das Feld biCompression wird auf BI_RLE8 festgelegt.
  • Das Feld biSizeImage wird auf die Bildgröße festgelegt.

Nächster Schritt: Schritt 3C. Implementieren Sie die CheckTransform-Methode.

Schreiben von DirectShow-Filtern