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:

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.

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:

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.