Freigeben über


MPEG-Decoder- Vorverarbeitungstransformationen

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

Briefkasten und PanScan

Das 4x3-Bild kann entweder durch Das Auffüllen des oberen und unteren Bilds (als Letterbox-Bild bezeichnet) oder durch Extrahieren eines 4x3-Teils des Bilds (als PanScan-Bild bezeichnet) gebildet werden. Die Menüs und Unterpicture-Streams werden auf dem letzten Videobild überlagert. Die Bilder im Verhältnis von 16x9 werden in einem anamorphen 4x3-Format gespeichert. Das anamorphe 4x3-Seitenverhältnis 720x480-Quellvideo auf ein Seitenverhältnis von 16x9 bildet das ursprüngliche 16x9-Seitenbild.

Im Folgenden finden Sie eine Beschreibung der korrekten Anzeige der einzelnen Modi und ihrer Highlights:

  • Breitbild: Das Quellvideo erstreckte sich in den größten Bereich von 16x9 des Ausgabefensters. Die Highlights sind relativ zum Inneren des 16x9-Bereichs. Schwarze Balken sollten entweder oben und unten oder an den Seiten hinzugefügt werden, um einen Bereich von 16x9 beizubehalten.
  • Schwenkscan: Verwenden Sie aus dem 16x9-Video den horizontalen Offset, der im MPEG2-Stream bereitgestellt wird, um einen 4x3-Unterwindow zu extrahieren. Platzieren Sie den Unterfenster 4x3 im größten 4x3-Bereich des Ausgabeclientfensters. Die Koordinaten der Hervorhebung sind relativ zum Ausgabefenster 4x3 und haben keine Beziehung zum 16x9-Quellvideo. Schwarze Balken sollten entweder oben und unten oder an den Seiten hinzugefügt werden, um einen 4x3-Bereich zu erhalten.
  • Briefkasten: Berechnen Sie den größten 4x3-Bereich des Ausgabefensters. Schwarze Balken sollten entweder oben und unten oder an den Seiten hinzugefügt werden, um einen 4x3-Bereich zu erhalten. Das anamorphe 4x3-Quellvideo (ein 16x9-Bild) befindet sich im größten 16x9-Unterfenster innerhalb des 4x3-Bereichs. Schwarze Balken sollten oben und unten im Unterfenster hinzugefügt werden, um einen Bereich von 16x9 beizubehalten. Die Koordinaten der Hervorhebung sind relativ zum 4x3-Bereich und haben keine Beziehung zum 16x9-Quellvideo. Es ist möglich, dass ein Datenträger eine Hervorhebung angibt, die außerhalb des Bereichs 16x9 liegt (aber immer noch im 4x3-Fenster). Bei 4x3-Videos wird das Video im größten Ausgabebereich von 4x3 des Ausgabeclientfensters platziert. Schwarze Balken sollten entweder oben und unten oder an den Seiten hinzugefügt werden, um einen 4x3-Bereich zu erhalten.

MPEG-Vorverarbeitung mit dem DVD-Navigator und VMR

Derzeit wird dem Decoder ein FORMAT_MPEG2_VIDEO Medientyp übergeben (dessen Formatblock auf eine MPEG2VIDEOINFO-Struktur verweist). Auf den Ausgabepins erzeugt der Decoder einen FORMAT_VideoInfo2 Medientyp, dessen Formatblock auf eine VIDEOINFOHEADER2-Struktur verweist. Das dwReserved-Feld der Struktur wurde in dwControls-Flags umbenannt.

Der dwControlFlags-Member enthält nun die neuen Bits.

Bezeichnung Wert
AMCONTROL_USED 0x00000001
AMCONTROL_PAD_TO_4x3 0x00000002
AMCONTROL_PAD_TO_16x9 0x00000004

 

AMCONTROL_USED wird verwendet, um zu testen, ob diese neuen Flags unterstützt werden. Ein Quellfilter sollte das AMCONTROL_USED-Flag festlegen und überprüfen, ob QueryAccept(MediaType) auf dem Downstream-Pin erfolgreich ist. Wenn es abgelehnt wird, können die AMCONTROL-Flags nicht verwendet werden, und dwReserved1 muss auf 0 festgelegt werden.

AMCONTROL_PAD_TO_4x3 gibt an, dass das Bild gepolstert und in einem 4x3-Bereich angezeigt werden soll.

AMCONTROL_PAD_TO_16x9 gibt an, dass das Bild gepolstert und in einem Bereich von 16x9 angezeigt werden soll.

Der Decoder sollte die Bits entweder blind kopieren oder verarbeiten. Wenn der Decoder den Briefkasten selbst ausführt, muss er das Pixelseitenverhältnis ändern, das Bild paden und die entsprechenden AMCONTROL_*-Bits entfernen.

