Codificação de vídeo D3D12
Este artigo fornece informações gerais para desenvolvedores de drivers sobre o recurso de codificação de vídeo Direct3D12. Para mais informações, incluindo especificidades no nível do aplicativo, consulte a Especificação de codificação de vídeo D3D.
Sobre a codificação de vídeo Direct3D 12
Antes do Windows 11 (WDDM 3.0), o DirectX 12 fornecia interfaces em nível de aplicativo e driver (APIs e DDIs) para oferecer suporte à aceleração de GPU para várias aplicações de vídeo, incluindo decodificação de vídeo, processamento de vídeo e estimativa de movimento.
A partir do Windows 11, o D3D12 adiciona um recurso de codificação de vídeo à família de API/DDI de vídeo. Esse recurso oferece um conjunto coerente de APIs/DDIs de codificação consistentes com a estrutura D3D12 existente e permite que os desenvolvedores executem a codificação de vídeo usando mecanismos de vídeo acelerados pela GPU.
A estrutura de codificação de vídeo fornece acesso aos recursos de aceleração de hardware de codificação de vídeo para diferentes cenários, como Internet das Coisas (IoT), nuvem, APIs de mídia, machine learning e streaming de jogos.
Suporte para AV1 Encode foi adicionado no Windows 11, versão 24H2 (WDDM 3.2). Consulte Codificação de vídeo AV1 D3D12 para saber mais.
Codecs compatíveis
A partir do Windows 11, os codecs suportados são H.264 e HEVC, embora a estrutura de codificação de vídeo D3D12 forneça extensibilidade aberta para codecs mais recentes, como AV1.
Os aspectos específicos do codec da interface da estrutura ficam delegados a estruturas específicas do codec e seu acesso a tipos de união. Por exemplo, a estrutura D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_0082_0 contém uma união com ponteiros para D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_H264_0082_0 específicos do codec e estruturas D3D12DDI_VIDEO_ENCODER_CODEC_CONFIGURATION_HEVC_0082_0 que contém as informações de configuração específicas do codec.
Para preservar a compatibilidade da interface binária na extensibilidade, os tipos de união sempre contêm ponteiros para as estruturas específicas do codec. Os tipos de união têm um tamanho constante com base no tamanho do ponteiro da arquitetura do host. Essa decisão também impede que estruturas que detenham (ou que contenham) membros (ou tipos anônimos) de união alterem seus tamanhos de tipo ao estender a interface. Alguns dos sindicatos contêm apenas ponteiros para tipos de enum; para serem consistentes, esses tipos de enum também são referenciados como ponteiros no caso de um novo codec exigir algum tipo mais complexo do que um enum para representar esses conceitos.
Compatibilidade e recursos de relatórios de codificação de vídeo
A estrutura relacionada a vídeo existente foi estendida para permitir que os drivers relatem suporte e recursos de codificação de vídeo.
D3D12DDI_FEATURE_VERSION_VIDEO_0083_0 é o número da versão que define a primeira implementação completa de todos os marcos de codificação de vídeo D3D12 que foram introduzidos no Windows 11.
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_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
O tempo de execução do D3D chama o retorno de chamada do PFND3D12DDI_VIDEO_GETCAPS do driver para consultar o suporte à codificação de vídeo.
Um driver que oferece suporte à codificação de vídeo fornece ao runtime do D3D ponteiros para suas funções de retorno de chamada de codificação de vídeo na estrutura D3D12DDI_DEVICE_FUNCS_VIDEO_0082_0.
Funções de retorno de chamada de codificação de vídeo D3D12
Um driver implementa as seguintes funções de retorno de chamada para oferecer suporte à codificação de vídeo D3D12.
Crie o objeto de driver que representa o codificador de vídeo:
PFND3D12DDI_CALCPRIVATEVIDEOENCODERSIZE_0082_0 calcula a quantidade de memória que o runtime do D3D precisa alocar para o objeto de driver.
PFND3D12DDI_CREATEVIDEOENCODER_0082_0 cria o objeto codificador de vídeo real que contém o estado da sessão de codificação de vídeo.
Crie o objeto de driver que representa o heap do codificador de vídeo:
PFND3D12DDI_CALCPRIVATEVIDEOENCODERHEAPSIZE_0080_2 calcula a quantidade de memória que o runtime do D3D precisa alocar para o objeto de driver.
PFND3D12DDI_CREATEVIDEOENCODERHEAP_0080_2 cria o objeto heap do codificador de vídeo que contém recursos e estado de driver dependentes da resolução.
Codificar um quadro:
PFND3D12DDI_VIDEO_ENCODE_FRAME_0082_0 registra uma operação de quadro de codificação para a lista de comandos.
Após a operação de codificação, PFND3D12DDI_VIDEO_ENCODE_RESOLVE_OUTPUT_METADATA_0082_0 também deve ser chamado para resolver os metadados de saída da operação de codificação em um formato legível. O layout dos metadados resolvidos do driver é semelhante ao exemplo mostrado em um diagrama na especificação.
Destrua o codificador de vídeo e o heap associado:
Testando
Os testes a seguir estão incluídos como parte do Windows Hardware Lab Kit (WHLK). Para ver os detalhes, consulte o WHLK.
Nome do teste | Descrição |
---|---|
CreateVideoEncoder | Valida a criação de VideoEncoder/VideoEncoderHeap com base nos casos relacionados a CheckFeatureSupport relatados. |
SingleEncodeH264/HEVC | Testes baseados em QR-code para verificações básicas de imagens estruturais. A sequência de imagens de entrada é estampada com conteúdo QR predefinido, depois codificada e decodificada e, finalmente, verificada para garantir que os valores de saída (e, até certo ponto, qualidade), são o esperado. |
EncodeProfileLevelSuggestionsH264/HEVC | Valida que os valores D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT.SuggestedProfile/Level são os esperados com base nas especificações H.264/HEVC e nas configurações passadas como input para D3D12_FEATURE_DATA_VIDEO_ENCODER_SUPPORT. |
EncodeHeapSizeCap | Valida o aumento do espaço ocupado pela memória com diferentes argumentos de entrada crescentes. |
SimpleGOPEncodeH264/HEVC (10bit) | Transcodifica um vídeo de entrada usando diferentes resoluções, padrões GOP, modos de fatia e outras configurações de codec, além de validar o vídeo codificado de saída com relação à diferença de fluxo de vídeo de entrada quando aceitável. Essa comparação é feita por meio da relação Peak Signal to Noise Ratio (PSNR). |
EncodeSubregions/ResolutionReconfiguration | Valida reconfigurações imediatas. |
EncodeH264LongTermReferences | Valida o uso de referências de imagens de longo prazo. |
EncodeIntraRefresh | Valida um cenário simples de intra-atualização com um IPP... P... P... GOP aberto. |
VideoEncodeCommandListFeatures | Valida listas de comandos Predicação e Marcadores para codificação de vídeo. |
VideoEncodeTimestamps | Valida carimbos de data/hora para listas de comandos de codificação de vídeo. |
Cenários de codificação de vídeo
OneCore
O suporte à codificação de vídeo D3D12 permite a codificação de vídeo portátil acelerada por hardware em plataformas onde apenas o D3D12 está disponível. Isso inclui os vários SKUs OneCore usados por computação em nuvem e plataformas de IoT. A aceleração de codificação de vídeo está disponível nesses cenários sem a necessidade de usar soluções específicas da plataforma.
APIs de mídia
Os recursos de codificação de vídeo de forma portátil e de baixo nível podem ser acessados por todos os fornecedores de hardware. Isso permite que APIs de mídia de nível superior (como a Media Foundation) criem suas camadas de mídia sobre essa API, que se encarrega de abstrair as diferentes plataformas de hardware. Dado o design de baixo nível da API, essas camadas de mídia de nível superior podem ser otimizadas para seus cenários, tendo controle em detalhes finos de sincronização e aspectos de alocação/residência de memória da sessão de codificação de vídeo, como controle total do gerenciamento de imagens de referência e responsabilidades de gravação de cabeçalhos de fluxo de bits. Essa mudança de responsabilidades para a camada acima dessa API também permite que os fornecedores de hardware tenham um conjunto consistente de políticas de codificação (por exemplo, heurísticas DPB, como GOP adaptável) na camada de mídia, que pode ser reutilizada em diferentes plataformas de hardware.
Interoperabilidade com gráficos D3D, computação e machine learning
A API de codificação de vídeo D3D12 permite a interoperabilidade eficiente entre a codificação de vídeo D3D12 e cenários de gráficos D3D12, computação e machine learning, o que é interessante para cenários como a execução de inferência de aprendizado de máquina em um fluxo de câmera.
Cenários de streaming de jogos
A API de codificação de vídeo D3D12 possibilita cenários de streaming de jogos que exigem uma API de alto desempenho e baixo nível.