DXVA-Videoverarbeitung

Die DXVA-Videoverarbeitung fasst die Funktionen der Grafikhardware zusammen, die der Verarbeitung unkomprimierter Videobilder gewidmet sind. Videoverarbeitungsdienste umfassen Deinterlacing und Videomixing.

Dieses Thema enthält folgende Abschnitte:

Überblick

Grafikhardware kann den Grafikprozessor (GPU) verwenden, um unkomprimierte Videobilder zu verarbeiten. Ein Videoverarbeitungsgerät ist eine Softwarekomponente, die diese Funktionen zusammenfasst. Anwendungen können ein Videoverarbeitungsgerät verwenden, um Funktionen wie die folgenden auszuführen:

  • Deinterlacing und Inverse Telecine
  • Mischen von Video-Unterstreams auf das Hauptvideobild
  • Farbanpassung (ProcAmp) und Bildfilterung
  • Bildskalierung
  • Farbraumkonvertierung
  • Alphablending

Das folgende Diagramm zeigt die Phasen in der Videoverarbeitungspipeline. Das Diagramm soll keine tatsächliche Implementierung zeigen. Beispielsweise kann der Grafiktreiber mehrere Phasen in einem einzigen Vorgang kombinieren. Alle diese Vorgänge können in einem einzigen Aufruf des Videoverarbeitungsgeräts ausgeführt werden. Einige hier gezeigte Phasen, z. B. Rausch- und Detailfilterung, werden vom Treiber möglicherweise nicht unterstützt.

diagram showing the stages of dxva video processing.

Die Eingabe in die Videoverarbeitungspipeline enthält immer einen primären Videostream, der die Hauptbilddaten enthält. Der primäre Videostream bestimmt die Bildfrequenz für das Ausgabevideo. Jeder Frame des Ausgabevideos wird relativ zu den Eingabedaten aus dem primären Videostream berechnet. Pixel im primären Stream sind immer undurchsichtig, ohne Alphadaten pro Pixel. Der primäre Videostream kann progressiv oder interlaced sein.

Optional kann die Videoverarbeitungspipeline bis zu 15 Video-Unterstreams empfangen. Ein Unterstream enthält Hilfsbilddaten, z. B. Untertitel oder DVD-Unterbilder. Diese Bilder werden über dem primären Videostream angezeigt und sind in der Regel nicht für die alleinige Anzeige vorgesehen. Unterstreambilder können Alphadaten pro Pixel enthalten und sind immer progressive Frames. Das Videoverarbeitungsgerät mischt die Unterstreambilder mittels Alpha-Blend mit dem aktuellen Deinterlaced-Frame aus dem primären Videostream zusammen.

Im restlichen Teil dieses Themas wird der Begriff Bild für die Eingabedaten für ein Videoverarbeitungsgerät verwendet. Ein Bild kann aus einem progressiven Frame, einem einzelnen Feld oder zwei überlappenden Feldern bestehen. Die Ausgabe ist immer ein deinterlaced Frame.

Ein Videotreiber kann mehrere Videoverarbeitungsgeräte implementieren, um unterschiedliche Videoverarbeitungsfunktionen bereitzustellen. Geräte werden durch GUID identifiziert. Die folgenden GUIDs sind vordefiniert:

  • DXVA2_VideoProcBobDevice. Dieses Gerät führt Bob-Deinterlacing durch.
  • DXVA2_VideoProcProgressiveDevice. Dieses Gerät wird verwendet, wenn das Video nur progressive Frames ohne interlaced Frames enthält. (Einige Videoinhalte enthalten eine Mischung aus progressiven und interlaced Frames. Das progressive Gerät kann nicht für diese Art von „gemischten“ Videoinhalten verwendet werden, da für die interlaced Frames ein Deinterlacing-Schritt erforderlich ist.)

Jeder Grafiktreiber, der DXVA-Videoverarbeitung unterstützt, muss mindestens diese beiden Geräte implementieren. Der Grafiktreiber kann auch andere Geräte bereitstellen, die durch treiberspezifische GUIDs identifiziert werden. Beispielsweise kann ein Treiber einen proprietären Deinterlacing-Algorithmus implementieren, der eine bessere Qualität als Bob-Deinterlacing erzeugt. Einige Deinterlacingalgorithmen erfordern möglicherweise Vorwärts- oder Rückwärtsverweisbilder aus dem primären Stream. In diesem Fall muss der Aufrufer diese Bilder dem Treiber in der richtigen Reihenfolge bereitstellen, wie weiter unten in diesem Abschnitt beschrieben.

Es wird auch ein Referenzsoftwaregerät bereitgestellt. Das Softwaregerät ist für Qualität und nicht für Geschwindigkeit optimiert und eignet sich möglicherweise nicht für die Echtzeit-Videoverarbeitung. Das Referenzsoftwaregerät verwendet den GUID-Wert DXVA2_VideoProcSoftwareDevice.

Erstellen eines Videoverarbeitungsgeräts

