Festlegen von Deinterlace-Einstellungen

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

Der Video Mixing Renderer (VMR) unterstützt hardwarebeschleunigtes Deinterlacing, wodurch die Renderingqualität für Interlaced-Videos verbessert wird. Welche Features genau verfügbar sind, hängt von der zugrunde liegenden Hardware ab. Die Anwendung kann die Hardwaredeinterlacingfunktionen abfragen und Deinterlacing-Einstellungen über die IVMRDeinterlaceControl-Schnittstelle (VMR-7) oder die IVMRDeinterlaceControl9-Schnittstelle (VMR-9) festlegen. Das Deinterlacing wird pro Stream ausgeführt.

Es gibt einen wichtigen Unterschied beim Interlacingverhalten zwischen VMR-7 und VMR-9. Auf Systemen, auf denen die Grafikhardware das erweiterte Deinterlacing nicht unterstützt, kann die VMR-7 auf die Hardwareüberlagerung zurückgreifen und sie anweisen, eine Deinterlace im BOB-Stil zu verwenden. In diesem Fall wird das Video mit 60 Flips pro Sekunde gerendert, obwohl die VMR 30 fps meldet.

Mit Ausnahme der VMR-7 mit Hardwareüberlagerung wird das Deinterlacing vom Mixer der VMR ausgeführt. Der Mixer verwendet die DirectX-Videobeschleunigung (DXVA) deinterlacing Device Driver Interface (DDI), um die Deinterlacing durchzuführen. Dieser DDI kann von Anwendungen nicht aufgerufen werden, und Anwendungen können die Deinterlacingfunktion der VMR nicht ersetzen. Eine Anwendung kann jedoch den gewünschten Deinterlacingmodus auswählen, wie in diesem Abschnitt beschrieben.

Hinweis

In diesem Abschnitt werden die IVMRDeinterlaceControl9-Methoden beschrieben, aber die VMR-7-Versionen sind nahezu identisch.

 

Gehen Sie wie folgt vor, um die Deinterlacingfunktionen für einen Videostream abzurufen:

  1. Füllen Sie eine VMR9VideoDesc-Struktur mit einer Beschreibung des Videodatenstroms aus. Details zum Ausfüllen dieser Struktur werden später angegeben.
  2. Übergeben Sie die -Struktur an die IVMRDeinterlaceControl9::GetNumberOfDeinterlaceModes-Methode . Rufen Sie die -Methode zweimal auf. Der erste Aufruf gibt die Anzahl der Deinterlacemodi zurück, die die Hardware für das angegebene Format unterstützt. Ordnen Sie ein Array von GUIDs dieser Größe zu, und rufen Sie die -Methode erneut auf, und übergeben Sie die Adresse des Arrays. Der zweite Aufruf füllt das Array mit GUIDs aus. Jede GUID identifiziert einen Deinterlacingmodus.
  3. Um die Kapazität eines bestimmten Modus abzurufen, rufen Sie die IVMRDeinterlaceControl9::GetDeinterlaceModeCaps-Methode auf. Übergeben Sie dieselbe VMR9VideoDesc-Struktur zusammen mit einer der GUIDs aus dem Array. Die -Methode füllt eine VMR9DeinterlaceCaps-Struktur mit den Modusfunktionen aus.

Diese Schritte sind im folgenden Code dargestellt:

VMR9VideoDesc VideoDesc; 
DWORD dwNumModes = 0;
// Fill in the VideoDesc structure (not shown).
hr = pDeinterlace->GetNumberOfDeinterlaceModes(&VideoDesc, 
    &dwNumModes, NULL);
if (SUCCEEDED(hr) && (dwNumModes != 0))
{
    // Allocate an array for the GUIDs that identify the modes.
    GUID *pModes = new GUID[dwNumModes];
    if (pModes)
    {
        // Fill the array.
        hr = pDeinterlace->GetNumberOfDeinterlaceModes(&VideoDesc, 
            &dwNumModes, pModes);
        if (SUCCEEDED(hr))
        {
            // Loop through each item and get the capabilities.
            for (int i = 0; i < dwNumModes; i++)
            {
                VMR9DeinterlaceCaps Caps;
                hr = pDeinterlace->GetDeinterlaceModeCaps(pModes + i, 
                    &VideoDesc, &Caps);
                if (SUCCEEDED(hr))
                {
                    // Examine the Caps structure.
                }
            }
        }
        delete [] pModes;
    }
}

Jetzt kann die Anwendung den Deinterlacingmodus für den Stream mithilfe der folgenden Methoden festlegen:

