Partager via


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 :

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.

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 :

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.