DXVA-Videoverarbeitung
DXVA-Videoverarbeitung kapselt die Funktionen der Grafikhardware, die für die Verarbeitung nicht komprimierter Videobilder verwendet werden. Videoverarbeitungsdienste umfassen Deinterlacing und Videomischung.
Dieses Thema enthält folgende Abschnitte:
- Übersicht
- Erstellen eines Videoverarbeitungsgeräts
- Video Process Blit
- Bildkomposition
- Reihenfolge der Eingabebeispiele
- Zugehörige Themen
Übersicht
Grafikhardware kann die Grafikprozessor (GRAPHICS Processing Unit, GPU) verwenden, um nicht komprimierte Videobilder zu verarbeiten. Ein Videoverarbeitungsgerät ist eine Softwarekomponente, die diese Funktionen kapselt. Anwendungen können ein Videoverarbeitungsgerät verwenden, um Funktionen wie die folgenden auszuführen:
- Deinterlacing und inverse Telecine
- Mischen von Videounterstreams in das Hauptvideobild
- Farbanpassung (ProcAmp) und Bildfilterung
- Bildskalierung
- Farbraumkonvertierung
- Alphablending
Das folgende Diagramm zeigt die Phasen in der Videoverarbeitungspipeline. Das Diagramm ist nicht dafür gedacht, eine tatsächliche Implementierung zu zeigen. Beispielsweise kann der Grafiktreiber mehrere Phasen zu einem einzelnen 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 vom Treiber möglicherweise nicht unterstützt.