Vor der Verwendung der DXVA-Videoverarbeitung muss die Anwendung ein Videoverarbeitungsgerät erstellen. Im Folgenden finden Sie eine kurze Übersicht über die Schritte, die im Rest dieses Abschnitts ausführlicher erläutert werden:

  1. Rufen Sie einen Zeiger auf die IDirectXVideoProcessorService-Schnittstelle ab.
  2. Erstellen Sie eine Beschreibung des Videoformats für den primären Videostream. Verwenden Sie diese Beschreibung, um eine Liste der Videoverarbeitungsgeräte abzurufen, die das Videoformat unterstützen. Geräte werden durch GUID identifiziert.
  3. Rufen Sie für ein bestimmtes Gerät eine Liste der vom Gerät unterstützten Renderzielformate ab. Die Formate werden als Liste mit D3DFORMAT-Werten zurückgegeben. Wenn Sie Unterstreams kombinieren möchten, rufen Sie auch eine Liste der unterstützten Unterstreamformate ab.
  4. Fragen Sie die Funktionen der einzelnen Geräte ab.
  5. Erstellen Sie das Videoverarbeitungsgerät.

Manchmal können Sie einige dieser Schritte weglassen. Anstatt beispielsweise die Liste der Renderzielformate abzurufen, können Sie einfach versuchen, das Videoverarbeitungsgerät mit Ihrem bevorzugten Format zu erstellen und festzustellen, ob es erfolgreich ist. Ein gängiges Format wie D3DFMT_X8R8G8B8 ist wahrscheinlich erfolgreich.

Im restlichen Teil dieses Abschnitts werden diese Schritte ausführlich beschrieben.

Abrufen des IDirectXVideoProcessorService-Zeigers

Die IDirectXVideoProcessorService-Schnittstelle wird vom Direct3D-Gerät abgerufen. Es gibt zwei Möglichkeiten, um einen Zeiger auf diese Schnittstelle zu erhalten:

Wenn Sie über einen Zeiger auf ein Direct3D-Gerät verfügen, können Sie einen IDirectXVideoProcessorService-Zeiger abrufen, indem Sie die DXVA2CreateVideoService-Funktion aufrufen. Übergeben Sie einen Zeiger an die IDirect3DDevice9-Schnittstelle des Geräts, und geben Sie IID_IDirectXVideoProcessorService für den riid-Parameter an, wie im folgenden Code gezeigt:

    // Create the DXVA-2 Video Processor service.
    hr = DXVA2CreateVideoService(g_pD3DD9, IID_PPV_ARGS(&g_pDXVAVPS));

In einigen Fällen erstellt ein Objekt das Direct3D-Gerät und teilt es dann über den Direct3D-Geräte-Manager mit anderen Objekten. In diesem Fall können Sie IDirect3DDeviceManager9::GetVideoService im Geräte-Manager aufrufen , um den IDirectXVideoProcessorService-Zeiger abzurufen, wie im folgenden Code gezeigt:

HRESULT GetVideoProcessorService(
    IDirect3DDeviceManager9 *pDeviceManager,
    IDirectXVideoProcessorService **ppVPService
    )
{
    *ppVPService = NULL;

    HANDLE hDevice;

    HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
    if (SUCCEEDED(hr))
    {
        // Get the video processor service 
        HRESULT hr2 = pDeviceManager->GetVideoService(
            hDevice, 
            IID_PPV_ARGS(ppVPService)
            );

        // Close the device handle.
        hr = pDeviceManager->CloseDeviceHandle(hDevice);

        if (FAILED(hr2))
        {
            hr = hr2;
        }
    }

    if (FAILED(hr))
    {
        SafeRelease(ppVPService);
    }

    return hr;
}

Auflisten der Videoverarbeitungsgeräte

Um eine Liste von Videoverarbeitungsgeräten abzurufen, füllen Sie eine DXVA2_VideoDesc-Struktur mit dem Format des primären Videostreams aus, und übergeben Sie diese Struktur an die IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids-Methode. Die Methode gibt ein Array von GUIDs zurück, eines für jedes Videoverarbeitungsgerät, das mit diesem Videoformat verwendet werden kann.

Betrachten Sie eine Anwendung, die einen Videostream im YUY2-Format rendert, wobei die BT.709-Definition der YUV-Farbe mit einer Bildfrequenz von 29,97 Bildern pro Sekunde verwendet wird. Gehen Sie davon aus, dass der Videoinhalt vollständig aus progressiven Frames besteht. Das folgende Codefragment zeigt, wie Sie die Formatbeschreibung ausfüllen und die Geräte-GUIDs abrufen:

    // Initialize the video descriptor.

    g_VideoDesc.SampleWidth                         = VIDEO_MAIN_WIDTH;
    g_VideoDesc.SampleHeight                        = VIDEO_MAIN_HEIGHT;
    g_VideoDesc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2;
    g_VideoDesc.SampleFormat.NominalRange           = DXVA2_NominalRange_16_235;
    g_VideoDesc.SampleFormat.VideoTransferMatrix    = EX_COLOR_INFO[g_ExColorInfo][0];
    g_VideoDesc.SampleFormat.VideoLighting          = DXVA2_VideoLighting_dim;
    g_VideoDesc.SampleFormat.VideoPrimaries         = DXVA2_VideoPrimaries_BT709;
    g_VideoDesc.SampleFormat.VideoTransferFunction  = DXVA2_VideoTransFunc_709;
    g_VideoDesc.SampleFormat.SampleFormat           = DXVA2_SampleProgressiveFrame;
    g_VideoDesc.Format                              = VIDEO_MAIN_FORMAT;
    g_VideoDesc.InputSampleFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.InputSampleFreq.Denominator         = 1;
    g_VideoDesc.OutputFrameFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.OutputFrameFreq.Denominator         = 1;

    // Query the video processor GUID.

    UINT count;
    GUID* guids = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorDeviceGuids(&g_VideoDesc, &count, &guids);

