Encodage vidéo D3D12
Cet article fournit des informations générales aux développeurs de pilotes concernant la fonctionnalité d'encodage vidéo de Direct3D12. Pour plus d'informations, y compris les spécificités au niveau de l'application, consultez la spécification d'encodage vidéo D3D.
À propos de l'encodage vidéo Direct3D 12
Avant Windows 11 (WDDM 3.0), DirectX 12 fournissait des interfaces au niveau des applications et des pilotes (API et DDI) pour prendre en charge l'accélération du GPU pour plusieurs applications vidéo, notamment le décodage vidéo, le traitement vidéo et l'estimation de mouvement.
À partir de Windows 11, D3D12 ajoute une fonctionnalité d'encodage vidéo à la famille d'API/DDI vidéo existante. Cette fonctionnalité fournit un ensemble cohérent d'API/DDI d'encodage qui sont compatibles avec le cadre existant de D3D12, et permet aux développeurs d'effectuer l'encodage vidéo en utilisant des moteurs vidéo accélérés par le GPU.
Le framework d'encodage vidéo donne accès aux capacités d'accélération matérielle de l'encodage vidéo pour différents scénarios tels que l'Internet des objets (IoT), le cloud, les API médias, l'apprentissage automatique et le streaming de jeu.
La prise en charge de l'encodage AV1 est ajoutée dans Windows 11, version 24H2 (WDDM 3.2). Pour plus d'informations, consultez la section Encodage vidéo D3D12 AV1.
Codecs pris en charge
À partir de Windows 11, les codecs pris en charge sont H.264 et HEVC, bien que le cadre d'encodage vidéo D3D12 offre une extensibilité ouverte pour les codecs plus récents tels que AV1.
Les aspects de l'interface du cadre spécifiques aux codecs sont délégués aux structures spécifiques aux codecs et à leur accès aux types d'union. Par exemple, la structure D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 contient une union avec des pointeurs vers les structures D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_0082_0 et D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_0082_0 spécifiques au codec qui contiennent les informations de configuration spécifiques au codec.
Pour préserver la compatibilité de l'interface binaire avec l'extensibilité, les types d'union contiennent toujours des pointeurs vers les structures spécifiques au codec. Les types d'union ont une taille constante basée sur la taille des pointeurs de l'architecture hôte. Cette décision permet également d'éviter que les structures contenant des membres de types d'union (ou contenant des types d'union anonymes) ne modifient la taille de leur type lors de l'extension de l'interface. Certaines unions ne contiennent que des pointeurs vers des types enum ; par souci de cohérence, ces types enum sont également référencés en tant que pointeurs au cas où un nouveau codec nécessiterait un type plus complexe qu'un enum pour représenter ces concepts.
Rapport sur la prise en charge et les capacités de l'encodage vidéo
Le cadre existant relatif à la vidéo a été étendu pour permettre aux pilotes de signaler la prise en charge et les capacités de l'encodage vidéo.
D3D12DDI_FEATURE_VERSION_VIDEO_0083_0 est le numéro de version qui définit la première implémentation complète de toutes les étapes de l'encodage vidéo D3D12 qui ont été introduites dans Windows 11.
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_0080_ENCODER_CODEC = 31,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_PROFILE_LEVEL = 32,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_OUTPUT_RESOLUTION_RATIOS_COUNT = 33,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_OUTPUT_RESOLUTION = 34,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_INPUT_FORMAT = 35,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_RATE_CONTROL_MODE = 36,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_INTRA_REFRESH_MODE = 37,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_FRAME_SUBREGION_LAYOUT_MODE = 38,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_HEAP_SIZE = 39,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC_CONFIGURATION_SUPPORT = 40,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_SUPPORT = 41,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT = 42,
- D3D12DDICAPS_TYPE_VIDEO_0080_ENCODER_RESOURCE_REQUIREMENTS = 43
Le runtime D3D appelle le callback PFND3D12DDI_VIDEO_GETCAPS du pilote pour demander la prise en charge du codage vidéo.
Un pilote qui prend en charge le codage vidéo fournit au moteur d'exécution D3D des pointeurs vers ses fonctions de rappel de codage vidéo dans la structure D3D12DDI_DEVICE_FUNCS_VIDEO_0082_0.
Fonctions de rappel de codage vidéo D3D12
Un pilote implémente les fonctions de rappel suivantes pour prendre en charge le codage vidéo D3D12.
Créez l'objet pilote qui représente l'encodeur vidéo :
PFND3D12DDI_CALCPRIVATEVIDEOENCODERSIZE_0082_0 calcule la quantité de mémoire que le runtime D3D doit allouer à l'objet pilote.
PFND3D12DDI_CREATEVIDEOENCODER_0082_0 crée l'objet encodeur vidéo réel qui contient l'état de la session d'encodage vidéo.
Crée l'objet pilote qui représente le tas de l'encodeur vidéo :
PFND3D12DDI_CALCPRIVATEVIDEOENCODERHEAPSIZE_0080_2 calcule la quantité de mémoire que le runtime D3D doit allouer à l'objet pilote.
PFND3D12DDI_CREATEVIDEOENCODERHEAP_0080_2 crée l'objet de tas de l'encodeur vidéo qui contient les ressources et l'état du pilote en fonction de la résolution.
Encodez une trame :
PFND3D12DDI_VIDEO_ENCODE_FRAME_0082_0 enregistre une opération d'encodage de trame dans la liste des commandes.
Après l'opération d'encodage, PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 doit également être appelé pour résoudre les métadonnées de sortie de l'opération d'encodage dans un format lisible. La disposition des métadonnées résolues du pilote est similaire à l'exemple illustré dans un diagramme de la spécification.
Détruisez l'encodeur vidéo et le tas associé :
Test
Les tests suivants font partie du kit de laboratoire matériel Windows (WHLK). Pour plus d’informations, consultez l’WHLK.
Nom du test | Description |
---|---|
CreateVideoEncoder | Valide la création de VideoEncoder/VideoEncoderHeap sur la base des cas liés à CheckFeatureSupport signalés. |
SingleEncodeH264/HEVC | Tests basés sur le code QR pour les contrôles de base des images structurelles. La séquence d'images d'entrée est estampillée avec un contenu QR prédéfini, puis encodée et décodée, et enfin vérifiée pour s'assurer que les valeurs de sortie (et, dans une certaine mesure, la qualité) correspondent à ce qui est attendu. |
EncodeProfileLevelSuggestionsH264/HEVC | Valide que les valeurs de D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT.SuggestedProfile/Level sont conformes aux spécifications H.264/HEVC et aux configurations transmises en entrée à D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT. |
EncodeHeapSizeCap | Valide l'augmentation de l'empreinte mémoire avec différents arguments d'entrée croissants. |
SimpleGOPEncodeH264/HEVC(10bit) | Transcode une vidéo d'entrée en utilisant différentes résolutions, motifs GOP, modes de découpage et autres configurations de codec, et valide la vidéo encodée de sortie par rapport à la différence de flux vidéo d'entrée. Cette comparaison est effectuée à l'aide du rapport signal de crête/bruit (PSNR). |
EncodeSubregions/ResolutionReconfiguration | Valide les reconfigurations à la volée. |
EncodeH264LongTermReferences | Valide l'utilisation de références d'images à long terme. |
EncodeIntraRefresh | Valide un scénario simple de rafraîchissement interne avec un IPP...P...P... GOP. |
VideoEncodeCommandListFeatures | Valide la prédication et les marqueurs pour les listes de commandes d'encodage vidéo. |
VideoEncodeTimestamps | Valide les horodatages pour les listes de commandes d'encodage vidéo. |
Scénarios d'encodage vidéo
OneCore
La prise en charge de l'encodage vidéo D3D12 permet un encodage vidéo portable accéléré par le matériel sur des plates-formes où seul D3D12 est disponible. Il s'agit notamment des différentes UGS OneCore utilisées par les plateformes de cloud computing et d'IoT. L'accélération de l'encodage vidéo est disponible dans ces scénarios sans qu'il soit nécessaire d'utiliser des solutions spécifiques à la plateforme.
API médias
Les capacités d'encodage vidéo de bas niveau et portables sont accessibles à tous les fournisseurs de matériel. Cela permet aux API médias de niveau supérieur (telles que Media Foundation) de construire leurs couches médias au-dessus de cette API qui se charge d'abstraire les différentes plateformes matérielles. Étant donné la conception de bas niveau de l'API, ces couches médias de niveau supérieur peuvent optimiser leurs scénarios en contrôlant finement les aspects de synchronisation et d'allocation de mémoire/résidence de la session d'encodage vidéo, comme le contrôle total de la gestion de l'image de référence et des responsabilités d'écriture des en-têtes de flux binaire. Ce transfert de responsabilités vers la couche située au-dessus de cette API permet également aux fournisseurs de matériel de disposer d'un ensemble cohérent de stratégies d'encodage (par exemple, l'heuristique DPB telle que la GOP adaptative) dans la couche média qui peut être réutilisée sur différentes plates-formes matérielles.
Interopérabilité avec les graphiques D3D, le calcul et la machine learning
L'API d'encodage vidéo D3D12 permet une interopérabilité efficace entre l'encodage vidéo D3D12 et les scénarios de graphisme, de calcul et de machine learning D3D12, ce qui est intéressant pour des scénarios tels que l'exécution d'une inférence de machine learning sur un flux de caméras.
Scénarios de streaming de jeux
L'API d'encodage vidéo D3D12 permet des scénarios de streaming de jeux qui nécessitent une API de bas niveau très performante.