Direct3D 12-Videoübersicht

Dieser Artikel enthält allgemeine Anleitungen für die Verwendung der Direct3D 12-Video-APIs.

Informationen zu Direct3D 12-Video

Die Direct3D 12-Videoschnittstelle bietet Apps eine neue Möglichkeit, die Videodecodierung und den Prozess zu implementieren. Die Direct3D 12-Schnittstelle unterscheidet sich von der vorherigen Direct3D 11-Schnittstelle, da sie mit den Direct3D 12-Prinzipien und -Stilen konsistent ist, die Folgendes enthalten:

  • Mehr Kontrolle für Entwickler
  • Zuordnung von hardwarevermittelbarem Arbeitsspeicher
  • CPU-Threads, die zum Generieren & Übermitteln von Befehlen verwendet werden
    • Unabhängige Generierung und Übermittlung
    • Nicht blockierend
  • Planen der Hardwarearbeit
  • Behandelt vorhandene Funktionen, einschließlich der meisten Direct3D 11-Videofunktionen, berücksichtigt aber gleichzeitig die Einfachheit und Benutzerfreundlichkeit.
  • Leistung und Leistung von Direct3D 12-Hauptanwendungen gleich oder besser als Direct3D 11
  • Konsistenz mit anderen Direct3D 12-APIs
  • Interoperabilität mit vorhandenen Grafik-APIs

Videodecodierung

In den folgenden Abschnitten werden einige der Aufgaben beschrieben, die mit der Implementierung der Direct3D 12-Videodecodierung verbunden sind.

Abfragen von Decodierungsfunktionen

Rufen Sie ID3D12VideoDevice::CheckFeatureSupport auf, um die Supportdetails für Direct3D 12-Videodecodierungsvorgänge zu überprüfen. Übergeben Sie einen Wert aus der D3D12_FEATURE_VIDEO-Enumeration, um das Feature anzugeben, für das Sie Supportinformationen anfordern.

Erstellen des Videodecoders

Rufen Sie ID3D12VideoDevice::CreateVideoDecoder auf, um eine Instanz der ID3D12VideoDecoder-Schnittstelle zu erstellen. Der Decoder enthält den Zustand für eine Decodierungssitzung, einschließlich verweisbezogener Daten wie Bewegungsvektoren. Bei einer Auflösungsänderung oder einer MaxDecodePictureBufferCount-Änderung wird das Decoderobjekt neu erstellt. Die Decodierungsbreite und -höhe geben die native Datenstromauflösung vor jeder Skala an. Die maximale DpB-Anzahl (Decode Picture Buffer) gibt die größte DPB-Anzahl an, die verwendet werden kann, ohne den Videodecoder neu zu machen.

Der Decoder kann verwendet werden, um Befehle aus mehreren Befehlslisten aufzuzeichnen, kann aber nur jeweils einer Befehlsliste zugeordnet werden. Die Anwendung ist für die Synchronisierung des Zugriffs auf den Decoder verantwortlich.

Erstellen des Videodecoderheaps

Rufen Sie ID3D12VideoDevice::CreateVideoDecoderHeap auf, um eine Instanz der ID3D12VideoDecoderHeap-Schnittstelle zu erstellen. Dieses Objekt enthält die auflösungsabhängigen Treiberressourcen und den Zustand.

Decodieren eines Frames

Alle Eingabe- und Ausgabeparameter für die Videoverarbeitungsvorgänge sind in einer Eingabeparameterstruktur, D3D12_VIDEO_DECODE_INPUT_STREAM_ARGUMENTSund einer Ausgabeparameterstruktur D3D12_VIDEO_DECODE_OUTPUT_STREAM_ARGUMENTSorganisiert. Die Anwendung verwaltet die Verweisframes und muss daher die Verweisframes für jeden Decodierungsvorgang festlegen. Wenn die Befehlsliste ordnungsgemäß aufgezeichnet wird, rufen Sie ID3D12CommandQueue::ExecuteCommandLists in der Videobefehlswarteschlange auf, um die Framedecodierung an die GPU zu übermitteln.

