DXVA Videoverarbeitung

DXVA-Videoverarbeitung kapselt die Funktionen der Grafikhardware, die der Verarbeitung nicht komprimierter Videobilder gewidmet ist. Videoverarbeitungsdienste umfassen Deinterlacing und Videomischung.

Dieses Thema enthält folgende Abschnitte:

Übersicht

Grafikhardware kann die Grafikverarbeitungseinheit (GPU) verwenden, um unkomprimierte Videobilder zu verarbeiten. Ein Videoverarbeitungsgerät ist eine Softwarekomponente, die diese Funktionen kapselt. Anwendungen können ein Videoverarbeitungsgerät verwenden, um Funktionen wie:

  • Deinterlacing und umgekehrtes Telecin
  • Mischen von Videounterstreams 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 anzeigen. Der Grafiktreiber kann z. B. mehrere Stufen in einen 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. Rauschen und Detailfilterung, werden möglicherweise vom Treiber 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 Framerate für das Ausgabevideo. Jeder Frame des Ausgabevideos wird relativ zu den Eingabedaten aus dem primären Videostream berechnet. Pixel im primären Datenstrom sind immer undurchsichtig, ohne Pixel-Alphadaten. Der primäre Videostream kann progressive oder interlaced sein.

Optional kann die Videoverarbeitungspipeline bis zu 15 Videounterstreams empfangen. Ein Unterstream enthält hilfsige Bilddaten, z. B. Untertitel oder DVD-Unterpictures. Diese Bilder werden über den primären Videostream angezeigt und sind in der Regel nicht für sich selbst sichtbar. Substreambilder können Pro-Pixel-Alphadaten enthalten und sind immer progressive Frames. Das Videoverarbeitungsgerät blendet die Substreambilder mit dem aktuellen deinterlaced Frame aus dem primären Videostream zusammen.

Im Übrigen dieses Themas wird der Begriffsbild für die Eingabedaten auf ein Videoverarbeitungsgerät verwendet. Ein Bild kann aus einem progressiven Rahmen, einem einzelnen Feld oder zwei interleavierten Feldern bestehen. Die Ausgabe ist immer ein deinterlaced Frame.

Ein Videotreiber kann mehrere Videoverarbeitungsgeräte implementieren, um verschiedene Sätze von Videoverarbeitungsfunktionen bereitzustellen. Geräte werden durch GUID identifiziert. Die folgenden GUIDs sind vordefinierte:

  • DXVA2_VideoProcBobDevice. Dieses Gerät führt bob deinterlacing aus.
  • DXVA2_VideoProcProgressiveDevice. Dieses Gerät wird verwendet, wenn das Video nur progressive Frames enthält, ohne interlaced Frames. (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 ein Deinterlacing-Schritt für die interlaced Frames 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. Ein Treiber kann z. B. 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 Datenstrom. Falls ja, muss der Aufrufer diese Bilder dem Treiber in der richtigen Sequenz bereitstellen, wie weiter unten in diesem Abschnitt beschrieben.

Außerdem wird ein Referenzsoftwaregerät bereitgestellt. Das Softwaregerät ist für Qualität und nicht für Geschwindigkeit optimiert und ist möglicherweise nicht für die Echtzeit-Videoverarbeitung geeignet. 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. Nachfolgend finden Sie eine kurze Gliederung der Schritte, die im weiteren Verlauf 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 Videodatenstrom. 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 der D3DFORMAT-Werte zurückgegeben. Wenn Sie Substreams kombinieren möchten, rufen Sie auch eine Liste der unterstützten Substreamformate ab.
  4. Abfragen der Funktionen jedes Geräts.
  5. Erstellen Sie das Videoverarbeitungsgerät.

Manchmal können Sie einige dieser Schritte auslassen. Anstatt beispielsweise die Liste der Renderzielformate zu erhalten, 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.

Der Rest dieses Abschnitts beschreibt diese Schritte ausführlich.

Abrufen des IDirectXVideoProcessorService Pointer

Die IDirectXVideoProcessorService-Schnittstelle wird vom Direct3D-Gerät abgerufen. Es gibt zwei Möglichkeiten, 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 mit anderen Objekten über die Direct3D-Geräte-Manager. In dieser Situation können Sie IDirect3DDeviceManager9::GetVideoService auf dem 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;
}