Der Code für dieses Beispiel stammt aus dem DXVA2_VideoProc-SDK-Beispiel.

Das pGuids-Array in diesem Beispiel wird von der GetVideoProcessorDeviceGuids-Methode zugewiesen, sodass die Anwendung das Array durch Aufrufen von CoTaskMemFree freigeben muss. Die verbleibenden Schritte können mithilfe einer der von dieser Methode zurückgegebenen Geräte-GUIDs ausgeführt werden.

Auflisten von Renderzielformaten

Um die Liste der vom Gerät unterstützten Renderzielformate abzurufen, übergeben Sie die Geräte-GUID und die DXVA2_VideoDesc-Struktur an die IDirectXVideoProcessorService::GetVideoProcessorRenderTargets-Methode, wie im folgenden Code gezeigt:

    // Query the supported render-target formats.

    UINT i, count;
    D3DFORMAT* formats = NULL;

    HRESULT hr = g_pDXVAVPS->GetVideoProcessorRenderTargets(
        guid, &g_VideoDesc, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorRenderTargets failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_RENDER_TARGET_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the render-target format.\n"));
        return FALSE;
    }

Die Methode gibt ein Array von D3DFORMAT-Werten zurück. In diesem Beispiel, bei dem der Eingabetyp YUY2 ist, kann eine typische Liste der Formate D3DFMT_X8R8G8B8 (32-Bit-RGB) und D3DMFT_YUY2 (das Eingabeformat) sein. Die genaue Liste hängt jedoch vom Treiber ab.

Die Liste der verfügbaren Formate für die Unterstreams kann je nach Renderzielformat und Eingabeformat variieren. Um die Liste der Unterstreamformate abzurufen, übergeben Sie die Geräte-GUID, die Formatstruktur und das Renderzielformat an die IDirectXVideoProcessorService::GetVideoProcessorUnterstreamFormats-Methode, wie im folgenden Code gezeigt:

    // Query the supported substream formats.

    formats = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorSubStreamFormats(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorSubStreamFormats failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_SUB_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the substream format.\n"));
        return FALSE;
    }

Diese Methode gibt ein weiteres Array von D3DFORMAT-Werten zurück. Typische Unterstreamformate sind AYUV und AI44.

Abfragen der Gerätefunktionen

Um die Funktionen eines bestimmten Geräts abzurufen, übergeben Sie die Geräte-GUID, die Formatstruktur und ein Renderzielformat an die IDirectXVideoProcessorService::GetVideoProcessorCaps-Methode. Die Methode füllt eine DXVA2_VideoProcessorCaps-Struktur mit den Gerätefunktionen aus.

    // Query video processor capabilities.

    hr = g_pDXVAVPS->GetVideoProcessorCaps(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &g_VPCaps);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorCaps failed: 0x%x.\n", hr));
        return FALSE;
    }

Erstellen des Geräts

Rufen Sie zum Erstellen des Videoverarbeitungsgeräts IDirectXVideoProcessorService::CreateVideoProcessor auf. Die Eingabe für diese Methode ist die Geräte-GUID, die Formatbeschreibung, das Renderzielformat und die maximale Anzahl von Unterstreams, die Sie kombinieren möchten. Die Methode gibt einen Zeiger auf die IDirectXVideoProcessor-Schnittstelle zurück, die das Videoverarbeitungsgerät darstellt.

    // Finally create a video processor device.

    hr = g_pDXVAVPS->CreateVideoProcessor(
        guid,
        &g_VideoDesc,
        VIDEO_RENDER_TARGET_FORMAT,
        SUB_STREAM_COUNT,
        &g_pDXVAVPD
        );

Videoprozess-Blit

Der wichtigste Videoverarbeitungsvorgang ist der Videoverarbeitungs-Blit. (Ein Blit ist ein beliebiger Vorgang, der zwei oder mehr Bitmaps zu einer einzelnen Bitmap kombiniert. Ein Videoverarbeitungs-Blit kombiniert Eingabebilder zum Erstellen eines Ausgabeframes.) Rufen Sie zum Ausführen eines Blit-Vorgangs für die Videoverarbeitung IDirectXVideoProcessor::VideoProcessBlt auf. Diese Methode übergibt eine Reihe von Videobeispielen an das Videoverarbeitungsgerät. Als Reaktion verarbeitet das Videoverarbeitungsgerät die Eingabebilder und generiert einen Ausgabeframe. Die Verarbeitung kann Deinterlacing, Farbraumkonvertierung und Unterstreammischen umfassen. Die Ausgabe wird auf eine Zieloberfläche geschrieben, die vom Aufrufer bereitgestellt wird.