Aktivieren von Decoderausgabekonvertierungen

Wenn der Decoder Konvertierungen unterstützt, aktivieren Sie die gewünschten Konvertierungen, indem Sie die D3D12_VIDEO_DECODE_CONVERSION_ARGUMENTS Struktur ordnungsgemäß auffüllen. Das Format und die Auflösungen der gewünschten Ausgabe im Vergleich zur nativen Ausgabe des Decoders werden über den Unterschied im Farbraum und auflösungen kommuniziert, die in den Konvertierungsparametern angegeben sind.

Abfragen des Decodierungsstatus

Verwenden Sie die Methoden ID3D12VideoDecodeCommandList::BeginQuery und ID3D12VideoDecodeCommandList::EndQuery, um den Status des Decodierungsvorgangs abzufragen.

Die D3D12_QUERY_DATA_VIDEO_DECODE_STATISTICS-Struktur wird verwendet, um Statistiken zur Videodecodierung zu beschreiben. Um eine Instanz dieser Struktur abzurufen, rufen Sie ID3D12VideoDecodeCommandList::EndQueryauf und übergeben den Heapabfragetypwert von D3D12_QUERY_TYPE_VIDEO_DECODE_STATISTIC. Beachten Sie, dass diese Abfrage nicht ID3D12VideoDecodeCommandList::BeginQueryverwendet.

Videoverarbeitung

Direct3D 12-Video-APIs verwenden einen optimierten Ansatz für die Videoverarbeitung, wodurch nicht mehr häufig verwendete Features von Direct3D 11 entfernt werden und Funktionsüberprüfungen für Features entfernt werden, die geräteübergreifend obligatorisch sind. Der Enumerationsprozess für die Videoverarbeitung wird entfernt. Rufen Sie stattdessen ID3D12VideoDevice::CheckFeatureSupport auf, mit dem eine App die Funktionen des Videoprozessors identifizieren kann. Die gewünschten Video-, Interlace-, Stereoformate und -raten werden als Eingabe für CheckFeatureSupport bereitgestellt.

Entfernte Funktionen

Die folgenden Funktionen von Direct3D 11 werden bei der Direct3D 12-Videoverarbeitung nicht unterstützt:

Erstellen eines Videoprozessors

Rufen Sie ID3D12VideoDevice::CreateVideoProcessor auf, um eine Instanz von ID3D12VideoProcessorzu erstellen. Der Videoprozessor enthält den Zustand für eine Videoverarbeitungssitzung, einschließlich des erforderlichen Zwischenspeichers, der zwischengespeicherten Verarbeitungsdaten oder eines anderen temporären Arbeitsbereichs. Die Argumente für die Videoprozessorerstellung geben an, welche Vorgänge ausgeführt werden oder unter ID3D12VideoProcessCommandList1::P rocessFrames1 verfügbar sind. Treiberzuordnungen zum Ausführen des Videoprozessvorgangs (z. B. Zwischenstufen) werden zum Zeitpunkt der Videoprozessorerstellung zugeordnet. Verwenden Sie D3D12_FEATURE_VIDEO_PROCESSOR_SIZE, um die Zuordnungsgröße des Videoprozessors im Voraus zu bestimmen.

Der Videoprozessor kann nur verwendet werden, um Befehle aus mehreren Befehlslisten aufzuzeichnen, kann aber nur jeweils einer Befehlsliste zugeordnet werden. Die Anwendung ist für die Synchronisierung des Zugriffs auf den Videoprozessor verantwortlich. Die Anwendung muss auch Videoverarbeitungsbefehle für den Videoprocoessor in der Reihenfolge aufzeichnen, in der sie auf der GPU ausgeführt werden.

Alle Eingabe- und Ausgabeargumente für die Videoverarbeitungsvorgänge sind in einer Eingabeargumentstruktur, D3D12_VIDEO_PROCESS_INPUT_STREAM_ARGUMENTS, und einer Ausgabeargumentstruktur D3D12_VIDEO_PROCESS_OUTPUT_STREAM_ARGUMENTSorganisiert. Die Anwendung muss ID3D12VideoProcessCommandList::P rocessFrames aufrufen, um den Videoverarbeitungsvorgang aufzuzeichnen, den sie ausführen möchte.

