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 vorhandene D3D12-Videocodierung 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 vorhandenen Enumerationen werden mit Erweiterungen für die Steuerung der Datenrate und deren Unterstützung aktualisiert:

Wenn D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAG_0096_ENABLE_EXTENSION1_SUPPORT aktiviert ist, werden die Erweiterten Ratensteuerungsstrukturen in D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS_0080_2.pConfiguration_XXX verwendet; andernfalls werden die Legacystrukturen verwendet, wenn sie gemäß der auf der D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080 Referenzseite dokumentierten Tabelle deaktiviert sind.

Unterstützungserweiterungen für die Videocodierung

Das vorhandene videobezogene Framework wird erweitert, um Treibern das Melden von AV1-Videocodierungsunterstützung und -funktionen 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

Verantwortlichkeiten für Treiber-/Host-Header-Codierung

Angesichts eines codierten Frames mit K-Kacheln schreibt der Treiber die K decode_tile() AV1-Syntaxelemente im komprimierten Bitstream, die den angeforderten Kacheln in 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 wie gewünscht in Kachelgruppen anzuordnen, wobei die Kacheln sequenziell platziert werden. Das Element tile_size_minus_1 wird aus den Informationen von D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA zur zugehörigen Kachel codiert, und decode_tile()-Elemente werden aus dem komprimierten Bitstrompuffer kopiert. Schließlich wird jedes tile_group_obu() um die open_bitstream_unit()-Elemente vom Typ OBU_TILE_GROUP gewickelt und mit einem OBU_FRAME_HEADER versehen. Für eine einzelne Kachelgruppe kann stattdessen ein OBU_FRAME Typ verwendet werden.

Der API-Client ist dafür verantwortlich, das obu_extension_flag für !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1) den aktuellen Frame abzuleiten und, falls erforderlich, temporal_id und spatial_id im open_bitstream_unit() zu kodieren.

Die EncodeFrame-Übermittlungen erfolgen in Kodierreihenfolge, ähnlich wie die anderen Codecs, die in der D3D12-Codier-API implementiert sind.

Auflösungsänderungen und räumliche Skalierbarkeit

Wenn der Treiber D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE meldet, gilt es weiterhin nur für Auflösungsänderungen in einem Keyframe.

Der aktive Sequenzheader muss die Syntax "max_frame_*_minus_1" so einstellen, dass sie der maximalen Auflösung entspricht, die in dem genutzten 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 anzugeben.

Wenn D3D12_VIDEO_ENCODER_AV1_FRAME_TYPE_FLAG_SWITCH_FRAME unterstützt wird:

  • Die Referenzframes müssen auf eine höhere oder gleiche Auflösung zeigen als der aktuelle Switchframe, der codiert wird.
  • 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.

Notizen zur Ratensteuerung

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

Im Allgemeinen gilt D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAG_0083_0_RATE_CONTROL_RECONFIGURATION_AVAILABLE für die Anpassung der Qualität im Vergleich zur Geschwindigkeit und die folgenden Ratensteuerungsparameter der verschiedenen Ratensteuerungsmodi: QP in konstantem QP, 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 Neukonfiguration der Parameter zur Steuerung der Bitrate 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.