Die VideoProcessBlt-Methode verwendet die folgenden Parameter:

  • pRT verweist auf eine IDirect3DSurface9-Renderzieloberfläche, die den verarbeiteten Videoframe empfängt.
  • pBltParams verweist auf eine DXVA2_VideoProcessBltParams-Struktur, die die Parameter für den Blit angibt.
  • pSamples ist die Adresse eines Arrays von DXVA2_VideoSample-Strukturen. Diese Strukturen enthalten die Eingabebeispiele für den Blit.
  • NumSamples gibt die Größe des pSamples-Arrays an.
  • Der Reserved-Parameter ist reserviert und sollte auf NULL festgelegt werden.

Im pSamples-Array muss der Aufrufer die folgenden Eingabebeispiele bereitstellen:

  • Das aktuelle Bild aus dem primären Videostream.
  • Vorwärts- und Rückwärtsverweisbilder, falls vom Deinterlacingalgorithmus verlangt.
  • Null oder mehr Unterstreambilder, bis zu maximal 15 Unterstreams.

Der Treiber erwartet, dass dieses Array in einer bestimmten Reihenfolge ist, wie in der Eingabebeispielreihenfolge beschrieben.

Blit-Parameter

Die DXVA2_VideoProcessBltParams-Struktur enthält allgemeine Parameter für den Blit. Die wichtigsten Parameter werden in den folgenden Elementen der Struktur gespeichert:

  • TargetFrame ist die Präsentationszeit des Ausgabeframes. Bei progressiven Inhalten muss diese Zeit der Startzeit für den aktuellen Frame aus dem primären Videostream entsprechen. Diese Zeit wird im Start-Element der DXVA2_VideoSample-Struktur für dieses Eingabebeispiel angegeben.

    Bei Interlaced-Inhalten erzeugt ein Frame mit zwei Interleaved-Feldern zwei Deinterlaced-Ausgabeframes. Im ersten Ausgabeframe muss die Präsentationszeit der Startzeit des aktuellen Bilds im primären Videostream entsprechen, genau wie progressive Inhalte. Im zweiten Ausgabeframe muss die Startzeit dem Mittelpunkt zwischen der Startzeit des aktuellen Bilds im primären Videostream und der Startzeit des nächsten Bilds im Stream entsprechen. Wenn das Eingabevideo beispielsweise 25 Frames pro Sekunde (50 Felder pro Sekunde) hat, weisen die Ausgabeframes die Zeitstempel in der folgenden Tabelle auf. Zeitstempel werden in Einheiten von 100 Nanosekunden angezeigt.

    Eingabebild TargetFrame (1) TargetFrame (2)
    0 0 200000
    400000 0 600000
    800000 800000 1000000
    1200000 1200000 1400000

     

    Wenn interlaced Content aus einzelnen Feldern und nicht aus überlappenden Feldern besteht, entsprechen die Ausgabezeiten immer den Eingabezeiten, wie bei progressivem Inhalt.

  • TargetRect definiert einen rechteckigen Bereich innerhalb der Zieloberfläche. Der Blit schreibt die Ausgabe in diesen Bereich. Insbesondere wird jedes Pixel innerhalb von TargetRect geändert, und es werden keine Pixel außerhalb von TargetRect geändert. Das Zielrechteck definiert das umgebende Rechteck für alle Eingabevideostreams. Die Platzierung einzelner Streams innerhalb dieses Rechtecks wird über den pSamples-Parameter von IDirectXVideoProcessor::VideoProcessBlt gesteuert.

  • BackgroundColor gibt die Farbe des Hintergrunds an, wo kein Videobild angezeigt wird. Wenn beispielsweise ein Videobild von 16 x 9 innerhalb eines 4 x 3-Bereichs angezeigt wird (Letterboxing), werden die Letterboxing-Bereiche mit der Hintergrundfarbe angezeigt. Die Hintergrundfarbe gilt nur innerhalb des Zielrechtecks (TargetRect). Alle Pixel außerhalb von TargetRect werden nicht geändert.

  • DestFormat beschreibt den Farbraum für das Ausgabevideo, z. B. ob ITU-R BT.709- oder BT.601-Farbe verwendet wird. Diese Informationen können sich darauf auswirken, wie das Bild angezeigt wird. Weitere Informationen finden Sie unter Erweiterte Farbinformationen.

Andere Parameter werden auf der Referenzseite für die DXVA2_VideoProcessBltParams-Struktur beschrieben.

Eingabebeispiele

Der pSamples-Parameter von IDirectXVideoProcessor::VideoProcessBlt verweist auf ein Array von DXVA2_VideoSample-Strukturen. Jede dieser Strukturen enthält Informationen zu einem Eingabebeispiel und einen Zeiger auf die Direct3D-Oberfläche, die das Beispiel enthält. Jedes Beispiel ist eines der folgenden:

  • Das aktuelle Bild aus dem primären Stream.
  • Ein Vorwärts- oder Rückwärtsverweisbild aus dem primären Stream, das zum Deinterlacing verwendet wird.
  • Ein Unterstreambild.

