Codificación de vídeo D3D12
En este artículo se proporciona información general para los desarrolladores de controladores con respecto a la característica de codificación de vídeo Direct3D12. Para obtener más información, incluidos los detalles relacionados con la aplicación, consulte la Especificación de codificación de vídeo D3D.
Acerca de la codificación de vídeo Direct3D 12
Antes de Windows 11 (WDDM 3.0), DirectX 12 proporcionaba interfaces de nivel de controlador y aplicación (API y DDI) para admitir la aceleración de GPU para varias aplicaciones de vídeo, como la descodificación de vídeo, el procesamiento de vídeo y la estimación de movimiento.
A partir de Windows 11, D3D12 agrega una característica de codificación de vídeo a la familia existente de API/DDI de vídeo. Esta característica proporciona un conjunto coherente de API o DDI de codificación que son coherentes con el marco D3D12 existente y permite a los desarrolladores realizar codificaciones de vídeo mediante motores de vídeo acelerados por GPU.
El marco de codificación de vídeo proporciona acceso a las funcionalidades de aceleración de hardware de codificación de vídeo para diferentes escenarios, como Internet de las cosas (IoT), la nube, las API multimedia, el aprendizaje automático y el streaming de juegos.
La compatibilidad con la codificación AV1 se agrega en Windows 11, versión 24H2 (WDDM 3.2). Consulte Codificación de vídeo D3D12 AV1 para obtener más información.
Códecs admitidos
A partir de Windows 11, los códecs admitidos son H.264 y HEVC, aunque el marco de codificación de vídeo D3D12 proporciona extensibilidad abierta para los códecs más recientes, como AV1.
Los aspectos específicos del códec de la interfaz del marco se delegarán en estructuras específicas del códec y su acceso a los tipos de unión. Por ejemplo, la estructura D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 contiene una unión con punteros a estructuras D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_0082_0 y D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_0082_0 específicas del códec que contienen la información de configuración específica del códec.
Para conservar la compatibilidad de la interfaz binaria en la extensibilidad, los tipos de unión siempre contienen punteros a las estructuras específicas del códec. Los tipos de unión tienen un tamaño constante basado en el tamaño del puntero de la arquitectura del host. Esta decisión también impide que las estructuras que contengan miembros de tipos de unión (o que contengan anónimos) cambien sus tamaños de tipo al extender la interfaz. Algunas de las uniones solo contienen punteros a tipos de enumeración; para ser coherentes, estos tipos de enumeración también tienen referencia como punteros en el caso de que un nuevo códec requiera algún tipo más complejo que una enumeración para representar esos conceptos.
Notificación de la compatibilidad y funcionalidades de codificación de vídeo
Se ha ampliado el marco relacionado con vídeo existente para permitir que los controladores notifiquen la compatibilidad y funcionalidades de codificación de vídeo.
D3D12DDI_FEATURE_VERSION_VIDEO_0083_0 es el número de versión que define la primera implementación completa de todos los hitos de codificación de vídeo D3D12 que se introdujeron en Windows 11.
La enumeración D3D12DDICAPS_TYPE_VIDEO_0020 se ha ampliado para incluir los siguientes valores de compatibilidad de codificación de vídeo:
- 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
El tiempo de ejecución de D3D llama a la devolución de llamada PFND3D12DDI_VIDEO_GETCAPS del controlador para consultar la compatibilidad con la codificación de vídeo.
Un controlador que admite la codificación de vídeo proporciona el entorno de ejecución D3D con punteros a sus funciones de devolución de llamada de codificación de vídeo en la estructura D3D12DDI_DEVICE_FUNCS_VIDEO_0082_0.
Funciones de devolución de llamada de codificación de vídeo D3D12
Un controlador implementa las siguientes funciones de devolución de llamada para admitir la codificación de vídeo D3D12.
Crea el objeto de controlador que representa el codificador de vídeo:
PFND3D12DDI_CALCPRIVATEVIDEOENCODERSIZE_0082_0 calcula la cantidad de memoria que el tiempo de ejecución de D3D necesita asignar para el objeto de controlador.
PFND3D12DDI_CREATEVIDEOENCODER_0082_0 crea el objeto de codificador de vídeo real que contiene el estado de la sesión de codificación de vídeo.
Crea el objeto de controlador que representa el montón de codificador de vídeo:
PFND3D12DDI_CALCPRIVATEVIDEOENCODERHEAPSIZE_0080_2 calcula la cantidad de memoria que el tiempo de ejecución de D3D necesita asignar para el objeto de controlador.
PFND3D12DDI_CREATEVIDEOENCODERHEAP_0080_2 crea el objeto de montón del codificador de vídeo que contiene los recursos y el estado del controlador dependiente de la resolución.
Codifica un marco:
PFND3D12DDI_VIDEO_ENCODE_FRAME_0082_0 registra una operación de marco de codificación en la lista de comandos.
Después de la operación de codificación, también se debe llamar a PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 para resolver los metadatos de salida de la operación de codificación en un formato legible. El diseño de los metadatos resueltos del controlador es similar al ejemplo que se muestra en un diagrama de la especificación.
Destruye el codificador de vídeo y el montón asociado:
Prueba
Las siguientes pruebas se incluyen como parte del Kit de laboratorio de hardware (WHLK) de Windows. Consulte la especificación de WHLK para detalles.
Nombre de la prueba | Descripción |
---|---|
CreateVideoEncoder | Valida la creación de VideoEncoder/VideoEncoderHeap en función de los casos relacionados con CheckFeatureSupport notificados. |
SingleEncodeH264/HEVC | Pruebas basadas en código QR para comprobaciones básicas de imágenes estructurales. La secuencia de imágenes de entrada se marca con contenido QR predefinido, luego se codifica y descodifica, y finalmente se comprueba para asegurarse de que los valores de salida (y, en cierta medida, la calidad), son los esperados. |
EncodeProfileLevelSuggestionsH264/HEVC | Valida que los valores de D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT.SuggestedProfile/Level son los esperados en función de las especificaciones H.264/HEVC y de las configuraciones que se pasan como entrada a D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT. |
EncodeHeapSizeCap | Valida el aumento de la superficie de memoria con diferentes argumentos de entrada crecientes. |
SimpleGOPEncodeH264/HEVC(10bit) | Transcodifica un vídeo de entrada con diferentes resoluciones, patrones GOP, modos de segmentación y otras configuraciones de códec, y valida que la diferencia entre el vídeo codificado de salida y el flujo de vídeo de entrada es aceptable. Esta comparación se realiza mediante la relación máxima de señal a ruido (PSNR). |
EncodeSubregions/ResolutionReconfiguration | Valida las reconfiguraciones sobre la marcha. |
EncodeH264LongTermReferences | Valida el uso de referencias a imágenes a largo plazo. |
EncodeIntraRefresh | Valida un escenario sencillo de intraactualización con un IPP...P...P... GOP abierto. |
VideoEncodeCommandListFeatures | Valida el predicado y los marcadores para listas de comandos de codificación de vídeo. |
VideoEncodeTimestamps | Valida las marcas de tiempo para las listas de comandos de codificación de vídeo. |
Escenarios de codificación de vídeo
OneCore
La compatibilidad con la codificación de vídeo D3D12 permite codificación de vídeo portátil acelerada por hardware en plataformas donde solo D3D12 está disponible. Esto incluye las distintas SKU de OneCore usadas por las plataformas de proceso en la nube e IoT. La aceleración de codificación de vídeo está disponible en estos escenarios sin necesidad de usar soluciones específicas de la plataforma.
API multimedia
Las funcionalidades de codificación de vídeo en un nivel bajo y portátil son accesibles en todos los proveedores de hardware. Esto permite que las API multimedia de nivel superior (como Media Foundation) compilen sus capas multimedia sobre esta API que se encarga de abstraer las distintas plataformas de hardware. Dado el diseño de bajo nivel de la API, estas capas multimedia de nivel superior pueden optimizarse para sus escenarios al tener un control específico de los aspectos de sincronización y asignación o residencia de memoria de la sesión de codificación de vídeo, como el control total de la administración de imágenes de referencia y las responsabilidades de escritura de encabezados de secuencia de bits. Este cambio de responsabilidades en la capa situada encima de esta API también permite a los proveedores de hardware tener un conjunto coherente de directivas de codificación (por ejemplo, Heurística de DPB como GOP adaptable) en la capa multimedia que se puede reutilizar en distintas plataformas de hardware.
Interoperabilidad con gráficos D3D, proceso y aprendizaje automático
La API de codificación de vídeo D3D12 permite una interoperabilidad eficaz entre la codificación de vídeo D3D12 y los escenarios de gráficos, proceso y aprendizaje automático D3D12, que es interesante para escenarios como la ejecución de la inferencia de aprendizaje automático a través de una secuencia de cámara.
Escenarios de streaming de juegos
La API de codificación de vídeo D3D12 permite escenarios de streaming de juegos que requieren una API de bajo nivel altamente eficaz.