Wenn die Befehlsliste aufgezeichnet wird, rufen Sie ID3D12CommandQueue::ExecuteCommandLists in der Videobefehlswarteschlange auf, um die Frameverarbeitung an die GPU zu übermitteln.

Ebenen

Direct3D 12-Video definiert Ebenen, die die Funktionen von Hardwaregeräten gruppieren, sodass die App weniger Codepfade haben kann, um die Unterschiedlichkeit der Hardware zu berücksichtigen. Die Ebenen werden mit der D3D12_VIDEO_DECODE_TIER-Enumeration angegeben.

In allen Tarifen ist Folgendes verfügbar:

  • Bei Auflösungsänderungen ist keine Neuerstellung des Decoders erforderlich. Nur der Decoderheap muss bei einer Auflösungsänderung neu erstellt werden.
  • Alle Verweisframes werden von der App verwaltet. Dies ermöglicht es dem System, Arbeitsspeicher zu sparen, da die maximale Anzahl von DPBs zum Zeitpunkt der Decodererstellung in einigen Ebenen nicht zugeordnet werden muss, und bietet Apps Flexibilität bei auflösungsverändernden Szenarien.

Beachten Sie, dass die Ebenen Supersets sind. Eine App kann sich für Ebene 1 entscheiden und nicht die Features auf höherer Ebene verwenden. Dies ist zwar zulässig, bietet aber möglicherweise keine optimale Leistung. Weitere Informationen zu den Funktionen, die verschiedenen Ebenen zugeordnet sind, finden Sie unter D3D12_VIDEO_DECODE_TIER.

Verweisframes

Mit Direct3D 12-Video werden Verweisframes explizit übergeben. Dies ermöglicht eine klare Verwendung von Arrays von Texturen oder Texturarrays beim Decodieren von Frames. Die App ist nicht erforderlich, um genau das gleiche Ressourcenhandle zu übergeben, wenn sie es als Verweis verwendet. sie kann z. B. eine Ressource in eine andere kopieren und dann die Kopie anstelle der ursprünglichen übergeben. Die Indizes DXVA RefFrameList und CurrPic werden weiterhin vom Treiber verwendet, um relevante Daten für jeden decodierten Frame zu speichern.

DirectX 12-Umgrenzungen

In DirectX 12 ist die App für die Synchronisierung des Zugriffs auf ihre Puffer verantwortlich. Für den Decodierungsfall müssen den Eingabepuffern und den Ausgabepuffern Umgrenzungen hinzugefügt werden. Jeder Umgrenzung ist ein Wert zugeordnet, der für die Synchronisierung der CPU und der Hardware-Engines verwendet wird. Weitere Informationen finden Sie unter Using Resource Barriers to Synchronize Resource States in Direct3D 12 (Verwenden von Ressourcenbarrieren zum Synchronisieren von Ressourcenzuständen in Direct3D 12).

Eine typische Implementierung verfügt über einen Fence für jeden Eingabepuffer. Bei Eingabepuffern ist es möglich, dass der Puffer verfügbar ist, bevor der gesamte Decodierungsprozess abgeschlossen ist. Das System ignoriert diesen Fall und geht davon aus, dass der Eingabepuffer verfügbar ist, wenn die Decodierung abgeschlossen ist. Eine Implementierung verfügt in der Regel auch über einen Fence für jeden Ausgabepuffer. Im Fall des Sendens der Ausgabe an den Compositor wird beispielsweise ein Fence benötigt, der signalisiert wird, wenn diese Darstellung dieses Frames schließlich abgeschlossen ist, was angibt, dass die Ausgabe wieder für den Decoder verfügbar ist.

[Direct3D 12 Video-APIs](direct3d-12-video-apis.md)
[Media Foundation Programmierhandbuch](media-foundation-programming-guide.md)