Die genaue Reihenfolge, in der die Beispiele im Array angezeigt werden müssen, wird später im Abschnitt Eingabebeispielreihenfolge beschrieben.

Bis zu 15 Unterstreambilder können bereitgestellt werden, obwohl die meisten Videoanwendungen höchstens einen Unterstream benötigen. Die Anzahl der Unterstreams kann sich bei jedem Aufruf von VideoProcessBltändern. Unterstreambilder werden durch Festlegen des SampleFormat.SampleFormat-Elements der DXVA2_VideoSample-Struktur auf DXVA2_SampleUnterstream angegeben. Für den primären Videostream beschreibt dieses Element das Interlacing des Eingabevideos. Weitere Informationen finden Sie unter DXVA2_SampleFormat-Auflistung.

Für den primären Videostream geben die Elemente Start und Ende der DXVA2_VideoSample Struktur die Start- und Endzeiten des Eingabebeispiels an. Legen Sie für Unterstreambilder diese Werte auf Null fest, da die Präsentationszeit immer aus dem primären Stream berechnet wird. Die Anwendung ist dafür verantwortlich, nachzuverfolgen, wann jedes Unterstreambild präsentiert und zur richtigen Zeit an VideoProcessBlt übermittelt werden soll.

Zwei Rechtecke definieren, wie das Quellvideo für jeden Stream positioniert wird:

  • Das SrcRect-Element der DXVA2_VideoSample-Struktur gibt das Quellrechteck an, einen rechteckigen Bereich des Quellbilds, der im zusammengesetzten Ausgaberahmen angezeigt wird. Wenn Sie das Bild zuschneiden möchten, legen Sie dies auf einen Wert fest, der kleiner als die Framegröße ist. Legen Sie es andernfalls als gleich der Framegröße fest.
  • Das DstRect-Element derselben Struktur gibt das Zielrechteck an, einen rechteckigen Bereich der Zieloberfläche, in den der Videoframe angezeigt wird.

Der Treiber überträgt Pixel per Blit aus dem Quellrechteck in das Zielrechteck. Die beiden Rechtecke können unterschiedliche Größen oder Seitenverhältnisse aufweisen; der Treiber skaliert das Bild nach Bedarf. Darüber hinaus kann jeder Eingabestream einen anderen Skalierungsfaktor verwenden. Tatsächlich kann die Skalierung erforderlich sein, um das richtige Seitenverhältnis im Ausgabeframe zu erzeugen. Der Treiber berücksichtigt nicht das Pixel-Seitenverhältnis der Quelle. Wenn das Quellbild also nicht quadratische Pixel verwendet, liegt es bei der Anwendung, das richtige Zielrechteck zu berechnen.

Die bevorzugten Unterstreamformate sind AYUV und AI44. Letzteres ist ein Palettenformat mit 16 Farben. Paletteneinträge werden im Pal-Element der DXVA2_VideoSample-Struktur angegeben. (Wenn das Quellvideoformat ursprünglich als Media Foundation-Medientyp ausgedrückt wurde, werden die Paletteneinträge im MF_MT_PALETTE-Attribut gespeichert.) Löschen Sie dieses Array bei nicht palettierten Formaten auf Null.

Bildkomposition

Jeder Blit-Vorgang wird durch die folgenden drei Rechtecke definiert:

  • Das Zielrechteck (TargetRect) definiert den Bereich innerhalb der Zieloberfläche, in dem die Ausgabe angezeigt wird. Das Ausgabebild wird auf dieses Rechteck zugeschnitten.
  • Das Zielrechteck für jeden Stream (DstRect) definiert, wo der Eingabestream im zusammengesetzten Bild angezeigt wird.
  • Das Quellrechteck für jeden Stream (SrcRect) definiert, welcher Teil des Quellbilds angezeigt wird.

Die beiden Zielrechtecke werden relativ zur Zieloberfläche angegeben. Das Quellrechteck wird relativ zum Quellbild angegeben. Alle Rechtecke werden in Pixeln angegeben.

diagram showing source, destination, and target rectangles

Das Videoverarbeitungsgerät mischt die Eingabebilder mittels Alpha-Blend unter Verwendung einer der folgenden Alphadatenquellen zusammen:

  • Alphadaten pro Pixel aus Unterstreams.
  • Ein planarer Alphawert für jeden Videostream, der im PlanarAlpha-Element der DXVA2_VideoSample-Struktur angegeben ist.
  • Der planare Alphawert des zusammengesetzten Bildes, das im Alpha-Element der DXVA2_VideoProcessBltParams-Struktur angegeben ist. Dieser Wert wird verwendet, um das gesamte zusammengesetzte Bild mit der Hintergrundfarbe zu mischen.

Dieser Abschnitt enthält eine Reihe von Beispielen, die zeigen, wie das Videoverarbeitungsgerät das Ausgabebild erstellt.

