Codificação de vídeo D3D12 AV1
O recurso de codificação de vídeo Direct3D12 é estendido para dar suporte à codificação AV1 a partir do Windows 11, versão 24H2 (WDDM 3.2). Este artigo descreve os pontos de extensão em que a DDI de codificação de vídeo D3D12 existente precisa de modificações e novas estruturas para dar suporte à codificação AV1. Para obter mais informações, incluindo especificidades no nível do aplicativo, consulte a Especificação de codificação de vídeo AV1 D3D12.
Extensões para controle de taxa
As enumerações existentes a seguir estão atualizadas com extensões para controle de taxa e suporte a controle de taxa:
Os sinalizadores de suporte de controle de taxa são adicionados ao D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAGS_0083_0
Sinalizadores de controle de taxa são adicionados ao D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080
As seguintes estruturas estendidas (Extensão 1) D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_XXX1 são adicionadas e a D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS é atualizada para incluí-las. QualityVsSpeed é adicionado a todos os modos e VBVCapacity e InitialVBVFullness são adicionados a _QVBR1.
Quando a D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAG_0096_ENABLE_EXTENSION1_SUPPORT está habilitada, as estruturas de controle de taxa estendida são usadas em D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_CONFIGURATION_PARAMS_0080_2.pConfiguration_XXX, caso contrário, as estruturas herdadas são usadas quando desabilitadas de acordo com a tabela documentada na página de referência D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_FLAGS_0080.
Extensões de suporte de codificação de vídeo
A estrutura relacionada a vídeo existente é estendida, permitindo que os drivers relatem suporte e recursos de codificação de vídeo AV1. Esta seção lista as estruturas e enumerações adicionadas ou atualizadas usadas para consultar e relatar o suporte à codificação de vídeo AV1.
D3D12DDI_FEATURE_VERSION_VIDEO_0095_0 é o número de versão que define a implementação mínima de todos os marcos de codificação de vídeo D3D12 introduzidos no Windows 11, versão 24H2 (WDDM 3.2)
A enumeração D3D12DDICAPS_TYPE_VIDEO_0020 foi estendida para incluir os seguintes valores de suporte de codificação de vídeo:
- D3D12DDICAPS_TYPE_VIDEO_0095_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG
- D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1
A D3D12DDI_VIDEO_ENCODER_CODEC_0095_AV1 é adicionada à D3D12DDI_VIDEO_ENCODER_CODEC_0080
A enumeração D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 foi adicionada para definir os perfis AV1 suportados pelo driver. O driver usa a D3D12DDICAPS_VIDEO_ENCODER_INPUT_FORMAT_DATA_0080_2 para relatar formatos opcionalmente suportados por uma determinada entrada D3D12DDI_VIDEO_ENCODER_AV1_PROFILE_0095 para a consulta.
A D3D12DDI_VIDEO_ENCODER_PROFILE_DESC_0080_2 é atualizada para incluir o perfil AV1 (pAV1Profile).
As seguintes estruturas e enumerações são adicionadas ou estendidas para oferecer suporte à codificação AV1:
A D3D12DDI_VIDEO_ENCODER_AV1_LEVEL_TIER_CONSTRAINTS_0095 (pAV1LevelSetting é adicionada à D3D12DDI_VIDEO_ENCODER_LEVEL_SETTING_0080_2)
D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0080 é estendida para incluir D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_UNIFORM_GRID_PARTITION e D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_MODE_0095_CONFIGURABLE_GRID_PARTITION.
A D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_EIGHTH_PIXEL_0095 é adicionada à D3D12DDI_VIDEO_ENCODER_MOTION_ESTIMATION_PRECISION_MODE_0080
D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095 e D3D12DDI_VIDEO_ENCODER_AV1_TX_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095 e D3D12DDI_VIDEO_ENCODER_AV1_INTERPOLATION_FILTERS_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095 e D3D12DDI_VIDEO_ENCODER_AV1_SEGMENTATION_MODE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095 e D3D12DDI_VIDEO_ENCODER_AV1_REFERENCE_WARPED_MOTION_TRANSFORMATION_0095_FLAGS
A D3D12DDI_VIDEO_ENCODER_AV1_CODEC_CONFIGURATION_SUPPORT, com pAV1Support adicionada à D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_SUPPORT_0083_0
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095 e D3D12DDI_VIDEO_ENCODER_AV1_FRAME_TYPE_0095_FLAGS
D3D12DDI_VIDEO_ENCODER_CODEC_AV1_PICTURE_CONTROL_SUPPORT_0095, com pAV1Support adicionada à D3D12DDI_VIDEO_ENCODER_CODEC_PICTURE_CONTROL_SUPPORT_0080_2
D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095 e D3D12DDI_VIDEO_ENCODER_AV1_FRAME_SUBREGION_LAYOUT_CONFIG_VALIDATION_0095_FLAGS
D3D12DDI_FEATURE_DATA_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_0095 e D3D12DDI_VIDEO_ENCODER_FRAME_SUBREGION_LAYOUT_CONFIG_SUPPORT_0095
A pAV1Config é adicionada à D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0
O sinalizador D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAG_0080_SUBREGION_LAYOUT_MODE_NOT_SUPPORTED é adicionado ao D3D12DDI_VIDEO_ENCODER_VALIDATION_FLAGS_0080 para ser usado com o limite de consulta estendido D3D12DDICAPS_TYPE_VIDEO_0096_ENCODER_SUPPORT1.
D3D12DDICAPS_VIDEO_ENCODER_SUPPORT1_DATA_0096 é adicionado para estender a consulta anterior D3D12DDICAPS_VIDEO_ENCODER_SUPPORT_DATA_0083_0, com parâmetros adicionados à parte inferior da estrutura. Essa consulta estendida pode ser usada com todos os codecs H264, HEVC e AV1 e deve se comportar exatamente como uma semântica D3D12_FEATURE_VIDEO_ENCODER_SUPPORT.
A semântica para os membros MaxSubregionsNumber, SubregionBlockPixelsSize e QPMapRegionPixelsSize do D3D12DDI_VIDEO_ENCODER_RESOLUTION_SUPPORT_LIMITS_0080_2 é atualizada para AV1.
_D3D12DDI_VIDEO_ENCODER_AV1_SEQUENCE_STRUCTURE_0095 é adicionado pAV1SequenceStructure é adicionado ao D3D12DDI_VIDEO_ENCODER_SEQUENCE_GOP_STRUCTURE_0082_0.
Operação de codificação
Valores de cabeçalho de fluxo de bits esperados para AV1
Responsabilidades de codificação de cabeçalho do driver/host
Dado um quadro codificado com blocos K, o driver grava os elementos de sintaxe K decode_tile() AV1 no fluxo de bits compactado, correspondendo aos blocos solicitados nos argumentos EncodeFrame.
Em seguida, o API Client cria os elementos de sintaxe AV1 tile_group_obu() com elementos tile_start_and_end_present_flag/tg_start/tg_end para organizar os blocos em grupos conforme desejado, com a condição de que os blocos sejam colocados sequencialmente. O elemento tile_size_minus_1 é codificado a partir das informações do bloco D3D12_VIDEO_ENCODER_FRAME_SUBREGION_METADATA relacionadas e os elementos decode_tile() são copiados do buffer de fluxo de bits compactado. Finalmente, cada tile_group_obu() é envolvido em torno de elementos open_bitstream_unit() do tipo OBU_TILE_GROUP e precedido com um OBU_FRAME_HEADER. Para um único grupo de blocos, um tipo de OBU_FRAME pode ser usado.
O API Client é responsável por inferir obu_extension_flag quanto !(TemporalLayerIndexPlus1 || SpatialLayerIndexPlus1)
ao quadro atual e também codificar, se necessário, temporal_id e spatial_id no open_bitstream_unit().
Os envios de EncodeFrame estão em ordem de codificação, como os outros codecs implementados na API de codificação D3D12.
Alterações de resolução e escalabilidade espacial
Se o driver relatar D3D12_VIDEO_ENCODER_SUPPORT_FLAG_RESOLUTION_RECONFIGURATION_AVAILABLE, ele ainda se aplicará somente às alterações de resolução em um quadro chave.
O cabeçalho de sequência ativa deve ter a sintaxe max_frame_*_minus_1 definida para a resolução máxima presente no ID3D12VideoEncoderHeap associado usado. Diferentes quadros usando resoluções também presentes no ID3D12VideoEncoderHeap associado podem usar a sintaxe AV1 frame_size_override_flag em frame_size() para transmitir a alteração da resolução.
Se o D3D12_VIDEO_ENCODER_AV1_FRAME_TYPE_FLAG_SWITCH_FRAME for suportado, os quadros de referência devem apontar para uma resolução maior ou igual ao quadro de switch atual que está sendo codificado e as diferentes resoluções devem estar todas presentes no ID3D12VideoEncoderHeap associado usado.
Da mesma forma, se houver suporte para escalabilidade espacial, as diferentes resoluções dos quadros de referência devem estar todas presentes no ID3D12VideoEncoderHeap associado usado.
Observações sobre controle de taxa
O intervalo aceito para D3D12DDI_VIDEO_ENCODER_RATE_CONTROL_QVBR1_0096.ConstantQualityTarget é [0..63]. O menor valor gera a maior alta qualidade.
Em geral, o D3D12DDI_VIDEO_ENCODER_SUPPORT_FLAG_0083_0_RATE_CONTROL_RECONFIGURATION_AVAILABLE se aplica ao ajuste de qualidade versus velocidade e aos seguintes parâmetros de controle de taxa dos diferentes modos de controle de taxa: QP em QP constante, taxas de bits e níveis de qualidade em CBR, VBR e QVBR. O driver pode retornar D3D12DDI_VIDEO_ENCODER_ENCODE_ERROR_FLAG_0082_0_RECONFIGURATION_REQUEST_NOT_SUPPORTED em D3D12DDI_VIDEO_ENCODER_OUTPUT_METADATA_0083_0.EncodeErrorFlags para outra reconfiguração de parâmetro de controle de taxa não suportado.
Operação de codificação API
As seguintes estruturas e enumerações são adicionadas ou atualizadas com extensões para oferecer suporte à operação de codificação 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 é adicionado ao D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_CODEC_DATA_0082_0
D3D12DDI_VIDEO_ENCODER_AV1_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_TILES_0095
pTilesPartition_AV1 é adicionado ao D3D12DDI_VIDEO_ENCODER_PICTURE_CONTROL_SUBREGIONS_LAYOUT_DATA_0080_2
Além disso, o retorno de chamada PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 existente de um driver precisa ser atualizado para lidar com o layout de buffer resolvido específico do AV1 adicionado para a codificação AV1.