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:
Flags der Ratensteuerungsunterstützung werden D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAGS_0083_0 hinzugefügt
Flags der Ratensteuerungsunterstützung werden D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080 hinzugefügt
Die folgenden erweiterten (Erweiterung 1) D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_XXX1-Strukturen werden hinzugefügt und D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS wird aktualisiert, um sie einzuschließen. QualityVsSpeed wird allen Modi hinzugefügt, und VBVCapacity und InitialVBVFullness werden zusätzlich zu _QVBR1 hinzugefügt.
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.
D3D12DDI_FEATURE_VERSION_VIDEO_0095_0 ist die Versionsnummer, die die Mindestimplementierung aller D3D12-Videocodierungsmeilensteine, die in Windows 11, Version 24H2 (WDDM 3.2) eingeführt wurden, definiert.
Die D3D12DDICAPS_TYPE_VIDEO_0020-Enumeration wurde erweitert, um die folgenden Videocodierungsunterstützungswerte einzuschließen:
- D3D12DDICAPS_TYPE_VIDEO_0095_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG
- D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1
D3D12DDI_VIDEO_ENCODER_CODEC_0095_AV1 wird D3D12DDI_VIDEO_ENCODER_CODEC_0080 hinzugefügt
Die D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095-Enumeration wurde hinzugefügt, um die vom Treiber unterstützten AV1-Profile zu definieren. Der Treiber verwendet D3D12DDICAPS_VIDEO_ENCODER_INPUT_FORMAT_DATA_0080_2 , um optional unterstützte Formate für eine bestimmte D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095-Eingabe für die Abfrage zu melden.
D3D12DDI_VIDEO_ENCODER_PROFILE_DESC_0080_2 wird aktualisiert, um das AV1-Profil (pAV1Profile) einzuschließen.
Die folgenden Strukturen und Enumerationen werden hinzugefügt oder erweitert, um die AV1-Codierung zu unterstützen:
D3D12DDI_VIDEO_ENCODER_AV1_LEVEL_TIER_CONSTRAINTS_0095 (pAV1LevelSetting wird 3D12DDI_VIDEO_ENCODER_LEVEL_SETTING_0080_2) hinzugefügt
D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0080 wird erweitert, um D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_UNIFORM_GRID_PARTITION und D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_CONFIGURABLE_GRID_PARTITION einzuschließen.
D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_EIGHTH_PIXEL_0095 wird D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_0080 hinzugefügt
D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095 und D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095 und D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095 und D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095 und D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_CODEC_CONFIGURATION_SUPPORT, wobei pAV1Support zu D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_0083_0 hinzugefügt wird
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095 und D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_PICTURE_CONTROL_SUPPORT_0095, wobei pAV1Support zu D3D12DDI_VIDEO_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT_0080_2 hinzugefügt wird
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095 und D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_VALIDATION_0095_FLAGS
D3D12DDI_FEATURE_DATA_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_0095 und D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095
pAV1Config wird zu D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 hinzugefügt
Das Flag D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAG_0080_SUBREGION_LAYOUT_MODE_NOT_SUPPORTED wird zu D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAGS_0080 für die Verwendung mit der erweiterten D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1-Abfrage-Cap hinzugefügt.
D3D12DDICAPS_VIDEO_ENCODER_SUPPORT1_DATA_0096 wird hinzugefügt, um die vorherige Abfrage D3D12DDICAPS_VIDEO_ENCODER_SUPPORT_DATA_0083_0 zu erweitern, wobei Parameter am Ende der Struktur hinzugefügt werden. Diese erweiterte Abfrage kann mit allen H264-, HEVC- und AV1-Codecs verwendet werden und muss sich genau wie D3D12_FEATURE_VIDEO_ENCODER_SUPPORT-Semantik verhalten.
Die Semantik für die Mitglieder MaxSubregionsNumber, SubregionBlockPixelsSize und QPMapRegionPixelsSize von D3D12DDI_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS_0080_2 werden für AV1 aktualisiert.
_D3D12DDI_VIDEO_ENCODER_AV1_SEQUENCE_STRUCTURE_0095 wird hinzugefügt und pAV1SequenceStructure wird zu D3D12DDI_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_0082_0 hinzugefügt.
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:
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_WARPED_MOTION_INFO_0095
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_DESCRIPTOR_0095
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_LOOP_FILTER_DELTA_CONFIG_0095
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_QUANTIZATION_DELTA_CONFIG_0095
pAV1PicData wird zu D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_0082_0 hinzugefügt
D3D12DDI_VIDEO_ENCODER_AV1_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_TILES_0095
pTilesPartition_AV1 wird zu D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_0080_2 hinzugefügt
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.