Beispiel 1: Letterboxing

In diesem Beispiel wird gezeigt, wie das Quellbild im Letterboxfeld angezeigt wird, indem das Zielrechteck (destination) auf kleiner als das Zielrechteck (target) festgelegt wird. Der primäre Videostream in diesem Beispiel ist ein Bild von 720 × 480 und soll mit einem Seitenverhältnis von 16:9 angezeigt werden. Die Zieloberfläche beträgt 640 × 480 Pixel (Seitenverhältnis 4:3). Um das richtige Seitenverhältnis zu erreichen, muss das Zielrechteck 640 × 360 sein. Aus Gründen der Einfachheit enthält dieses Beispiel keinen Unterstream. Das folgende Diagramm zeigt die Quell- und Zielrechtecke.

diagram showing letterboxing.

Das vorangehende Diagramm zeigt die folgenden Rechtecke:

  • Zielrechteck (target): { 0, 0, 640, 480 }

  • Primäres Video:

    • Quellrechteck: { 0, 0, 720, 480 }
    • Zielrechteck (destination): { 0, 60, 640, 420 }

Der Treiber deinterlacet das Video, verkleinert den deinterlaced Frame auf 640 × 360 und blittet den Frame in das Zielrechteck (destination). Das Zielrechteck (target) ist größer als das Zielrechteck (destination), sodass der Treiber die Hintergrundfarbe verwendet, um die horizontalen Balken über und unter dem Frame auszufüllen. Die Hintergrundfarbe wird in der DXVA2_VideoProcessBltParams-Struktur angegeben.

Beispiel 2: Strecken von Unterstreambildern

Unterstreambilder können über das primäre Videobild hinausgehen. Im DVD-Video kann beispielsweise der primäre Videostream ein Seitenverhältnis von 4:3 aufweisen, während der Unterstream 16:9 ist. In diesem Beispiel haben beide Videostreams die gleichen Quellabmessungen (720 × 480), der Unterstream soll jedoch mit einem Seitenverhältnis von 16:9 angezeigt werden. Um dieses Seitenverhältnis zu erreichen, wird das Unterstreambild horizontal gestreckt. Die Quell- und Zielrechtecke werden im folgenden Diagramm dargestellt.

diagram showing substream image stretching.

Das vorangehende Diagramm zeigt die folgenden Rechtecke:

  • Zielrechteck: { 0, 0, 854, 480 }

  • Primäres Video:

    • Quellrechteck: { 0, 0, 720, 480 }
    • Zielrechteck (destination): { 0, 107, 474, 480 }
  • Unterstream:

    • Quellrechteck: { 0, 0, 720, 480 }
    • Zielrechteck (destination): { 0, 0, 854, 480 }

Diese Werte behalten die Bildhöhe bei und skalieren beide Bilder horizontal. In den Regionen, in denen beide Bilder angezeigt werden, werden sie per Alpha-Blending gemischt. Wenn das Unterstream-Bild über das primäre Video hinausgeht, wird der Unterstream per Alpha-Blend mit der Hintergrundfarbe gemischt. Diese Alphamischung macht die geänderten Farben auf der rechten Seite des Diagramms aus.

Beispiel 3: Nicht übereinstimmende Streamhöhen

Im vorherigen Beispiel haben der Unterstream und der primäre Stream die gleiche Höhe. Streams können auch nicht übereinstimmende Höhen aufweisen, wie in diesem Beispiel gezeigt. Bereiche innerhalb des Zielrechtecks (target), in denen kein Video angezeigt wird, werden mit der Hintergrundfarbe gezeichnet – schwarz in diesem Beispiel. Die Quell- und Zielrechtecke werden im folgenden Diagramm dargestellt.

diagram showing mismatched stream heights,

Das vorangehende Diagramm zeigt die folgenden Rechtecke:

  • Zielrechteck (target): { 0, 0, 150, 85 }
  • Primäres Video:
    • Quellrechteck: { 0, 0, 150, 50 }
    • Zielrechteck (destination): { 0, 17, 150, 67 }
  • Unterstream:
    • Quellrechteck: { 0, 0, 100, 85 }
    • Zielrechteck (destination): { 25, 0, 125, 85 }

Beispiel 4: Zielrechteck (target) kleiner als Zieloberfläche (destination)

Dieses Beispiel zeigt einen Fall, bei dem das Zielrechteck (target) kleiner als die Zieloberfläche (destination) ist.

diagram showing a blit to a destination rectangle.

Das vorangehende Diagramm zeigt die folgenden Rechtecke:

  • Zieloberfläche (destination): { 0, 0, 300, 200 }
  • Zielrechteck (target): { 0, 0, 150, 85 }
  • Primäres Video:
    • Quellrechteck: { 0, 0, 150, 50 }
    • Zielrechteck (destination): { 0, 17, 150, 67 }
  • Unterstream:
    • Quellrechteck: { 0, 0, 100, 85 }
    • Zielrechteck (destination): { 25, 0, 125, 85 }