Aufzählen der Videoverarbeitungsgeräte

Um eine Liste der Videoverarbeitungsgeräte 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, indem Sie die BT.709-Definition von YUV-Farben verwenden, wobei die Framerate von 29,97 Frames pro Sekunde beträgt. 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 wird aus dem DXVA2_VideoProc SDK-Beispiel entnommen.

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.

Aufzählen von Render-Target Formaten

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 dargestellt:

    // 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 von Formaten 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 Substreamformate abzurufen, übergeben Sie die Geräte-GUID, die Formatstruktur und das Renderzielformat an die IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats-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 Substreamformate 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 Strukturstruktur 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 dieser Methode ist die Geräte-GUID, die Formatbeschreibung, das Renderzielformat und die maximale Anzahl von Teilstreams, die Sie mischen 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 Hauptvorgang der Videoverarbeitung ist der Lit der Videoverarbeitung. (Ein Blit ist ein beliebiger Vorgang, der zwei oder mehr Bitmaps in eine einzelne Bitmap kombiniert. Ein Videoverarbeitungsblit kombiniert Eingabebilder zum Erstellen eines Ausgabeframes.) Rufen Sie IDirectXVideoProcessor::VideoProcessBlt auf, um eine Videoverarbeitungsfunktion auszuführen. Diese Methode übergibt eine Reihe von Videobeispielen an das Videoverarbeitungsgerät. Als Reaktion verarbeitet das Videoverarbeitungsgerät die Eingabebilder und generiert einen Ausgaberahmen. Die Verarbeitung kann Deinterlacing, Farbraumkonvertierung und Substreammischung 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 Reservierte 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 erforderlich durch den Deinterlacingalgorithmus.
  • Null oder mehr Substreambilder bis zu maximal 15 Teilstreams.

Der Treiber erwartet, dass dieses Array in einer bestimmten Reihenfolge angezeigt wird, 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. Für progressive Inhalte muss diese Zeit der Startzeit für den aktuellen Frame aus dem primären Videostream entsprechen. Dieses Mal wird im Startelement der DXVA2_VideoSample Struktur für dieses Eingabebeispiel angegeben.

    Bei Interlaced-Inhalten erzeugt ein Frame mit zwei interleavierten Feldern zwei deinterlacierte Ausgabeframes. Im ersten Ausgabeframe muss die Präsentationszeit der Startzeit des aktuellen Bilds im primären Videostream genauso wie progressive Inhalte entsprechen. Im zweiten Ausgabeframe muss die Startzeit zwischen der Startzeit des aktuellen Bilds im primären Videostream und der Startzeit des nächsten Bilds im Datenstrom gleich sein. Wenn das Eingabevideo beispielsweise 25 Frames pro Sekunde ist (50 Felder pro Sekunde), weist die Ausgabeframes die Zeitstempel in der folgenden Tabelle auf. Zeitstempel werden in Einheiten von 100 Nanosekunden angezeigt.

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

     

    Wenn interlaced-Inhalt aus einzelnen Feldern besteht und nicht aus interleavierten Feldern besteht, stimmen die Ausgabezeiten immer mit den Eingabezeiten überein, wie bei progressivem Inhalt.

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

  • BackgroundColor gibt die Farbe des Hintergrunds, wo immer kein Videobild angezeigt wird. Wenn beispielsweise ein 16 x 9-Videobild innerhalb eines 4 x 3-Bereichs (Letterboxing) angezeigt wird, werden die Briefkastenbereiche 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".

Weitere 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 einem Zeiger auf die Direct3D-Oberfläche, die das Beispiel enthält. Jedes Beispiel ist eine der folgenden:

  • Das aktuelle Bild aus dem primären Datenstrom.
  • Ein Vorwärts- oder Rückwärtsverweisbild aus dem primären Datenstrom, das für die Deinterlacing verwendet wird.
  • Ein Teilstreambild.

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 nur einen Teilstream benötigen. Die Anzahl der Teilstreams kann sich bei jedem Aufruf von VideoProcessBlt ändern. Substreambilder werden durch Festlegen des SampleFormat.SampleFormat-Members der DXVA2_VideoSample Struktur auf DXVA2_SampleSubStream angegeben. Für den primären Videostream beschreibt dieses Element die Interlacing des Eingabevideos. Weitere Informationen finden Sie unter DXVA2_SampleFormat Enumeration.

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