Die Methodenverweisseiten enthalten weitere Informationen.

Verwenden der VMR9VideoDesc-Struktur

In der zuvor beschriebenen Vorgehensweise besteht der erste Schritt darin, eine VMR9VideoDesc-Struktur mit einer Beschreibung des Videodatenstroms auszufüllen. Beginnen Sie mit dem Abrufen des Medientyps des Videostreams. Dazu rufen Sie IPin::ConnectionMediaType am Eingabepin des VMR-Filters auf. Überprüfen Sie dann, ob der Videostream interlaced ist. Nur VIDEOINFOHEADER2-Formate können interlaced werden. Wenn der Formattyp FORMAT_VideoInfo ist, muss es sich um einen progressiven Frame handeln. Wenn der Formattyp FORMAT_VideoInfo2 ist, überprüfen Sie das Feld dwInterlaceFlags auf das flag AMINTERLACE_IsInterlaced. Das Vorhandensein dieses Flags gibt an, dass das Video interlaced ist.

Angenommen, die Variable pBMI ist ein Zeiger auf die BITMAPINFOHEADER-Struktur im Formatblock. Legen Sie die folgenden Werte in der VMR9VideoDesc-Struktur fest:

  • dwSize: Legen Sie dieses Feld auf fest sizeof(VMR9VideoDesc).

  • dwSampleWidth: Legen Sie dieses Feld auf fest pBMI->biWidth.

  • dwSampleHeight: Legen Sie dieses Feld auf fest abs(pBMI->biHeight).

  • SampleFormat: Dieses Feld beschreibt die Interlace-Merkmale des Medientyps. Überprüfen Sie das Feld dwInterlaceFlags in der VIDEOINFOHEADER2-Struktur , und legen Sie SampleFormat auf das entsprechende VMR9_SampleFormat-Flag fest. Eine Hilfsfunktion dazu finden Sie unten.

  • InputSampleFreq: Dieses Feld gibt die Eingabehäufigkeit an, die aus dem Feld AvgTimePerFrame in der VIDEOINFOHEADER2-Struktur berechnet werden kann. Legen Sie im Allgemeinen dwNumerator auf 10000000 und dwDenominator auf AvgTimePerFrame fest. Sie können jedoch auch einige bekannte Bildfrequenzen überprüfen:

    Durchschnittliche Zeit pro Frame Bildfrequenz (fps) Zähler Nenner
    166833 59.94 (NTSC) 60000 1001
    333667 29.97 (NTSC) 30.000 1001
    417188 23.97 (NTSC) 24.000 1001
    200.000 50.00 (PAL) 50 1
    400000 25.00 (PAL) 25 1
    416667 24.00 (Film) 24 1

     

  • OutputFrameFreq: Dieses Feld gibt die Ausgabehäufigkeit an, die aus dem InputSampleFreq-Wert und den überlappenden Merkmalen des Eingabedatenstroms berechnet werden kann:

    • Legen Sie OutputFrameFreq.dwDenominator auf InputSampleFreq.dwDenominator fest.
    • Wenn das Eingabevideo überlappend ist, legen Sie OutputFrameFreq.dwNumerator auf 2 x InputSampleFreq.dwNumerator fest. (Nach dem Deinterlacing wird die Bildfrequenz verdoppelt.) Legen Sie andernfalls den Wert auf InputSampleFreq.dwNumerator fest.
  • dwFourCC: Legen Sie dieses Feld auf fest pBMI->biCompression.

Die folgende Hilfsfunktion konvertiert AMINTERLACE_X-Flags inVMR9_SampleFormat Werte:

#define IsInterlaced(x) ((x) & AMINTERLACE_IsInterlaced)
#define IsSingleField(x) ((x) & AMINTERLACE_1FieldPerSample)
#define IsField1First(x) ((x) & AMINTERLACE_Field1First)

VMR9_SampleFormat ConvertInterlaceFlags(DWORD dwInterlaceFlags)
{
    if (IsInterlaced(dwInterlaceFlags)) {
        if (IsSingleField(dwInterlaceFlags)) {
            if (IsField1First(dwInterlaceFlags)) {
                return VMR9_SampleFieldSingleEven;
            }
            else {
                return VMR9_SampleFieldSingleOdd;
            }
        }
        else {
            if (IsField1First(dwInterlaceFlags)) {
                return VMR9_SampleFieldInterleavedEvenFirst;
             }
            else {
                return VMR9_SampleFieldInterleavedOddFirst;
            }
        }
    }
    else {
        return VMR9_SampleProgressiveFrame;  // Not interlaced.
    }
}