Die Eingabe für 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 nicht transparent, ohne Alphadaten pro Pixel. Der primäre Videostream kann progressiv oder interlaced sein.
Optional kann die Videoverarbeitungspipeline bis zu 15 Videounterstreams empfangen. Ein Unterstream enthält zusätzliche Bilddaten, z. B. Untertitel oder DVD-Unterbilder. Diese Bilder werden über den primären Videostream angezeigt und sind in der Regel nicht dafür gedacht, selbst angezeigt zu werden. Unterstreambilder können Alphadaten pro Pixel enthalten und sind immer progressive Frames. Das Videoverarbeitungsgerät kombiniert die Unterstreambilder mit dem aktuellen Deinterlaced-Frame aus dem primären Videostream.
Im restlichen Teil dieses Themas wird der Begriff Bild für die Eingabedaten auf einem Videoverarbeitungsgerät verwendet. Ein Bild kann aus einem progressiven Rahmen, einem einzelnen Feld oder zwei übereinander verwebten Feldern bestehen. Die Ausgabe ist immer ein Deinter verschachtelter Frame.
Ein Videotreiber kann mehrere Videoverarbeitungsgeräte implementieren, um verschiedene Sätze von Videoverarbeitungsfunktionen zu bieten. Geräte werden durch GUID identifiziert. Die folgenden GUIDs sind vordefiniert:
- DXVA2 _ VideoProcBobDevice. Dieses Gerät führt bob deinterlacing aus.
- DXVA2 _ VideoProcProgressiveDevice. Dieses Gerät wird verwendet, wenn das Video nur progressive Frames ohne Interlacingframes enthält. (Einige Videoinhalte enthalten eine Mischung aus progressiven und Interlaced-Frames. Das progressive Gerät kann nicht für diese Art von "gemischtem" Videoinhalt verwendet werden, da für die Zwischenrahmen ein Deinterlacingschritt 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 könnte z. B. einen proprietären Deinterlacingalgorithmus implementieren, der eine bessere Qualitätsausgabe erzeugt als bob deinterlacing. Einige Deinterlacingalgorithmen erfordern möglicherweise Vorwärts- oder Rückwärtsverweisbilder aus dem primären Stream. Wenn dies der Fall ist, muss der Aufrufer diese Bilder dem Treiber in der richtigen Reihenfolge bereitstellen, wie weiter unten in diesem Abschnitt beschrieben.
Ein Referenzsoftwaregerät wird ebenfalls bereitgestellt. Das Softwaregerät ist für Qualität und nicht für Geschwindigkeit optimiert und ist möglicherweise nicht für die Videoverarbeitung in Echtzeit 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. Im Folgenden finden Sie eine kurze Übersicht über die Schritte, die im weiteren Verlauf dieses Abschnitts ausführlicher erläutert werden:
- Sie erhalten einen Zeiger auf die IDirectXVideoProcessorService-Schnittstelle.
- Erstellen Sie eine Beschreibung des Videoformats für den primären Videostream. Verwenden Sie diese Beschreibung, um eine Liste der Videoverarbeitungsgeräte zu erhalten, die das Videoformat unterstützen. Geräte werden durch GUID identifiziert.
- Für ein bestimmtes Gerät erhalten Sie eine Liste der vom Gerät unterstützten Renderzielformate. Die Formate werden als Liste von D3DFORMAT-Werten zurückgegeben. Wenn Sie substreams mischen möchten, erhalten Sie auch eine Liste der unterstützten Unterstreamformate.
- Fragen Sie die Funktionen der einzelnen Geräte ab.
- Erstellen Sie das Videoverarbeitungsgerät.
Manchmal können Sie einige dieser Schritte weglassen. Anstatt beispielsweise die Liste der Renderzielformate zu erhalten, können Sie einfach versuchen, das Videoverarbeitungsgerät mit Ihrem bevorzugten Format zu erstellen und zu sehen, 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.
IDirectXVideoProcessorService-Zeiger
Die IDirectXVideoProcessorService-Schnittstelle wird vom Direct3D-Gerät erhalten. Es gibt zwei Möglichkeiten, einen Zeiger auf diese Schnittstelle zu erhalten:
- Über ein Direct3D-Gerät.
- Im Direct3D-Geräte-Manager.
Wenn Sie über einen Zeiger auf ein Direct3D-Gerät verfügen, können Sie einen IDirectXVideoProcessorService-Zeiger erhalten, indem Sie die DXVA2CreateVideoService-Funktion aufrufen. Übergeben Sie einen Zeiger auf 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 gibt es dann über die Direct3D-Geräte-Managerfür andere Objekte weiter. In dieser Situation 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;
}
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.
Stellen Sie sich eine Anwendung vor, die einen Videostream im YUY2-Format mit der BT.709-Definition der YUV-Farbe mit einer Bildfrequenz von 29,97 Frames pro Sekunde rendert. Angenommen, der Videoinhalt besteht vollständig aus progressiven Frames. 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 zugeordnet, sodass die Anwendung das Array durch Aufrufen von CoTaskMemFreefreigeben muss. Die verbleibenden Schritte können mit einer der geräte-GUIDs ausgeführt werden, die von dieser Methode zurückgegeben 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 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, in dem der Eingabetyp YUY2 lautet, 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 Unterstreamformate 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 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 auf.
// 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 IDirectXVideoProcessorService::CreateVideoProcessorauf, um das Videoverarbeitungsgerät zu erstellen. Die Eingabe für diese Methode ist die Geräte-GUID, die Formatbeschreibung, das Renderzielformat und die maximale Anzahl von Unterstreams, 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 für die Videoverarbeitung ist die Videoverarbeitung blit. (Ein Blit ist jeder Vorgang, bei dem zwei oder mehr Bitmaps zu einer einzelnen Bitmap kombiniert werden. Ein Videoverarbeitungs-Blit kombiniert Eingabebilder, um einen Ausgaberahmen zu erstellen.) Rufen Sie IDirectXVideoProcessor::VideoProcessBltauf, um eine Videoverarbeitungs-Blit durchzufü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 in eine Zieloberfläche geschrieben, die vom Aufrufer bereitgestellt wird.
Die VideoProcessBlt-Methode verwendet die folgenden Parameter:
- pRT zeigt auf eine IDirect3DSurface9-Renderzieloberfläche, die den verarbeiteten Videoframe empfängt.
- pBltParams zeigt 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 dies für den Deinterlacingalgorithmus erforderlich ist.
- Null oder mehr Substreambilder, bis zu maximal 15 Unterstreams.
Der Treiber erwartet, dass dieses Array in einer bestimmten Reihenfolge ist, wie unter Eingabebeispielreihenfolgebeschrieben.
Blit-Parameter
Die DXVA2 _ VideoProcessBltParams-Struktur enthält allgemeine Parameter für das BLIT. Die wichtigsten Parameter werden in den folgenden Membern der -Struktur gespeichert:
TargetFrame ist die Präsentationszeit des Ausgabeframes. Bei progressivem Inhalt muss diese Zeit der Startzeit für den aktuellen Frame aus dem primären Videostream entsprechen. Diese Zeit wird im Startmember der DXVA2 _ VideoSample-Struktur für dieses Eingabebeispiel angegeben.
Für Interlacinginhalt erzeugt ein Frame mit zwei überlappende Felder 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 z. B. 25 Frames pro Sekunde (50 Felder pro Sekunde) beträgt, weisen die Ausgabeframes die in der folgenden Tabelle gezeigten Zeitstempel 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 und nicht aus verschachtelten 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 in TargetRect geändert, und keine Pixel außerhalb von TargetRect werden geändert. Das Zielrechteck definiert das umgrenzende Rechteck für alle Eingabevideostreams. Die Platzierung einzelner Streams innerhalb dieses Rechtecks wird über den pSamples-Parameter von IDirectXVideoProcessor::VideoProcessBltgesteuert.
BackgroundColor gibt die Farbe des Hintergrunds an, wenn kein Videobild angezeigt wird. Wenn z. B. ein 16 x 9-Videobild innerhalb eines 4 x 3-Bereichs (Letterboxing) angezeigt wird, werden die Letterboxbereiche 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 die Farbe ITU-R BT.709 oder BT.601 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 zeigt 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 für das Deinterlacing verwendet wird.
- Ein Unterstreambild.
Die genaue Reihenfolge, in der die Beispiele im Array angezeigt werden müssen, wird weiter unten im Abschnitt Eingabebeispielreihenfolgebeschrieben.
Es können bis zu 15 Unterstreambilder bereitgestellt werden, obwohl die meisten Videoanwendungen höchstens einen Unterstream benötigen. Die Anzahl der Unterstreams kann sich bei jedem Aufruf von VideoProcessBltändern. Substreambilder werden durch Festlegen des SampleFormat.SampleFormat-Elements der DXVA2 _ VideoSample-Struktur auf DXVA2 _ SampleSubStream angegeben. Für den primären Videostream beschreibt dieser Member das 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 an. Legen Sie für Substreambilder diese Werte auf 0 (null) fest, da die Präsentationszeit immer aus dem primären Stream berechnet wird. Die Anwendung ist dafür verantwortlich, nachzuverfolgen, wann jedes Unterstreambild angezeigt und zum richtigen Zeitpunkt an VideoProcessBlt übermittelt werden soll.
Zwei Rechtecke definieren, wie das Quellvideo für jeden Stream positioniert wird:
- Der SrcRect-Member der DXVA2 _ VideoSample-Struktur gibt das Quellrechteck an, einen rechteckigen Bereich des Quellbilds, der im zusammengesetzten Ausgaberahmen angezeigt wird. Legen Sie zum Zuschneiden des Bilds einen Wert fest, der kleiner als die Framegröße ist. Legen Sie andernfalls auf die Framegröße fest.
- Der DstRect-Member der gleichen -Struktur gibt das Zielrechteck an, einen rechteckigen Bereich der Zieloberfläche, in dem der Videorahmen angezeigt wird.
Der Treiber blitt Pixel aus dem Quellrechteck in das Zielrechteck. Die beiden Rechtecke können unterschiedliche Größen oder Seitenverhältnisse aufweisen. Der Treiber skaliert das Image nach Bedarf. Darüber hinaus kann jeder Eingabestream einen anderen Skalierungsfaktor verwenden. Tatsächlich kann eine Skalierung erforderlich sein, um das richtige Seitenverhältnis im Ausgabeframe zu erzielen. Der Treiber berücksichtigt nicht das Pixel-Seitenverhältnis der Quelle. Wenn das Quellbild also nicht quadratische Pixel verwendet, liegt es an der Anwendung, das richtige Zielrechteck zu berechnen.
Die bevorzugten Unterstreamformate sind AYUV und AI44. Letzteres ist ein palettenisiertes Format mit 16 Farben. Paletteneinträge werden im Pal-Member der DXVA2 _ VideoSample-Struktur angegeben. (Wenn das Quellvideoformat ursprünglich als Media Foundation Medientyp ausgedrückt wird, werden die Paletteneinträge im MF _ MT _ PALETTE-Attribut gespeichert.) Löschen Sie dieses Array bei nicht palettenbasierten Formaten auf 0 (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 abgeschnitten.
- 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 Ziel- und Zielrechtecke werden relativ zur Zieloberfläche angegeben. Das Quellrechteck wird relativ zum Quellbild angegeben. Alle Rechtecke werden in Pixel angegeben.

Das Videoverarbeitungsgerät alpha kombiniert die Eingabebilder mit einer der folgenden Quellen von Alphadaten:
- Pixelbasierte Alphadaten aus Unterstreams.
- Ein planarer Alphawert für jeden Videostream, angegeben im PlanarAlpha-Element der DXVA2 _ VideoSample-Struktur.
- Der planare Alphawert des zusammengesetzten Bilds, angegeben im Alphamember der DXVA2 _ VideoProcessBltParams-Struktur. Dieser Wert wird verwendet, um das gesamte zusammengesetzte Bild mit der Hintergrundfarbe zu kombinieren.
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 in ein Letterboxing geschrieben wird, indem das Zielrechteck auf kleiner als das Zielrechteck festgelegt wird. Der primäre Videostream in diesem Beispiel ist ein 720-× 480-Bild 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. Der Einfachheit halber enthält dieses Beispiel keinen Unterstream. Das folgende Diagramm zeigt die Quell- und Zielrechtecke.

Das obige Diagramm zeigt die folgenden Rechtecke:
Zielrechteck: { 0, 0, 640, 480 }
Primäres Video:
- Quellrechteck: { 0, 0, 720, 480 }
- Zielrechteck: { 0, 60, 640, 420 }
Der Treiber deinterlaciert das Video, verkleinert den deinterlaced-Frame auf 640 × 360 und blitt 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 auszufüllen. Die Hintergrundfarbe wird in der DXVA2 _ VideoProcessBltParams-Struktur angegeben.
Beispiel 2: Strecken von Substreambildern
Substreambilder können über das primäre Videobild hinausgehen. Im DVD-Video kann der primäre Videostream beispielsweise 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 Unterstream soll mit einem Seitenverhältnis von 16:9 angezeigt werden. Um dieses Seitenverhältnis zu erreichen, wird das Substreambild horizontal gestreckt. Die Quell- und Zielrechtecke sind im folgenden Diagramm dargestellt.

Das obige Diagramm zeigt die folgenden Rechtecke:
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, werden sie alphageblendet. Wenn das Substreambild über das primäre Video hinausgeht, wird der Substream alphanicht mit der Hintergrundfarbe kombiniert. Diese Alphamischung ist für die geänderten Farben auf der rechten Seite des Diagramms vorgesehen.
Beispiel 3: Nicht übereinstimmende Streamhöhen
Im vorherigen Beispiel sind 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, in denen kein Video angezeigt wird, werden mithilfe der Hintergrundfarbe gezeichnet – schwarz in diesem Beispiel. Die Quell- und Zielrechtecke sind im folgenden Diagramm dargestellt.

Das obige Diagramm zeigt die folgenden Rechtecke:
- 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
Dieses Beispiel zeigt einen Fall, in dem das Zielrechteck kleiner als die Zieloberfläche ist.

Das obige Diagramm zeigt die folgenden Rechtecke:
- 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 vom Blit nicht betroffen sind.
Beispiel 5: Quellrechtecke
Wenn Sie ein Quellrechteck angeben, das kleiner als das Quellbild ist, blitt 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 (im Diagramm durch Hashzeichen gekennzeichnet). Die Zielrechtecke sind die gleichen Größen wie die Quellrechtecke, sodass das Video nicht gestreckt wird. Die Quell- und Zielrechtecke sind im folgenden Diagramm dargestellt.

Das obige Diagramm zeigt die folgenden Rechtecke:
- Zielrechteck: { 0, 0, 720, 576 }
- Primäres Video:
- Größe der Quelloberfläche: { 0, 0, 720, 480 }
- Quellrechteck: { 360, 240, 720, 480 }
- Zielrechteck: { 0, 0, 360, 240 }
- Unterdatenstrom:
- Größe der Quelloberfläche: { 0, 0, 640, 576 }
- Quellrechteck: { 0, 288, 320, 576 }
- Zielrechteck: { 400, 0, 720, 288 }
Beispiel 6: Überschneiden von Zielrechtecke
Dieses Beispiel ähnelt dem vorherigen Beispiel, aber die Zielrechtecke überschneiden sich. Die Oberflächendimensionen sind identisch mit im vorherigen Beispiel, die Quell- und Zielrechtecke jedoch nicht. Auch hier wird das Video zugeschnitten, aber nicht gestreckt. Die Quell- und Zielrechtecke sind im folgenden Diagramm dargestellt.

Das obige Diagramm zeigt die folgenden Rechtecke:
- Zielrechteck: { 0, 0, 720, 576 }
- Primäres Video:
- Größe der Quelloberfläche: { 0, 0, 720, 480 }
- Quellrechteck: { 260, 92, 720, 480 }
- Zielrechteck: { 0, 0, 460, 388 }
- Unterdatenstrom:
- Größe der Quelloberfläche: { 0, 0, 640, 576 }
- Quellrechteck: { 0, 0, 460, 388 }
- Zielrechteck: { 260, 188, 720, 576 }
Beispiel 7: Stretching und Zuschneiden von Videos
In diesem Beispiel wird das Video gestreckt und zugeschnitten. Ein 180 × 120-Bereich aus jedem Stream wird gestreckt, um einen Bereich von 360 × 240 im Zielrechteck zu abdecken.

Das obige Diagramm zeigt die folgenden Rechtecke:
- Zielrechteck: { 0, 0, 720, 480 }
- Primäres Video:
- Größe der Quelloberfläche: { 0, 0, 360, 240 }
- Quellrechteck: { 180, 120, 360, 240 }
- Zielrechteck: { 0, 0, 360, 240 }
- Unterdatenstrom:
- Größe der Quelloberfläche: { 0, 0, 360, 240 }
- Quellrechteck: { 0, 0, 180, 120 }
- Zielrechteck: { 360, 240, 720, 480 }
Reihenfolge der Eingabebeispiele
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 platziert werden:
- Beispiele für den primären Videostream werden zuerst im Array in temporaler Reihenfolge angezeigt. Je nach Deinterlace-Modus benötigt der Treiber möglicherweise mindestens ein Referenzbeispiel aus dem primären Videostream. Die Member NumForwardRefSamples und NumBackwardRefSamples der DXVA2 _ VideoProcessorCaps-Struktur geben an, wie viele Vorwärts- und Rückwärtsverweisbeispiele benötigt werden. Der Aufrufer muss diese Referenzbeispiele auch dann bereitstellen, wenn der Videoinhalt progressiv ist und keine Deinterlacing erforderlich ist. (Dies kann auftreten, wenn progressive Frames an ein Deinterlacinggerät gegeben werden, z. B. wenn die Quelle eine Mischung aus Interlacing und progressiven Frames enthält.)
- Nach den Beispielen für den primären Videostream kann das Array bis zu 15 Substreambeispiele enthalten, die in Z-Reihenfolge von unten nach oben angeordnet sind. Unterstreams sind immer progressiv und erfordern keine Referenzbilder.
Der primäre Videostream kann jederzeit zwischen Interlacing und progressivem Inhalt wechseln, und die Anzahl der Unterstreams kann sich ändern.
Der SampleFormat.SampleFormat-Member 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 Zwischenbildern hängt der Wert vom Feldlayout ab.
Wenn der Treiber Vorwärts- und Rückwärtsreferenzbeispiele erfordert, ist die vollständige Anzahl von Beispielen zu Beginn der Videosequenz möglicherweise nicht verfügbar. Schließen Sie in diesem Fall Einträge für sie in das pSamples-Array ein, markieren Sie die fehlenden Beispiele jedoch als DXVA2 _ SampleUnknown.
Die Start- und End-Member der DXVA2 _ VideoSample-Struktur geben die temporale Position der einzelnen Stichproben an. Diese Werte werden nur für Beispiele aus dem primären Videostream verwendet. Legen Sie für Unterstreambilder beide Member auf 0 (null) fest.
Die folgenden Beispiele helfen möglicherweise, diese Anforderungen zu verdeutlichen.
Beispiel 1
Der einfachste Fall tritt auf, wenn es keine Unterstreams gibt und der Deinterlacingalgorithmus keine Verweisbeispiele 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 | Temporaler Speicherort |
|---|---|---|
| pSamples [ 0] | Verschachtelte Abbildung. | T |
Der Zeitwert T wird als Startzeit des aktuellen Videoframes angenommen.
Beispiel 2
In diesem Beispiel werden von der Anwendung zwei Unterstreams mit dem primären Stream gemischt. Der Deinterlacingalgorithmus erfordert keine Referenzbeispiele. Die folgende Tabelle zeigt, wie diese Beispiele im pSamples-Array angeordnet sind.
| Index | Oberflächentyp | Temporaler Speicherort | Z-Reihenfolge |
|---|---|---|---|
| pSamples [ 0] | Verschachtelte Abbildung | T | 0 |
| pSamples [ 1] | Unterdatenstrom | 0 | 1 |
| pSamples [ 2] | Unterdatenstrom | 0 | 2 |
Beispiel 3
Nehmen wir nun an, dass der Deinterlacingalgorithmus ein Beispiel für einen Rückwärtsverweis und ein Vorwärtsverweisbeispiel 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 | Oberflächentyp | Temporaler Speicherort | Z-Reihenfolge |
|---|---|---|---|
| pSamples [ 0] | Verschachtelte Abbildung (Referenz) | T –1 | Nicht zutreffend |
| pSamples [ 1] | Verschachtelte Abbildung | T | 0 |
| pSamples [ 2] | Verschachtelte Abbildung (Referenz) | T +1 | Nicht zutreffend |
| 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 Videostream zu progressivem Inhalt wechselt und den gleichen Deinterlacingmodus verwendet, muss die Anwendung die gleiche Anzahl von Beispielen bereitstellen, wie in der folgenden Tabelle gezeigt.
| Index | Oberflächentyp | Temporaler Speicherort | Z-Reihenfolge |
|---|---|---|---|
| pSamples [ 0] | Progressives Bild (Referenz) | T –1 | Nicht zutreffend |
| pSamples [ 1] | Progressives Bild | T | 0 |
| pSamples [ 2] | Progressives Bild (Referenz) | T +1 | Nicht zutreffend |
| pSamples [ 3] | Unterdatenstrom | 0 | 1 |
| pSamples [ 4] | Unterdatenstrom | 0 | 2 |
Beispiel 4
Zu Beginn einer Videosequenz sind möglicherweise keine Vorwärts- und Rückwärtsverweisbeispiele verfügbar. In diesem Fall sind Einträge für die fehlenden Beispiele im pSamples-Array mit dem Beispieltyp DXVA2 _ SampleUnknown enthalten.
Unter der Annahme, dass der Deinterlacingmodus ein Vorwärts- und ein Rückwärtsverweisbeispiel benötigt, verfügen die ersten drei Aufrufe von VideoProcessBlt über die in den folgenden drei Tabellen gezeigten Eingabesequenzen.
| Index | Oberflächentyp | Temporaler Speicherort |
|---|---|---|
| pSamples [ 0] | Unbekannt | 0 |
| pSamples [ 1] | Unbekannt | 0 |
| pSamples [ 2] | Verschachtelte Abbildung (Referenz) | T +1 |
| Index | Oberflächentyp | Temporaler Speicherort |
|---|---|---|
| pSamples [ 0] | Unbekannt | 0 |
| pSamples [ 1] | Verschachtelte Abbildung | T |
| pSamples [ 2] | Verschachtelte Abbildung (Referenz) | T +1 |
| Index | Oberflächentyp | Temporaler Speicherort |
|---|---|---|
| pSamples [ 0] | Verschachtelte Abbildung | T –1 |
| pSamples [ 1] | Verschachtelte Abbildung | T |
| pSamples [ 2] | Verschachtelte Abbildung (Referenz) | T +1 |