Zwei Rechtecks 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, das im zusammengesetzten Ausgaberahmen angezeigt wird. Wenn Sie das Bild zuschneiden möchten, legen Sie diesen Wert auf einen Wert fest, der kleiner als die Framegröße ist. Andernfalls legen Sie ihn gleich der Framegröße fest.
  • Das DstRect-Element derselben Struktur gibt das Zielrechteck an, einen rechteckigen Bereich der Zieloberfläche, in der der Videorahmen angezeigt wird.

Der Treiber blit Pixel aus dem Quellrechteck in das Zielrechteck. Die beiden Rechtecks können verschiedene Größen oder Seitenverhältnisse aufweisen; der Treiber skaliert das Bild nach Bedarf. Darüber hinaus kann jeder Eingabestrom einen anderen Skalierungsfaktor verwenden. Tatsächlich kann die Skalierung erforderlich sein, um das richtige Seitenverhältnis im Ausgaberahmen zu erzeugen. Der Treiber berücksichtigt nicht das Pixelverhältnis der Quelle, sodass das Quellbild nicht quadratische Pixel verwendet, ist es bis zur Anwendung erforderlich, um das richtige Zielrechteck zu berechnen.

Die bevorzugten Substreamformate sind AYUV und AI44. Letzteres ist ein palettenisiertes Format mit 16 Farben. Paletteneinträge werden im Pal-Element der DXVA2_VideoSample Struktur angegeben. (Wenn Ihr Quellvideoformat ursprünglich als Media Foundation-Medientyp ausgedrückt wird, werden die Paletteneinträge im MF_MT_PALETTE-Attribut gespeichert.) Für nicht palettenisierte Formate löschen Sie dieses Array auf Null.

Bildkomposition

Jeder blit-Vorgang wird durch die folgenden drei Rechtecks definiert:

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

Die Ziel- und Zielrechtecks werden relativ zur Zieloberfläche angegeben. Das Quellrechteck wird relativ zum Quellbild angegeben. Alle Rechtecks werden in Pixeln angegeben.

diagram showing source, destination, and target rectangles

Das Videoverarbeitungsgerät alpha blendet die Eingabebilder mit einer der folgenden Quellen von Alphadaten aus:

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

In diesem Abschnitt finden Sie eine Reihe von Beispielen, die zeigen, wie das Videoverarbeitungsgerät das Ausgabebild erstellt.

Beispiel 1: Briefboxing

In diesem Beispiel wird gezeigt, wie Sie das Quellbild schreiben, indem Sie das Zielrechteck festlegen, das kleiner als das Zielrechteck ist. Der primäre Videostream in diesem Beispiel ist ein 720 × 480 Bild und soll bei 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. Dieses Beispiel enthält keine Unterstreams. Das folgende Diagramm zeigt die Quell- und Zielrechtecke.

diagram showing letterboxing.

Das vorherige Diagramm zeigt die folgenden Rechtecks:

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

  • Primäres Video:

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

Der Treiber deinterlace das Video, verkleinern den deinterlacierten Frame auf 640 × 360, und blit den Frame in das Zielrechteck. Das Zielrechteck ist größer als das Zielrechteck, sodass der Treiber die Hintergrundfarbe verwendet, um die horizontalen Balken oberhalb und unterhalb des Rahmens zu füllen. Die Hintergrundfarbe wird in der DXVA2_VideoProcessBltParams Struktur angegeben.

Beispiel 2: Dehnen von Substream-Bildern

Substream-Bilder können über das primäre Videobild hinaus erweitert werden. 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 Quelldimensionen (720 × 480), aber der Unterstrom soll bei einem Seitenverhältnis von 16:9 angezeigt werden. Um dieses Seitenverhältnis zu erreichen, wird das Unterstreambild horizontal gestreckt. Die Quell- und Zielrechtecks werden im folgenden Diagramm angezeigt.

