Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die DXVA-Videoverarbeitung kapselt die Funktionen der Grafikhardware, die der Verarbeitung nicht komprimierter Videobilder gewidmet sind. Videoverarbeitungsdienste umfassen Deinterlacing und Videomixing.
Dieses Thema enthält die folgenden Abschnitte:
- Übersicht
- Erstellen eines Videoverarbeitungsgeräts
- Videoprozess Blit
- Bildkomposition
- Eingabebeispielreihenfolge
- Verwandte Themen
Überblick
Grafikhardware kann die Grafikverarbeitungseinheit (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:
- Deinterlacing und umgekehrtes Telecin
- Mischen von Videounterstreams auf das Hauptvideobild
- Farbanpassung (ProcAmp) und Bildfilterung
- Bildskalierung
- Farbraumkonvertierung
- Alphamischung
Das folgende Diagramm zeigt die Phasen in der Videoverarbeitungspipeline. Das Diagramm soll keine tatsächliche Implementierung anzeigen. Beispielsweise kann der Grafiktreiber mehrere Stufen 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.
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 Datenstrom sind immer undurchsichtig, 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 Hilfsbilddaten, z. B. Untertitel oder DVD-Unterpictus. Diese Bilder werden über den primären Videostream angezeigt und sind in der Regel nicht für sich selbst vorgesehen. Substreambilder können Alphadaten pro Pixel enthalten und sind immer progressive Frames. Das Videoverarbeitungsgerät blendet die Substreambilder mit dem aktuellen deinterlaced Frame aus dem primären Videostream zusammen.
Im restlichen Teil dieses Themas wird das Begriffsbild für die Eingabedaten für ein Videoverarbeitungsgerät verwendet. Ein Bild kann aus einem progressiven Rahmen, 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 vordefinierte:
- 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 verketteten 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 Datenstrom. 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 restlichen Abschnitt ausführlicher erläutert werden:
- Rufen Sie einen Zeiger auf die IDirectXVideoProcessorService-Schnittstelle ab.
- 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.
- 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 Substreams kombinieren möchten, rufen Sie auch eine Liste der unterstützten Unterstreamformate ab.
- 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 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:
- Von einem Direct3D-Gerät aus.
- Aus dem Direct3D-Geräte-Manager.
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 den Direct3D-Geräte-Manager. 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 Frames 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.
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, 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::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 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 Teilstreams, 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 Lit-Videoverarbeitungsvorgang. (Ein Blit ist ein beliebiger Vorgang, der zwei oder mehr Bitmaps in 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 Substreammischen 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 erforderlich durch den Deinterlacingalgorithmus.
- 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. Dieses Mal wird im Startelement der DXVA2_VideoSample Struktur für dieses Eingabebeispiel angegeben.
Bei verketteten 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 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 Datenstrom entsprechen. Wenn das Eingabevideo beispielsweise 25 Frames pro Sekunde (50 Felder pro Sekunde) ist, 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 Datenströme 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 (Letterboxing) angezeigt wird, werden die Briefboxbereiche 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 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 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 Teilstream 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_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 an. Legen Sie für Unterstreambilder 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 präsentiert und zur richtigen Zeit an VideoProcessBlt übermittelt werden soll.
Zwei Rechtecke definieren, wie das Quellvideo für jeden Datenstrom 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 andernfalls gleich der Framegröße fest.
- Das DstRect-Element derselben Struktur gibt das Zielrechteck an, einen rechteckigen Bereich der Zieloberfläche, in der der Videoframe angezeigt wird.
Der Treiber blit Pixel 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 Eingabedatenstrom 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 Substreamformate 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 attribut MF_MT_PALETTE gespeichert.) Löschen Sie dieses Array bei nicht palettenisierten 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 Datenstrom (DstRect) definiert, wo der Eingabedatenstrom im zusammengesetzten Bild angezeigt wird.
- Das Quellrechteck für jeden Datenstrom (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 Pixeln angegeben.
Das Videoverarbeitungsgerät alpha blendet die Eingabebilder mit einer der folgenden Alphadatenquellen zusammen:
- Alphadaten pro Pixel aus Unterstreams.
- Ein planarer Alphawert für jeden Videodatenstrom, der im PlanarAlpha-Element der DXVA2_VideoSample-Struktur angegeben ist.
- Der planare 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 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 auf kleiner als das Zielrechteck 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.
Das vorangehende 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 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 über und unter dem Frame 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 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 Teilstreambild horizontal gestreckt. Die Quell- und Zielrechtecke werden im folgenden Diagramm dargestellt.
Das vorangehende 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 alphaniert. Wenn das Substream-Bild über das primäre Video hinausgeht, wird der Unterstream alphaniert mit der Hintergrundfarbe. Diese Alphamischung macht die geänderten Farben auf der rechten Seite des Diagramms aus.
Beispiel 3: Nicht übereinstimmende Streamhöhen
Im vorherigen Beispiel sind der Unterstream und der primäre Datenstrom die gleiche Höhe. Datenströme können auch nicht übereinstimmende Höhen aufweisen, wie in diesem Beispiel gezeigt. Bereiche innerhalb des Zielrechtecks, in denen kein Video angezeigt wird, werden mit der Hintergrundfarbe gezeichnet – schwarz in diesem Beispiel. Die Quell- und Zielrechtecke werden im folgenden Diagramm dargestellt.
Das vorangehende 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, bei dem das Zielrechteck kleiner als die Zieloberfläche ist.
Das vorangehende 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 nicht vom Blit betroffen sind.
Beispiel 5: Quellrechtecke
Wenn Sie ein Quellrechteck angeben, das kleiner als das Quellbild ist, wird nur dieser Teil des Bilds durchleuchtet. 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 sind die gleichen Größen wie die Quellrechtecke, sodass das Video nicht gestreckt wird. Die Quell- und Zielrechtecke werden im folgenden Diagramm dargestellt.
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: { 0, 0, 360, 240 }
- Unterdatenstrom:
- Quelloberflächengröße: { 0, 0, 640, 576 }
- Quellrechteck: { 0, 288, 320, 576 }
- Zielrechteck: { 400, 0, 720, 288 }
Beispiel 6: Überschneiden der Zielrechtecke
Dieses Beispiel ähnelt dem vorherigen, aber das Zielrechteck überschneidet sich. Die Oberflächenabmessungen entsprechen dem im vorherigen Beispiel, aber die Quell- und Zielrechtecke sind nicht. Auch hier wird das Video zugeschnitten, aber nicht gestreckt. Die Quell- und Zielrechtecke werden im folgenden Diagramm dargestellt.
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 }
- Unterdatenstrom:
- 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 Datenstrom wird gestreckt, um einen Bereich von 360 × 240 im Zielrechteck abzudecken.
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: { 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 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 im Array in zeitlicher Reihenfolge angezeigt. Je nach Deinterlacemodus 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 keine Deinterlacing erfordert. (Dies kann auftreten, wenn progressive Frames einem Deinterlacing-Gerät zugewiesen werden, z. B. wenn die Quelle eine Mischung aus interlacierten 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. Teilstreams sind immer progressiv und erfordern keine Referenzbilder.
Der primäre Videostream kann jederzeit zwischen interlaced und progressiven Inhalten wechseln, und die Anzahl der Teilstreams kann sich ändern.
Das SampleFormat.SampleFormat-Element der DXVA2_VideoSample-Struktur gibt den Typ des Bilds an. Legen Sie für Unterstreambilder diesen Wert auf DXVA2_SampleSubStream fest. Bei progressiven Bildern wird der Wert DXVA2_SampleProgressiveFrame. Bei verketteten 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. Geben Sie in diesem Fall Einträge für sie in das pSamples-Array ein, markieren Sie aber die fehlenden Beispiele als Typ DXVA2_SampleUnknown.
Die Elemente "Start " und "Ende " der DXVA2_VideoSample Struktur geben die zeitliche Position der einzelnen Stichproben 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 dargestellt.
| Verzeichnis | Surface-Typ | Zeitliche Position |
|---|---|---|
| pSamples[0] | Interlaced picture. | 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 Datenstrom. Der Deinterlacingalgorithmus erfordert keine Referenzbeispiele. Die folgende Tabelle zeigt, wie diese Beispiele im pSamples-Array angeordnet sind.
| Verzeichnis | Surface-Typ | Zeitliche Position | Z-Reihenfolge |
|---|---|---|---|
| pSamples[0] | Interlaced picture | T | 0 |
| pSamples[1] | Unterdatenstrom | 0 | 1 |
| pSamples[2] | Unterdatenstrom | 0 | 2 |
Beispiel 3
Angenommen, der Deinterlacingalgorithmus erfordert ein Abwä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 angezeigt.
| Verzeichnis | Surface-Typ | Zeitliche Position | Z-Reihenfolge |
|---|---|---|---|
| pSamples[0] | Interlaced picture (reference) | T −1 | Nicht anwendbar |
| pSamples[1] | Interlaced picture | T | 0 |
| pSamples[2] | Interlaced picture (reference) | T +1 | Nicht anwendbar |
| 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 denselben Deinterlacing-Modus verwenden, wie in der folgenden Tabelle dargestellt.
| Verzeichnis | Surface-Typ | Zeitliche Position | Z-Reihenfolge |
|---|---|---|---|
| pSamples[0] | Progressive Grafik (Referenz) | T −1 | Nicht anwendbar |
| pSamples[1] | Progressives Bild | T | 0 |
| pSamples[2] | Progressive Grafik (Referenz) | T +1 | Nicht anwendbar |
| 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, der Deinterlacingmodus 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.
| Verzeichnis | Surface-Typ | Zeitliche Position |
|---|---|---|
| pSamples[0] | Unbekannt | 0 |
| pSamples[1] | Unbekannt | 0 |
| pSamples[2] | Interlaced picture (reference) | T +1 |
| Verzeichnis | Surface-Typ | Zeitliche Position |
|---|---|---|
| pSamples[0] | Unbekannt | 0 |
| pSamples[1] | Interlaced picture | T |
| pSamples[2] | Interlaced picture (reference) | T +1 |
| Verzeichnis | Surface-Typ | Zeitliche Position |
|---|---|---|
| pSamples[0] | Interlaced picture | T −1 |
| pSamples[1] | Interlaced picture | T |
| pSamples[2] | Interlaced picture (reference) | T +1 |
Zugehörige Themen