Pixel außerhalb des Zielrechtecks (target) werden nicht geändert, sodass die Hintergrundfarbe nur innerhalb des Zielrechtecks (target) angezeigt wird. Der gepunktete Bereich gibt Teile der Zieloberfläche an, die nicht vom Blit betroffen sind.

Beispiel 5: Quellrechtecke

Wenn Sie ein Quellrechteck angeben, das kleiner als das Quellbild ist, blittet der Treiber nur diesen Teil des Bilds. In diesem Beispiel geben die Quellrechtecke den unteren rechten Quadranten des primären Videostreams und den unteren linken Quadranten des Unterstreams an (angegeben durch Hashmarkierungen im Diagramm). Die Zielrechtecke haben die gleichen Größen wie die Quellrechtecke, sodass das Video nicht gestreckt wird. Die Quell- und Zielrechtecke werden im folgenden Diagramm dargestellt.

diagram showing a blit from two source rectangles.

Das vorangehende Diagramm zeigt die folgenden Rechtecke:

  • Zielrechteck: { 0, 0, 720, 576 }
  • Primäres Video:
    • Quelloberflächengröße: { 0, 0, 720, 480 }
    • Quellrechteck: { 360, 240, 720, 480 }
    • Zielrechteck (destination): { 0, 0, 360, 240 }
  • Unterstream:
    • Quelloberflächengröße: { 0, 0, 640, 576 }
    • Quellrechteck: { 0, 288, 320, 576 }
    • Zielrechteck (destination): { 400, 0, 720, 288 }

Beispiel 6: Überschneiden der Zielrechtecke

Dieses Beispiel ähnelt dem vorherigen, aber die Zielrechtecke überschneiden sich. Die Oberflächenabmessungen entsprechen denen im vorherigen Beispiel, aber die Quell- und Zielrechtecke tun dies nicht. Auch hier wird das Video zugeschnitten, aber nicht gestreckt. Die Quell- und Zielrechtecke werden im folgenden Diagramm dargestellt.

diagram showing intersecting destination rectangles.

Das vorangehende Diagramm zeigt die folgenden Rechtecke:

  • Zielrechteck: { 0, 0, 720, 576 }
  • Primäres Video:
    • Quelloberflächengröße: { 0, 0, 720, 480 }
    • Quellrechteck: { 260, 92, 720, 480 }
    • Zielrechteck: { 0, 0, 460, 388 }
  • Unterstream:
    • Quelloberflächengröße: { 0, 0, 640, 576 }
    • Quellrechteck: { 0, 0, 460, 388 }
    • Zielrechteck: { 260, 188, 720, 576 }

Beispiel 7: Strecken und Zuschneiden von Videos

In diesem Beispiel wird das Video gestreckt und zugeschnitten. Eine Region von 180 × 120 aus jedem Stream wird gestreckt, um einen Bereich von 360 × 240 im Zielrechteck (destination) abzudecken.

diagram showing stretching and cropping.

Das vorangehende Diagramm zeigt die folgenden Rechtecke:

  • Zielrechteck: { 0, 0, 720, 480 }
  • Primäres Video:
    • Quelloberflächengröße: { 0, 0, 360, 240 }
    • Quellrechteck: { 180, 120, 360, 240 }
    • Zielrechteck (destination): { 0, 0, 360, 240 }
  • Unterstream:
    • Quelloberflächengröße: { 0, 0, 360, 240 }
    • Quellrechteck: { 0, 0, 180, 120 }
    • Zielrechteck (destination): { 360, 240, 720, 480 }

Eingabebeispielreihenfolge

Der pSamples-Parameter der VideoProcessBlt-Methode ist ein Zeiger auf ein Array von Eingabebeispielen. Beispiele aus dem primären Videostream werden zuerst angezeigt, gefolgt von Unterstreambildern in Z-Reihenfolge. Beispiele müssen in der folgenden Reihenfolge in das Array eingefügt werden:

  • Beispiele für den primären Videostream werden zuerst in zeitlicher Reihenfolge im Array angezeigt. Je nach Deinterlacing-Modus erfordert der Treiber möglicherweise ein oder mehrere Referenzbeispiele aus dem primären Videostream. Die Elemente NumForwardRefSamples und NumBackwardRefSamples der DXVA2_VideoProcessorCaps-Struktur geben an, wie viele Vorwärts- und Rückwärtsreferenzbeispiele erforderlich sind. Der Aufrufer muss diese Referenzbeispiele bereitstellen, auch wenn der Videoinhalt progressiv ist und kein Deinterlacing erfordert. (Dies kann auftreten, wenn progressive Frames einem Deinterlacing-Gerät zugewiesen werden, z. B. wenn die Quelle eine Mischung aus interlaced und progressiven Frames enthält.)
  • Nach den Beispielen für den primären Videostream kann das Array bis zu 15 Unterstreambeispiele enthalten, die in Z-Reihenfolge angeordnet sind, von unten nach oben. Unterstreams sind immer progressiv und erfordern keine Referenzbilder.

Der primäre Videostream kann jederzeit zwischen Interlaced- und progressiven Inhalten wechseln, und die Anzahl der Unterstreams kann sich ändern.