diagram showing substream image stretching.

Das vorherige Diagramm zeigt die folgenden Rechtecks:

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

  • Primäres Video:

    • Quellrechteck: { 0, 0, 720, 480 }
    • Zielrechteck: { 0, 107, 474, 480 }
  • Unterdatenstrom:

    • Quellrechteck: { 0, 0, 720, 480 }
    • Zielrechteck: { 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, sind sie alpha blendet. Wenn das Substream-Bild über das Primay-Video hinaus ausgeführt wird, wird der Unterstream mit der Hintergrundfarbe gemischt. Mit dieser Alpha-Blendung werden die geänderten Farben auf der rechten Seite des Diagramms dargestellt.

Beispiel 3: Übereinstimmende Streamhöhen

Im vorherigen Beispiel sind der Unterstrom und der primäre Datenstrom dieselbe Höhe. Streams kann auch nicht übereinstimmende Höhen aufweisen, wie in diesem Beispiel gezeigt. Bereiche innerhalb des Zielrechtecks, in dem kein Video angezeigt wird, werden mithilfe der Hintergrundfarbe gezeichnet – schwarz in diesem Beispiel. Die Quell- und Zielrechtecks werden im folgenden Diagramm angezeigt.

diagram showing mismatched stream heights,

Das vorherige Diagramm zeigt die folgenden Rechtecks:

  • Zielrechteck: { 0, 0, 150, 85 }
  • Primäres Video:
    • Quellrechteck: { 0, 0, 150, 50 }
    • Zielrechteck: { 0, 17, 150, 67 }
  • Unterdatenstrom:
    • Quellrechteck: { 0, 0, 100, 85 }
    • Zielrechteck: { 25, 0, 125, 85 }

Beispiel 4: Zielrechteck kleiner als Zieloberfläche

In diesem Beispiel wird ein Fall gezeigt, in dem das Zielrechteck kleiner als die Zieloberfläche ist.

diagram showing a blit to a destination rectangle.

Das vorherige Diagramm zeigt die folgenden Rechtecks:

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

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

Beispiel 5: Quellrechtecks

Wenn Sie ein Quellrechteck angeben, das kleiner als das Quellbild ist, wird der Treiber nur diesen Teil des Bilds einblitzen. In diesem Beispiel geben die Quellrechtecks den unteren rechten Quadrant des primären Videostroms und den unteren linken Quadranten des Unterstroms an (angegeben durch Hashmarkierungen im Diagramm). Die Zielrechtecks sind die gleichen Größen wie die Quellrechtecks, sodass das Video nicht gestreckt wird. Die Quell- und Zielrechtecks werden im folgenden Diagramm angezeigt.

diagram showing a blit from two source rectangles.

Das vorherige Diagramm zeigt die folgenden Rechtecks:

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

Beispiel 6: Durchschneiden von Zielrechtecks

Dieses Beispiel ähnelt dem vorherigen, aber das Zielrechteck überschneidet sich. Die Oberflächenabmessungen sind identisch mit dem vorherigen Beispiel, aber die Quell- und Zielrechtecke sind nicht vorhanden. Erneut wird das Video zugeschnitten, aber nicht gestreckt. Die Quell- und Zielrechtecke werden im folgenden Diagramm angezeigt.

diagram showing intersecting destination rectangles.

Das vorherige 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 }
  • Unterdatenstrom:
    • Quelloberflächengröße: { 0, 0, 640, 576 }
    • Quellrechteck: { 0, 0, 460, 388 }
    • Zielrechteck: { 260, 188, 720, 576 }

Beispiel 7: Video zum Strecken und Zuschneiden

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

diagram showing stretching and cropping.

