Encodage vidéo D3D12
Cet article fournit des informations générales pour les développeurs de pilotes concernant la fonctionnalité d’encodage vidéo Direct3D12. Pour plus d'informations, y compris les spécificités au niveau de l'application, voir la spécification d'encodage vidéo D3D.
À propos de l’encodage vidéo Direct3D 12
Avant Windows 11 (WDDM 3.0), DirectX 12 a fourni des interfaces au niveau de l’application et du pilote (API et DDIs) pour prendre en charge l’accélération GPU pour plusieurs applications vidéo, notamment le décodage vidéo, le traitement vidéo et l’estimation du mouvement.
À compter de Windows 11, D3D12 ajoute une fonctionnalité d’encodage vidéo à la famille DDI/API vidéo existante. Cette fonctionnalité fournit un ensemble cohérent d’API/DDIs d’encodage qui sont cohérentes avec l’infrastructure D3D12 existante et permet aux développeurs d’effectuer un encodage vidéo à l’aide de moteurs vidéo accélérés par GPU.
L’infrastructure d’encodage vidéo permet d’accéder aux fonctionnalités d’accélération matérielle de l’encodeur vidéo. Il peut être utilisé dans différents scénarios tels que l’Internet des objets (IoT), le cloud, les API multimédias, le Machine Learning (ML) et la diffusion en continu de jeux.
La prise en charge de l’encodage AV1 est ajoutée dans Windows 11, version 24H2 (WDDM 3.2). Pour plus d’informations, consultez D3D12 AV1 Video Encoding.
Codecs pris en charge
À compter de Windows 11, les codecs pris en charge sont H.264 et HEVC, bien que l’infrastructure 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 des structures D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_0082_0 spécifiques au codec et D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_0082_0 qui contiennent les informations de configuration spécifiques au codec.
Pour préserver la compatibilité de l’interface binaire sur l’extensibilité, les types 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 du pointeur de l’architecture hôte. Cette décision empêche également les structures qui contiennent des membres de types d’union (ou contenant des unions anonymes) de modifier leurs tailles de type lors de l’extension de l’interface. Certaines unions contiennent uniquement des pointeurs vers des types d’énumération ; pour être cohérents, ces types d’énumération sont également référencés en tant que pointeurs dans le cas où un nouveau codec nécessite un type plus complexe qu’une énumération pour représenter ces concepts.
Rapport sur la prise en charge et les capacités de l'encodage vidéo
L’infrastructure existante liée à la vidéo a été étendue pour permettre aux pilotes de signaler la prise en charge et les fonctionnalité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 codage vidéo D3D12 introduites dans Windows 11.
L’énumération D3D12DDICAPS_TYPE_VIDEO_0020 a été étendue pour inclure les valeurs de prise en charge de l’encodage vidéo suivantes :
- 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 l’encodage vidéo D3D12.
Créez l’objet de pilote qui représente l’encodeur vidéo :
PFND3D12DDI_CALCPRIVATEVIDEOENCODERSIZE_0082_0 calcule la quantité de mémoire que le moteur d'exécution D3D doit allouer à l'objet pilote.
PFND3D12DDI_CREATEVIDEOENCODER_0082_0 crée l’objet d’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 moteur d'exécution D3D doit allouer à l'objet pilote.
PFND3D12DDI_CREATEVIDEOENCODERHEAP_0080_2 crée l'objet « heap » de l'encodeur vidéo qui contient les ressources et l'état du pilote en fonction de la résolution.
Encoder un frame :
PFND3D12DDI_VIDEO_ENCODE_FRAME_0082_0 enregistre une opération d'encodage de trame dans la liste de commandes.
Après l’opération d’encodage, PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 doit également être appelée 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 dans la spécification.
Détruisez l’encodeur vidéo et le tas associé :
Test
Les tests suivants sont inclus dans le cadre du kit de laboratoire matériel Windows (WHLK) . Pour plus d’informations, consultez le WHLK.
Nom du test | Description |
---|---|
CreateVideoEncoder | Valide la création de VideoEncoder/VideoEncoderHeap en fonction des cas associés à CheckFeatureSupport signalés. |
SingleEncodeH264/HEVC | Tests basés sur le code QR pour les vérifications de base de l’image structurelle. La séquence d’images d’entrée est marquée avec du contenu QR prédéfini, puis encodé et décodé. Enfin, les valeurs de sortie (et dans une certaine mesure, la qualité) sont vérifiées pour s’assurer qu’elles sont attendues. |
EncodeProfileLevelSuggestionsH264/HEVC | Valide que les valeurs SuggestedProfile/Level de D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT sont conformes aux attentes en fonction des spécifications H.264/HEVC et des configurations transmises en tant qu’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(10 bit) | Transcode une vidéo d’entrée en utilisant différentes résolutions, modèles GOP, modes de tranche et autres configurations de codec, et valide que la différence entre la vidéo encodée de sortie et le flux vidéo d’entrée est acceptable. Cette comparaison s’effectue à l’aide du rapport signal sur bruit de crête (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 l’encodage vidéo à accélération matérielle portable sur les plateformes où seul D3D12 est disponible. Ces plateformes incluent les différentes références SKU OneCore utilisées par les plateformes de calcul cloud et IoT. L’accélération de l’encodage vidéo est disponible dans ces scénarios sans avoir besoin d’utiliser des solutions spécifiques à la plateforme.
API multimédias
Les fonctionnalités d’encodage vidéo de bas niveau et portable sont accessibles à tous les fournisseurs de matériel. Cette accessibilité permet aux API multimédias de niveau supérieur (telles que Media Foundation) de créer leurs couches multimédias au-dessus de cette API, qui s’occupent d’extraire les différentes plateformes matérielles. Compte tenu de la conception de bas niveau de l'API, ces couches média 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 changement de responsabilités vers la couche située au-dessus de cette API permet également aux fournisseurs de matériel d’avoir un ensemble cohérent de stratégies d’encodage (par exemple, des heuristiques DPB telles que goP adaptative) dans la couche multimédia qui peut être réutilisée sur différentes plateformes matérielles.
Interopérabilité avec les graphiques D3D, le calcul et le Machine Learning
L’API d’encodage vidéo D3D12 permet une interopérabilité efficace entre le codage vidéo D3D12 et les scénarios graphiques, de calcul et ML D3D12. Cette interopérabilité est intéressante pour les scénarios tels que l’exécution de l’inférence ML sur un flux de caméra.
Scénarios de diffusion en continu de jeux
L’API d’encodage vidéo D3D12 permet des scénarios de diffusion en continu de jeux qui nécessitent une API de bas niveau très performante.