Das SampleFormat.SampleFormat-Element der DXVA2_VideoSample-Struktur lässt auf die Art von Bild schließen. Legen Sie für Unterstreambilder diesen Wert auf DXVA2_SampleUnterstream fest. Bei progressiven Bildern lautet der Wert DXVA2_SampleProgressiveFrame. Bei interlaced Bildern hängt der Wert vom Feldlayout ab.

Wenn der Treiber Vorwärts- und Rückwärtsverweisbeispiele erfordert, ist die vollständige Anzahl von Beispielen möglicherweise zu Beginn der Videosequenz nicht verfügbar. Schließen Sie in diesem Fall Einträge für sie in das pSamples-Array ein, markieren Sie jedoch die fehlenden Beispiele als Typ DXVA2_SampleUnknown.

Die Elemente Start und Ende der DXVA2_VideoSample-Struktur geben die zeitliche Position der einzelnen Beispiele an. Diese Werte werden nur für Beispiele aus dem primären Videostream verwendet. Legen Sie für Unterstreambilder beide Elemente auf Null fest.

Die folgenden Beispiele können dazu beitragen, diese Anforderungen zu klären.

Beispiel 1

Der einfachste Fall tritt auf, wenn keine Unterstreams vorhanden sind und der Deinterlacing-Algorithmus keine Referenzbeispiele erfordert (NumForwardRefSamples und NumBackwardRefSamples sind beide Null). Bob-Deinterlacing ist ein Beispiel für einen solchen Algorithmus. In diesem Fall sollte das pSamples-Array eine einzelne Eingabeoberfläche enthalten, wie in der folgenden Tabelle gezeigt.

Index Oberflächentyp Zeitliche Position
pSamples[0] Interlaced Bild. T

 

Der Zeitwert T wird als Startzeit des aktuellen Videoframes angenommen.

Beispiel 2

In diesem Beispiel kombiniert die Anwendung zwei Unterstreams mit dem primären Stream. Der Deinterlacingalgorithmus erfordert keine Referenzbeispiele. Die folgende Tabelle zeigt, wie diese Beispiele im pSamples-Array angeordnet sind.

Index Oberflächentyp Zeitliche Position Z-Reihenfolge
pSamples[0] Interlaced Bild T 0
pSamples[1] Unterstream 0 1
pSamples[2] Unterstream 0 2

 

Beispiel 3

Angenommen, der Deinterlacingalgorithmus erfordert ein Rückwärtsverweisbeispiel und ein Vorwärtsverweisbeispiel. Darüber hinaus werden zwei Unterstreambilder für insgesamt fünf Oberflächen bereitgestellt. Die richtige Reihenfolge wird in der folgenden Tabelle gezeigt.

Index Oberflächentyp Zeitliche Position Z-Reihenfolge
pSamples[0] Interlaced Bild (Verweis) T −1 Nicht zutreffend
pSamples[1] Interlaced Bild T 0
pSamples[2] Interlaced Bild (Verweis) T +1 Nicht zutreffend
pSamples[3] Unterstream 0 1
pSamples[4] Unterstream 0 2

 

Die Zeit T −1 ist die Startzeit des Frames vor dem aktuellen Frame, und T +1 ist die Startzeit des folgenden Frames.

Wenn der Videostream zu progressiven Inhalten wechselt, muss die Anwendung denselben Deinterlacing-Modus verwenden, wie in der folgenden Tabelle dargestellt.

Index Oberflächentyp Zeitliche Position Z-Reihenfolge
pSamples[0] Progressive Grafik (Referenz) T −1 Nicht zutreffend
pSamples[1] Progressives Bild T 0
pSamples[2] Progressive Grafik (Referenz) T +1 Nicht zutreffend
pSamples[3] Unterstream 0 1
pSamples[4] Unterstream 0 2

 

Beispiel 4

Zu Beginn einer Videosequenz stehen möglicherweise keine Vorwärts- und Rückwärtsreferenzbeispiele zur Verfügung. In diesem Fall sind Einträge für die fehlenden Beispiele im pSamples-Array enthalten, wobei der Beispieltyp DXVA2_SampleUnknown lautet.

Vorausgesetzt, der Deinterlacing-Modus benötigt ein Vorwärts- und ein Rückwärtsverweisbeispiel, würden die ersten drei Aufrufe von VideoProcessBlt die Sequenzen der Eingaben in den folgenden drei Tabellen aufweisen.

Index Oberflächentyp Zeitliche Position
pSamples[0] Unbekannt 0
pSamples[1] Unbekannt 0
pSamples[2] Interlaced Bild (Verweis) T +1

 

Index Oberflächentyp Zeitliche Position
pSamples[0] Unbekannt 0
pSamples[1] Interlaced Bild T
pSamples[2] Interlaced Bild (Verweis) T +1

 

Index Oberflächentyp Zeitliche Position
pSamples[0] Interlaced Bild T −1
pSamples[1] Interlaced Bild T
pSamples[2] Interlaced Bild (Verweis) T +1

 

DirectX Video Acceleration 2.0

Beispiel für DXVA2_VideoProc