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 dans lesquels le DDI D3D12 d’encodage vidéo existant a besoin de modifications et de nouvelles structures pour prendre en charge l’encodage AV1. Pour plus d’informations, y compris les spécificités au niveau de l’application, consultez la spécification d’encodage vidéo AV1 D3D12.

Extensions au contrôle de débit

Les énumérations existantes suivantes sont mises à jour avec des extensions pour la prise en charge du contrôle de débit et du contrôle de 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. Sinon, lorsque ce support est désactivé, les structures héritées sont utilisées, conformément au tableau documenté sur la page de référence D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080.

Extensions de prise en charge de l’encodage vidéo

L’infrastructure vidéo existante est étendue pour permettre aux pilotes de signaler la prise en charge et les fonctionnalités de l’encodage vidéo AV1. Cette section répertorie les structures et énumérations ajoutées ou mises à jour 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 de bits attendues pour AV1

Responsabilités liées au codage des en-têtes pour le pilote/hôte

Étant donné une trame encodée avec des vignettes K, le pilote écrit les éléments de syntaxe K decode_tile() AV1 dans le flux de bits compressé, correspondant aux vignettes demandées dans les arguments EncodeFrame .

Le client API génère ensuite les éléments de syntaxe AV1 pour tile_group_obu() avec les éléments tile_start_and_end_present_flag/tg_start/tg_end pour organiser les tuiles en groupes comme souhaité, à condition qu'elles soient placées séquentiellement. L’élément tile_size_minus_1 est codé à partir des informations relatives à la vignette D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA et les éléments decode_tile() sont copiés à partir de la mémoire tampon de 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 tuiles unique, un type OBU_FRAME peut être utilisé à la place.

Le client d’API est chargé de déduire obu_extension_flag comme !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1) pour la trame actuelle et également de coder si nécessaire temporal_id et spatial_id dans le open_bitstream_unit().

Les soumissions EncodeFrame sont effectuées dans l'ordre d'encodage, comme les autres codecs implémentés dans l'API d'encodage D3D12.

Modifications de résolution et scalabilité 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 trame clé.

L’en-tête de séquence actif doit avoir la syntaxe max_frame_*_minus_1 définie sur la résolution maximale présente dans l’ID3D12VideoEncoderHeap associé utilisé. Les 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 indiquer un changement de résolution.

Si D3D12_VIDEO_ENCODER_AV1_FRAME_TYPE_FLAG_SWITCH_FRAME est pris en charge :

  • Les trames de référence doivent pointer vers une résolution supérieure ou égale à celle de la trame de commutation actuellement encodée.
  • 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 trames de référence doivent être toutes présentes dans l’ID3D12VideoEncoderHeap associé utilisé.

Notes sur 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 génère la plus haute qualité.

En général, D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAG_0083_0_RATE_CONTROL_RECONFIGURATION_AVAILABLE s’applique à l'optimisation entre qualité et rapidité, ainsi qu’aux paramètres de contrôle de débit des différents modes : QP dans le mode QP constant, débits binaires et niveaux de qualité dans les modes 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 pour prendre en charge l’opération d’encodage AV1 :

De plus, le rappel PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 existant d’un pilote doit être mis à jour pour gérer la disposition de mémoire tampon résolue spécifique à AV1 ajoutée pour l’encodage AV1.