MPEG2VIDEOINFO.dwFlags enthält jetzt drei Flags zum Steuern der Anzeige der Inhalte:

  • AMMPEG2_DoPanScan (0x00000001): Wenn dieses Flag festgelegt ist, sollte der MPEG-2-Videodecoder das Ausgabebild basierend auf Panscanvektoren in picture_display_extension zuschneiden und das Bildseitenverhältnis in 4x3 ändern. Die VMR sollte kein 16x9-Beispiel mit diesem Flag erhalten. Eine einfache Implementierung kann das Quellrechteck ändern, um einen Quellbereich von 540 Breite mit einem linken Rand anzugeben, der dem Anzeigeoffset im picture_display_extension entspricht.

  • AMMPEG2_LetterboxAnalogOut (0x00000020): Wenn ein Hardwaredecoder diesen Stream einer Videoausgabe anzeigt (in der Regel ein SVIDEO-Connector auf dem Karte), sollten die Regeln für die Anzeige eines 16x9-Beispiels auf einem 4x3-Display angewendet werden.

    Ein Softwaredecoder (oder ein Hardwaredecoder, der eine Ausgabe erzeugt, die an den VMR gesendet wird) verfügt über zwei Optionen bei der Verarbeitung von Images:

    1. Ignorieren Sie dieses Flag, und übergeben Sie den Inhalt von VideoInfoHeader2 an die VMR (das AMCONTROL_PAD_TO_4x3-Flag wird bereits vom DVD-Navigator im Beispiel festgelegt). Der VMR wird ein 16x9-Videobeispiel mit dem AMCONTROL_PAD_TO_4x3-Flag und einem 4x3-Unterpicture-Stream angezeigt. Die Anwendung muss die normalisierten Zielrechtecke der beiden Datenströme auf die gleiche Breite festlegen.
    2. Konvertieren Sie den anamorphen Stream in ein 4x3-Bild, indem Sie den oberen und unteren Rand des Bilds auffüllen und das Bildseitenverhältnis auf 4x3 festlegen (siehe Letterbox oben), und entfernen Sie das AMCONTROL_PAD_TO_4x3 Bit aus dem VIDEOINFOHEADER2.

    DirectXVA-Decoder, die die Video- und Subpicture-Streams kombinieren, müssen dieses Flag verarbeiten. Wenn die Hardware die gemischte Subpicture nicht skalieren kann, sollte der Decoder einen separaten Unterpicture-Stream erstellen, damit der VMR mit dem Video verschmelzen kann.

  • AMMPEG2_WidescreenAnalogOut (0x00000200): Wenn ein Hardwaredecoder diesen Datenstrom einer Videoausgabe anzeigt (in der Regel ein SVIDEO-Connector auf dem Karte), sollte von einer 16x9 (anamorphen) Anzeige ausgegangen werden.

    Ein Softwaredecoder (oder ein Hardwaredecoder, der eine Ausgabe erzeugt, die an die VMR gesendet wird) verfügt über zwei Optionen bei der Verarbeitung eines anamorphen Images:

    1. Ignorieren Sie dieses Flag, und kopieren Sie den Inhalt von VideoInfoHeader2 in den VMR. Die VMR polstert 4x3 Images auf 16x9, wenn die AMCONTROL_PAD_TO_16x9 festgelegt ist.
    2. Binden Sie das Ausgabebild auf ein 16x9-Bild, und entfernen Sie das AMCONTROL_PAD_TO_16x9 Bit.

Die meisten Decoder sollten GetMediaType verwenden, um eine Medienänderung am Eingabenadel zu erkennen und die VIDEOINFOHEADER2-Inhalte (im MPEG2INFOHEADER enthalten) auf den Ausgabenadel zu kopieren. Sie verarbeiten wahrscheinlich nur das PanScan-Bit.

Der folgende Beispielcode zeigt, wie sie den VIDEOINFOHEADER2-Inhalt von einem Eingabenadel an einen Ausgabenadel kopieren.

#include <dvdmedia.h>
HRESULT CopyMPeg2ToVideoInfoHeader2(CMediaSample* pInSample, CMediaSample* pOutSample)
{
    HRESULT hr = S_OK;
    // Check for a media type on the input sample.
    AM_MEDIA_TYPE* pInType;
    if (pInSample->GetMediaType(&pInType) == S_OK) 
    {
        // Make sure it's an MPEG2 Video format.
        if ((pInType->formattype == FORMAT_MPEG2_VIDEO) &&
            (pInType->cbFormat >= sizeof(MPEG2VIDEOINFO)))
        {
            hr = S_OK; // Initialize hr for the CMediaType constructor.
            CMediaType outType(*pInType, &hr);
            if (FAILED(hr))
            {
                DeleteMediaType( pInType );
                return hr;
            }

            // Set the format type GUID.
            outType.SetFormatType(&FORMAT_VideoInfo2);
                
            // Truncate the format block to include just the VIDEOINFOHEADER part.
            MPEG2VIDEOINFO *pMPeg2Header = (MPEG2VIDEOINFO*)pInType->pbFormat;
            BYTE *pVIH = (BYTE*)&pMPeg2Header->hdr;
            hr = (outType.SetFormat(pVIH, sizeof(VIDEOINFOHEADER2)) ? S_OK : E_OUTOFMEMORY);
            if (SUCCEEDED(hr))
            {
                hr = pOutSample->SetMediaType(&outType);
            }
        } 
        else 
        {
            ASSERT(FALSE); // Not a MPEG2 header.
            hr = VFW_E_INVALIDMEDIATYPE;
        }
        DeleteMediaType( pInType );
    } 

    return hr;
}