codificación de vídeo AV1, D3D12
La característica de codificación de vídeo Direct3D12 se amplía para incluir la codificación AV1 a partir de la versión 24H2 de Windows 11 (WDDM 3.2). En este artículo se describen los puntos de extensión en los que la DDI de codificación de vídeo D3D12 existente necesita modificaciones y nuevas estructuras para admitir la codificación AV1. Para obtener más información, incluidos los detalles relacionados con la aplicación, consulte la especificación de codificación de vídeo AV1 D3D12.
Extensiones para el control de velocidad
Las siguientes enumeraciones existentes están actualizadas con extensiones para el control de velocidad y la compatibilidad con el control de velocidad:
Se agregan indicadores de compatibilidad del control de velocidad a D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAGS_0083_0
Se agregan indicadores del control de velocidad a D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080
Se actualizan las siguientes estructuras (Extensión 1) D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_XXX1 y D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS para incluirlas. Se agrega QualityVsSpeed a todos los modos y se agregan además VBVCapacity y InitialVBVFullness a _QVBR1.
Cuando se activa D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAG_0096_ENABLE_EXTENSION1_SUPPORT, las estructuras extendidas del control de velocidad se usan en D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS_0080_2.pConfiguration_XXX; de lo contrario, las estructuras heredadas se usan cuando se deshabilitan según la tabla documentada en la página de referencia de D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080.
Extensiones de compatibilidad para codificación de vídeo
Se ha ampliado la plataforma relacionada con vídeo existente para permitir que los controladores para indicar la compatibilidad y funcionalidades de codificación de vídeo AV1. En esta sección se incluyen las estructuras y enumeraciones agregadas o actualizadas que se usan para consultar e indicar la compatibilidad con la codificación de vídeo AV1.
D3D12DDI_FEATURE_VERSION_VIDEO_0095_0 es el número de versión que define la implementación mínima de todos los hitos de codificación de vídeo D3D12 que se han incorporado en la versión 24H2 de Windows 11 (WDDM 3.2)
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_0095_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG
- D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1
D3D12DDI_VIDEO_ENCODER_CODEC_0095_AV1 se agrega a D3D12DDI_VIDEO_ENCODER_CODEC_0080
La enumeración D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 se ha agregado para definir los perfiles de AV1 admitidos por el controlador. El controlador usa D3D12DDICAPS_VIDEO_ENCODER_INPUT_FORMAT_DATA_0080_2 para indicar formatos admitidos opcionalmente en una entrada de D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 determinada en la consulta.
Se actualiza D3D12DDI_VIDEO_ENCODER_PROFILE_DESC_0080_2 para incluir el perfil de AV1 (pAV1Profile).
Las siguientes estructuras y enumeraciones se agregan o amplían para admitir la codificación AV1:
D3D12DDI_VIDEO_ENCODER_AV1_LEVEL_TIER_CONSTRAINTS_0095 (pAV1LevelSetting se agrega a D3D12DDI_VIDEO_ENCODER_LEVEL_SETTING_0080_2)
D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0080 se amplía para incluir D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_UNIFORM_GRID_PARTITION y D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_CONFIGURABLE_GRID_PARTITION.
D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_EIGHTH_PIXEL_0095 se agrega a D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_0080
D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095 y D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095 y D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095 y D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095 y D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_CODEC_CONFIGURATION_SUPPORT con pAV1Support se ha agregado a D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_0083_0
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095 y D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_PICTURE_CONTROL_SUPPORT_0095 con pAV1Support se ha agregado a D3D12DDI_VIDEO_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT_0080_2
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095 y D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_VALIDATION_0095_FLAGS
D3D12DDI_FEATURE_DATA_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_0095 y D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095
pAV1Config se agrega a D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0
El indicador D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAG_0080_SUBREGION_LAYOUT_MODE_NOT_SUPPORTED se agrega a D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAGS_0080 para usar el límite de consulta ampliado D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1.
D3D12DDICAPS_VIDEO_ENCODER_SUPPORT1_DATA_0096 se agrega para ampliar la consulta previa de D3D12DDICAPS_VIDEO_ENCODER_SUPPORT_DATA_0083_0 con parámetros añadidos al final de la estructura. Esta consulta ampliada se puede usar con todos los códecs H264, HEVC y AV1 y debe actuar exactamente como semántica de D3D12_FEATURE_VIDEO_ENCODER_SUPPORT.
La semántica de los miembros MaxSubregionsNumber, SubregionBlockPixelsSize y QPMapRegionPixelsSize de D3D12DDI_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS_0080_2 se han actualizado para AV1.
Se ha agregado _D3D12DDI_VIDEO_ENCODER_AV1_SEQUENCE_STRUCTURE_0095 y pAV1SequenceStructure se agrega a D3D12DDI_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_0082_0.
Operación de codificación
Valores esperados de encabezado de secuencia de bits para AV1
Responsabilidades de codificación de encabezados de host o controlador
Con un fotograma codificado con bloques K, el controlador escribe los elementos de sintaxis K de decode_tile() AV1 en la secuencia de bits comprimida, correspondiente a los bloques solicitados en los argumentos EncodeFrame.
El cliente de la API compila los elementos de sintaxis de tile_group_obu() AV1 con elementos tile_start_and_end_present_flag/tg_start/tg_end para organizar los bloques en grupos según sea necesario con la condición de que los bloques se coloquen secuencialmente. El elemento tile_size_minus_1 se codifica a través de la información del bloque D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA relacionado y los elementos decode_tile() se copian del búfer de la secuencia de bits comprimida. Por último, cada tile_group_obu() se coloca alrededor de elementos open_bitstream_unit() de tipo OBU_TILE_GROUP y llevan un OBU_FRAME_HEADER antepuesto. En el caso de un único grupo de bloques, se puede usar un tipo de OBU_FRAME en su lugar.
El cliente de la API es responsable de deducir el obu_extension_flag como !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1)
en el fotograma actual, así como el código de temporal_id y spatial_id en el open_bitstream_unit() si es necesario.
Los envíos de EncodeFrame están en orden de codificación, como los demás códecs implementados en la API de codificación D3D12.
Cambios de resolución y escalabilidad espacial
Si el controlador registra D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE, solo se aplicará en los cambios de resolución en un fotograma clave.
El encabezado de secuencia activo debe tener la sintaxis max_frame_*_minus_1 cambiada a la resolución máxima presente en el ID3D12VideoEncoderHeap asociado que se está usando. Los distintos fotogramas que usan resoluciones también presentes en el ID3D12VideoEncoderHeap asociado pueden usar la sintaxis de AV1 frame_size_override_flag en frame_size() para trasladar el cambio de resolución.
Si se admite D3D12_VIDEO_ENCODER_AV1_FRAME_TYPE_FLAG_SWITCH_FRAME, los fotogramas de referencia deben apuntar a una resolución mayor o igual que el fotograma de cambio actual que se está codificando y las diferentes resoluciones deben estar presentes en el ID3D12VideoEncoderHeap asociado que se usa.
De forma similar, si se admite la escalabilidad espacial, las diferentes resoluciones de los fotogramas de referencia deben estar presentes en el ID3D12VideoEncoderHeap asociado que se usa.
Notas sobre el control de velocidad
El rango aceptado para D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_QVBR1_0096.ConstantQualityTarget es [0..63]. El valor más bajo produce la mayor calidad.
En general, D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAG_0083_0_RATE_CONTROL_RECONFIGURATION_AVAILABLE se aplica a la calidad frente al ajuste de velocidad y a los siguientes parámetros de control de velocidad de los diferentes modos de control de velocidad: QP en QP constante, velocidades de bits y niveles de calidad en CBR, VBR y QVBR. El controlador puede devolver D3D12DDI_VIDEO_ENCODER_ENCODE_ERROR_FLAG_0082_0_RECONFIGURATION_REQUEST_NOT_SUPPORTED en D3D12DDI_VIDEO_ENCODER_OUTPUT_METADATA_0083_0.EncodeErrorFlags para otra reconfiguración de parámetros de control de velocidad no compatibles.
API de operación de codificación
Las siguientes estructuras y enumeraciones se agregan o actualizan con extensiones para admitir la operación de codificación AV1:
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_WARPED_MOTION_INFO_0095
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_PICTURE_DESCRIPTOR_0095
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_LOOP_FILTER_DELTA_CONFIG_0095
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_QUANTIZATION_DELTA_CONFIG_0095
pAV1PicData se agrega a D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_0082_0
D3D12DDI_VIDEO_ENCODER_AV1_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_TILES_0095
pTilesPartition_AV1 se agrega a D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_0080_2
Además, la devolución de llamada PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 de un controlador existente debe actualizarse para controlar el diseño del búfer resuelto específico de AV1 agregado para la codificación AV1.