Encodage vidéo AV1 D3D12
La fonctionnalité d'encodage vidéo Direct3D12 est étendue pour prendre en charge l'encodage AV1 à partir de Windows 11, version 24H2 (WDDM 3.2). Cet article décrit les points d'extension où le DDI d'encodage vidéo D3D12 existant a besoin de modifications et de nouvelles structures pour prendre en charge l'encodage AV1. Pour en savoir plus, et notamment les spécificités au niveau de l'application, se reporter à la Spécification d'encodage vidéo D3D12 AV1.
Extensions concernant le contrôle du débit
Les énumérations existantes suivantes sont mises à jour avec des extensions pour le contrôle du débit et la prise en charge du contrôle du débit :
Des indicateurs de prise en charge du contrôle du débit sont ajoutés à D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAGS_0083_0
Des indicateurs de contrôle du débit sont ajoutés à D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080
Les structures étendues suivantes (Extension 1) D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_XXX1 sont ajoutées et D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS est mise à jour pour les inclure. QualityVsSpeed est ajouté à tous les modes, et de plus, VBVCapacity et InitialVBVFullness sont ajoutés à _QVBR1.
Lorsque D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAG_0096_ENABLE_EXTENSION1_SUPPORT est activé, les structures de contrôle de débit étendues sont utilisées dans D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS_0080_2.pConfiguration_XXX ; dans le cas contraire, lorsqu'il est désactivé, les structures héritées sont utilisées conformément à la table documentée dans la page de référence D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080.
Extensions de prise en charge de l'encodage vidéo
Le framework vidéo existant est étendu pour permettre aux pilotes de signaler la prise en charge et les capacités de l'encodage vidéo AV1. Cette section répertorie les structures et énumérations ajoutées ou mises à jour qui sont utilisées pour interroger et signaler la prise en charge de l'encodage vidéo AV1.
D3D12DDI_FEATURE_VERSION_VIDEO_0095_0 est le numéro de version qui définit l'implémentation minimale de tous les jalons d'encodage vidéo D3D12 introduits dans Windows 11, version 24H2 (WDDM 3.2)
L'énumération D3D12DDICAPS_TYPE_VIDEO_0020 a été étendue pour inclure les valeurs suivantes de prise en charge de l'encodage vidéo :
- D3D12DDICAPS_TYPE_VIDEO_0095_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG
- D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1
D3D12DDI_VIDEO_ENCODER_CODEC_0095_AV1 est ajouté à D3D12DDI_VIDEO_ENCODER_CODEC_0080
L'énumération D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 a été ajoutée pour définir les profils AV1 pris en charge par le pilote. Le pilote utilise D3D12DDICAPS_VIDEO_ENCODER_INPUT_FORMAT_DATA_0080_2 pour signaler à la requête des formats éventuellement pris en charge pour une entrée D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095.
D3D12DDI_VIDEO_ENCODER_PROFILE_DESC_0080_2 est mis à jour pour inclure le profil AV1 (pAV1Profile).
Les structures et énumérations suivantes sont ajoutées ou étendues pour prendre en charge l'encodage AV1 :
D3D12DDI_VIDEO_ENCODER_AV1_LEVEL_TIER_CONSTRAINTS_0095 (pAV1LevelSetting est ajouté à D3D12DDI_VIDEO_ENCODER_LEVEL_SETTING_0080_2)
D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0080 est étendu pour inclure D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_UNIFORM_GRID_PARTITION et D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_CONFIGURABLE_GRID_PARTITION.
D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_EIGHTH_PIXEL_0095 est ajouté à D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_0080
D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095 et D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095 et D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095 et D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095 et D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_CODEC_CONFIGURATION_SUPPORT, avec pAV1Support ajouté à D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_0083_0
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095 et D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_PICTURE_CONTROL_SUPPORT_0095, et pAV1Support ajouté à D3D12DDI_VIDEO_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT_0080_2
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095 et D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_VALIDATION_0095_FLAGS
D3D12DDI_FEATURE_DATA_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_0095 et D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095
pAV1Config est ajouté à D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0
L'indicateur D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAG_0080_SUBREGION_LAYOUT_MODE_NOT_SUPPORTED est ajouté à D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAGS_0080 pour son utilisation avec la capacité de requête étendue D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1.
D3D12DDICAPS_VIDEO_ENCODER_SUPPORT1_DATA_0096 est ajouté pour étendre la requête D3D12DDICAPS_VIDEO_ENCODER_SUPPORT_DATA_0083_0 précédente, avec des paramètres ajoutés au bas de la structure. Cette requête étendue peut être utilisée avec tous les codecs H264, HEVC et AV1 et doit se comporter exactement comme la sémantique D3D12_FEATURE_VIDEO_ENCODER_SUPPORT.
La sémantique des membres MaxSubregionsNumber, SemanticBlockPixelsSize et QPMapRegionPixelsSize de D3D12DDI_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS_0080_2 sont mises à jour pour AV1.
_D3D12DDI_VIDEO_ENCODER_AV1_SEQUENCE_STRUCTURE_0095 est ajouté, et pAV1SequenceStructure est ajouté à D3D12DDI_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_0082_0.
Opération d'encodage
Valeurs d'en-tête de flux binaire attendues pour AV1
Responsabilités du pilote/hôte en matière de codage d'en-tête
À partir d'une trame encodée avec des mosaïques K, le pilote écrit les éléments de syntaxe K decode_tile() AV1 dans le flux binaire compressé, correspondant aux mosaïques demandées dans les arguments EncodeFrame.
Le client API génère ensuite les éléments de syntaxe tile_group_obu() AV1 avec des éléments tile_start_and_end_present_flag/tg_start/tg_end pour organiser les mosaïques en groupes comme souhaité, à condition que les mosaïques soient placées de façon séquentielle. L'élément tile_size_minus_1 est codé à partir des informations D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA de la mosaïque correspondante et les éléments decode_tile() sont copiés à partir de la mémoire tampon du flux binaire compressé. Enfin, chaque tile_group_obu() est encapsulé autour d'éléments open_bitstream_unit() de type OBU_TILE_GROUP et précédés d'un OBU_FRAME_HEADER. Pour un groupe de mosaïques unique, il est possible d'utiliser plutôt un type OBU_FRAME.
Le client API est chargé d'établir obu_extension_flag sur !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1)
par inférence pour la mosaïque actuelle ainsi que de coder, si nécessaire, temporal_id et spatial_id dans le open_bitstream_unit().
Les soumissions EncodeFrame se font selon l'ordre d'encodage, comme les autres codecs implémentés dans l'API d'encodage D3D12.
Modifications de résolution et extensibilité spatiale
Si le pilote signale D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE, il s'applique toujours uniquement aux modifications de résolution sur une image clé.
L'en-tête de la séquence active doit avoir la syntaxe max_frame_*_minus_1 définie sur la résolution maximale présente dans l'ID3D12VideoEncoderHeap associé utilisé. Différentes images utilisant des résolutions, également présentes dans l'ID3D12VideoEncoderHeap associé, peuvent utiliser la syntaxe AV1 frame_size_override_flag dans frame_size() pour transmettre la modification de résolution.
Si D3D12_VIDEO_ENCODER_AV1_FRAME_TYPE_FLAG_SWITCH_FRAME est pris en charge, les images de référence doivent pointer vers une résolution supérieure ou égale à celle de l'image du commutateur actuel encodée et les différentes résolutions doivent être toutes présentes dans l'ID3D12VideoEncoderHeap associé utilisé.
De même, si l'extensibilité spatiale est prise en charge, les différentes résolutions des images de référence doivent être toutes présentes dans l'ID3D12VideoEncoderHeap associé utilisé.
Notes concernant le contrôle de débit
La plage acceptée pour D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_QVBR1_0096.ConstantQualityTarget est [0..63]. La valeur la plus faible correspond à la meilleure qualité.
En général, D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAG_0083_0_RATE_CONTROL_RECONFIGURATION_AVAILABLE s'applique à l'ajustement de la qualité par rapport à la vitesse et aux paramètres de contrôle de débit suivants pour les différents modes de contrôle de débit : QP sur QP constant, débits binaires et niveaux de qualité sur CBR, VBR et QVBR. Le pilote peut retourner D3D12DDI_VIDEO_ENCODER_ENCODE_ERROR_FLAG_0082_0_RECONFIGURATION_REQUEST_NOT_SUPPORTED dans D3D12DDI_VIDEO_ENCODER_OUTPUT_METADATA_0083_0.EncodeErrorFlags pour la reconfiguration d'autres paramètres de contrôle de débit non pris en charge.
API d'opération d'encodage
Les structures et énumérations suivantes sont ajoutées ou mises à jour avec des extensions permettant de prendre en charge l'opération d'encodage AV1 :
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 est ajouté à D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_0082_0
D3D12DDI_VIDEO_ENCODER_AV1_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_TILES_0095
pTilesPartition_AV1 est ajouté à D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_0080_2
De plus, le rappel existant PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 d'un pilote a besoin d'être mis à jour afin de traiter la disposition de la mémoire tampon spécifique AV1 ajoutée pour l'encodage AV1.