Freigeben über


D3D12 AV1-Videocodierung

Das Direct3D12-Videocodierungsfeature wird erweitert, um die AV1-Codierung ab Windows 11, Version 24H2 (WDDM 3.2) zu unterstützen. In diesem Artikel werden die Erweiterungspunkte beschrieben, in denen die bestehende D3D12-Videocodierungs-DDI Änderungen und neue Strukturen benötigt, um die AV1-Codierung zu unterstützen. Weitere Informationen, einschließlich Spezifikationen auf Anwendungsebene, finden Sie in der AV1 D3D12-Videocodierungsspezifikation.

Erweiterungen zur Steuerung der Rate

Die folgenden bestehenden Enumerationen werden mit Erweiterungen der Ratensteuerung und der Ratensteuerungsunterstützung aktualisiert:

Wenn D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAG_0096_ENABLE_EXTENSION1_SUPPORT aktiviert ist, werden die Strukturen für die erweiterte Ratesteuerung in D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS_0080_2.pConfiguration_XXXverwendet. Andernfalls werden die Legacystrukturen verwendet, wenn die Legacystrukturen pro tabelle deaktiviert werden, die auf der Referenzseite D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080 dokumentiert sind.

Unterstützungserweiterungen für die Videocodierung

Das vorhandene videobezogene Framework wird erweitert, um Treibern das Melden der Unterstützung und Funktionen der AV1-Videocodierung zu ermöglichen. In diesem Abschnitt werden die hinzugefügten oder aktualisierten Strukturen und Enumerationen aufgeführt, die zum Abfragen und Melden der AV1-Videocodierungsunterstützung verwendet werden.

Codierungsvorgang

Erwartete Bitstream-Headerwerte für AV1

Zuständigkeiten der Treiber-/Hostheadercodierung

Bei einem kodierten Frame mit K Kacheln schreibt der Treiber die K decode_tile() AV1-Syntaxelemente in den komprimierten Bitstrom, die den angeforderten Kacheln in den EncodeFrame-Argumenten entsprechen.

Der API-Client erstellt dann die tile_group_obu() AV1-Syntaxelemente mit tile_start_and_end_present_flag/tg_start/tg_end Elementen, um die Kacheln nach Wunsch in Kachelgruppen anzuordnen, wobei die Kacheln sequenziell platziert werden. Das tile_size_minus_1-Element wird aus den Informationen der zugehörigen Kachel D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA codiert und decode_tile() Elemente werden aus dem komprimierten Bitstreampuffer kopiert. Schließlich werden alle tile_group_obu() um open_bitstream_unit()-Elemente vom Typ OBU_TILE_GROUP umschlossen und mit einem OBU_FRAME_HEADER vorangestellt. Für eine einzelne Kachelgruppe kann stattdessen ein OBU_FRAME Typ verwendet werden.

Der API-Client ist für das Ableiten von obu_extension_flag als !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1) für den aktuellen Frame und auch für den Code verantwortlich, falls erforderlich, temporal_id und spatial_id im open_bitstream_unit().

Die EncodeFrame-Übermittlungen sind wie die anderen in der D3D12 Encode API implementierten Codecs in der Kodierungsreihenfolge.

Auflösungsänderungen und räumliche Skalierbarkeit

Wenn der Treiber D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE meldet, so gilt dies immer noch nur für Auflösungsänderungen in einem Keyframe.

Der aktive Sequenzheader muss die Syntax max_frame_*_minus_1 auf die maximale Auflösung festgelegt haben, die in der zugeordneten ID3D12VideoEncoderHeap vorhanden ist. Verschiedene Frames mit Auflösungen, die auch in der zugeordneten ID3D12VideoEncoderHeap vorhanden sind, können die AV1-Syntax frame_size_override_flag in frame_size() verwenden, um Auflösungsänderungen zu vermitteln.

Wenn D3D12_VIDEO_ENCODER_AV1_FRAME_TYPE_FLAG_SWITCH_FRAME unterstützt wird, müssen die Referenzframes auf eine höhere oder gleiche Auflösung zeigen als der aktuelle Switchframe, der codiert wird, und die verschiedenen Auflösungen müssen alle in der zugeordneten ID3D12VideoEncoderHeap vorhanden sein, die verwendet wird.

Wenn die räumliche Skalierbarkeit unterstützt wird, müssen die verschiedenen Auflösungen der Referenzframes in der zugeordneten ID3D12VideoEncoderHeap vorhanden sein.

Hinweise zum Bewerten von Steuerelementen

Der akzeptierte Bereich für D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_QVBR1_0096.ConstantQualityTarget lautet [0..63]. Der niedrigste Wert liefert die höchste Qualität.

Im Allgemeinen gilt D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAG_0083_0_RATE_CONTROL_RECONFIGURATION_AVAILABLE für die Qualität im Vergleich zur Geschwindigkeitsoptimierung und die folgenden Geschwindigkeitssteuerungsparameter der verschiedenen Geschwindigkeitssteuerungsmodi: QP in konstanten QP- und Bitraten- und Qualitätsstufen in CBR, VBR und QVBR. Der Treiber kann D3D12DDI_VIDEO_ENCODER_ENCODE_ERROR_FLAG_0082_0_RECONFIGURATION_REQUEST_NOT_SUPPORTED in D3D12DDI_VIDEO_ENCODER_OUTPUT_METADATA_0083_0.EncodeErrorFlags für andere nicht unterstützte Steuerungsparameterkonfigurierung zurückgeben.

Codierungsvorgangs-API

Die folgenden Strukturen und Enumerationen werden mit Erweiterungen hinzugefügt oder aktualisiert, um den AV1-Codierungsvorgang zu unterstützen:

Darüber hinaus muss der vorhandene PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0-Rückruf eines Treibers aktualisiert werden, um das AV1-spezifische aufgelöste Pufferlayout zu verarbeiten, das für die AV1-Codierung hinzugefügt wurde.