Das vorherige 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: { 0, 0, 360, 240 }
  • Unterdatenstrom:
    • Quelloberflächengröße: { 0, 0, 360, 240 }
    • Quellrechteck: { 0, 0, 180, 120 }
    • Zielrechteck: { 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 Substreambildern 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 im Array in zeitlicher Reihenfolge angezeigt. Je nach Deinterlacemodus erfordert der Treiber möglicherweise ein oder mehrere Referenzbeispiele aus dem primären Videostream. Die Member "NumForwardRefSamples " und "NumBackwardRefSamples " der DXVA2_VideoProcessorCaps Struktur geben an, wie viele Vorwärts- und Rückwärtsreferenzbeispiele benötigt werden. Der Aufrufer muss diese Referenzbeispiele bereitstellen, auch wenn der Videoinhalt progressiver ist und keine Deinterlacing erforderlich ist. (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 Teilstreambeispiele enthalten, die in Z-Reihenfolge angeordnet sind, von unten nach oben. Unterstreams sind immer progressive und erfordern keine Referenzbilder.

Jederzeit kann der primäre Videostream zwischen interlaced- und progressiven Inhalten wechseln, und die Anzahl der Teilstreams kann sich ändern.

Das SampleFormat.SampleFormat-Element der DXVA2_VideoSample Struktur gibt den Bildtyp an. Legen Sie für Unterstreambilder diesen Wert auf DXVA2_SampleSubStream fest. Bei progressiven Bildern ist 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 nicht am Anfang der Videosequenz verfügbar. Fügen 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 jedes Beispiels. 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 Teilstreams vorhanden sind und der Deinterlacingalgorithmus 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 dargestellt.

Index Surface-Typ Zeitliche Position
pSamples[0] Interlaced picture. T

 

Der Zeitwert T wird als Startzeit des aktuellen Videoframes angenommen.

Beispiel 2

In diesem Beispiel mischt die Anwendung zwei Teilstreams mit dem primären Datenstrom. Der Deinterlacing-Algorithmus erfordert keine Referenzbeispiele. In der folgenden Tabelle wird gezeigt, wie diese Beispiele im pSamples-Array angeordnet werden.

Index Surface-Typ Zeitliche Position Z-Reihenfolge
pSamples[0] Interlaced picture T 0
pSamples[1] Unterdatenstrom 0 1
pSamples[2] Unterdatenstrom 0 2

 

Beispiel 3

Nehmen wir nun an, dass der Deinterlacingalgorithmus ein Abwärtsreferenzbeispiel und ein Vorwärtsreferenzbeispiel erfordert. Darüber hinaus werden zwei Unterstreambilder für insgesamt fünf Oberflächen bereitgestellt. Die richtige Reihenfolge wird in der folgenden Tabelle angezeigt.

Index Surface-Typ Zeitliche Position Z-Reihenfolge
pSamples[0] Interlaced picture (Reference) T −1 Nicht verfügbar
pSamples[1] Interlaced picture T 0
pSamples[2] Interlaced picture (Reference) T +1 Nicht verfügbar
pSamples[3] Unterdatenstrom 0 1
pSamples[4] Unterdatenstrom 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 Videodatenstrom zu progressiven Inhalten wechselt, muss die Anwendung dieselbe Anzahl von Beispielen bereitstellen, wie in der folgenden Tabelle dargestellt.

Index Surface-Typ Zeitliche Position Z-Reihenfolge
pSamples[0] Progressives Bild (Referenz) T −1 Nicht verfügbar
pSamples[1] Progressives Bild T 0
pSamples[2] Progressives Bild (Referenz) T +1 Nicht verfügbar
pSamples[3] Unterdatenstrom 0 1
pSamples[4] Unterdatenstrom 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.

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

Index Surface-Typ Zeitliche Position
pSamples[0] Unbekannt 0
pSamples[1] Unbekannt 0
pSamples[2] Interlaced picture (Reference) T +1

 

Index Surface-Typ Zeitliche Position
pSamples[0] Unbekannt 0
pSamples[1] Interlaced picture T
pSamples[2] Interlaced picture (Reference) T +1

 

Index Surface-Typ Zeitliche Position
pSamples[0] Interlaced picture T −1
pSamples[1] Interlaced picture T
pSamples[2] Interlaced picture (Reference) T +1

 

DirectX VideoBeschleunigung 2.0

DXVA2_VideoProc Beispiel