Especificação operacional IAMVideoAccelerator de aceleração de vídeo directx

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

O mecanismo preciso de operação é o seguinte:

  1. Cada perfil de modo restrito definido aqui tem um GUID de VA do DirectX associado que pode ser compatível com IPin::QueryAccept e IPin::ReceiveConnection de um pin de entrada downstream e listado em IAMVideoAccelerator::GetVideoAcceleratorGUIDs.

  2. Da mesma forma, cada tipo de protocolo de criptografia para uso com o DirectX VA deve ter um GUID de tipo de protocolo de criptografia associado que pode ser suportado por IPin::QueryAccept e IPin::ReceiveConnection de um pin de entrada downstream e listado em IAMVideoAccelerator::GetVideoAcceleratorGUIDs. O GUID "sem criptografia" DXVA_NoEncrypt não deve ser enviado nesta lista, pois o suporte para ele é necessário e, portanto, implícito.

  3. Depois de chamar IPin::ReceiveConnection para tentar uma conexão com o pin de entrada downstream, o IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData do decodificador retornará um ponteiro para uma estrutura de dados DXVA_ConnectMode que contém as informações do modo de conexão para a conexão. IAMVideoAccelerator::GetCompBufferInfo deve ser chamado com *pdwNumTypesCompBuffers = 16 e deve retornar informações de buffer compactadas com base na convenção de que o número de tipo de cada buffer (conforme definido na Seção 3.4 da especificação directX VA) pode ser usado diretamente como o índice baseado em zero na matriz de estruturas de dados AMVACompBufferInfo que é retornada. Isso requer que, para todos os tipos de buffer que não serão usados (incluindo o tipo de buffer 0, já que não há nenhum uso definido desse tipo de buffer), o driver acelerador fornecerá estruturas de dados AMVACompBufferInfo com alguma forma de valores de parâmetro "fictícios" (como dwNumCompBuffers=0, dwWidthToCreate=0, dwHeightToCreate=0 e dwBytesToAllocate=0).

  4. As indicações de função DXVA e os buffers de dados associados são enviados usando IAMVideoAccelerator::Execute. A função DXVA é indicada no parâmetro dwFunction da chamada. As únicas funções DXVA relevantes para inicialização são DXVA_ConfigQueryOrReplyFunc e DXVA_EncryptProtocolFunc.

    • Se dwFunction contiver uma DXVA_ConfigQueryOrReplyFunc, o ponteiro lpPrivateInputData para passar dados para o acelerador nesta chamada apontará para uma estrutura de dados de configuração, o ponteiro lpPrivateOutputData para receber informações do acelerador apontará para uma área em que uma estrutura de dados de configuração alternativa ou duplicada possa ser colocada, o ponteiro pamvaBufferInfo para uma matriz de AMVABUFFERINFO deverá ser NULL, e dwNumBuffers devem ser zero. O HRESULT retornado contém a indicação S_OK ou S_FALSE ou E_FAIL ou E_INVALIDARG ou alguma outra indicação de erro HRESULT no caso de um problema grave na execução do protocolo (como um parâmetro de configuração inválido). Todas as chamadas para IAMVideoAccelerator::Execute para todos os usos de DXVA_ConfigQueryOrReplyFunc devem preceder todas as outras chamadas para IAMVideoAccelerator::Execute.

    • Se dwFunction contiver um DXVA_EncryptProtocolFunc, o ponteiro lpPrivateInputData para passar dados para o acelerador nessa chamada apontará para uma estrutura de dados do protocolo de criptografia que começa com DXVA_EncryptProtocolHeader, o ponteiro lpPrivateOutputData para receber informações do acelerador apontará para uma área em que os dados a serem retornados (como um certificado) pelo protocolo de criptografia (que começará com DXVA_EncryptProtocolHeader) poderão ser colocados, o ponteiro pamvaBufferInfo para uma matriz de AMVABUFFERINFO será NULL e dwNumBuffers será zero. O HRESULT retornado contém S_OK desde que o protocolo de criptografia esteja funcionando normalmente e contenha E_FAIL ou E_INVALIDARG ou alguma outra indicação de erro HRESULT no caso de um problema grave na execução do protocolo.

      Após a inicialização da operação da maneira acima, a operação real do decodificador prossegue da seguinte maneira:

  5. IAMVideoAccelerator::BeginFrame deve ser chamado antes de enviar qualquer bDXVA_Func com parâmetros de buffer compactados que causem gravações em uma superfície de destino descompactada. A finalidade de IAMVideoAccelerator::BeginFrame no DirectX VA é associar superfícies de destino a valores de índice e notificar o driver do acelerador de vídeo da intenção de iniciar gravações em uma superfície para que o driver possa responder com uma indicação de se a superfície está pronta para ser substituída. A estrutura AMVABeginFrameInfo passada em IAMVideoAccelerator::BeginFrame deve conter um ponteiro pInputData para um único parâmetro WORD wBeginPictureIndex que corresponda ao índice de quadro passado para IAMVideoAccelerator::BeginFrame (e dwSizeInputData deve ser 2). Esse é o índice a ser usado em um buffer compactado para comandar uma gravação na superfície (por exemplo, para ser usado como wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex ou wPicResampleDestPicIndex). Cada chamada para IAMVideoAccelerator::BeginFrame deve ser emparelhada com uma chamada correspondente para IAMVideoAccelerator::EndFrame , conforme descrito abaixo. Por exemplo, se uma imagem compactada deve ser decodificada e, em seguida, combinada alfa usando a combinação de buffer a buffer front-end com uma imagem gráfica, haveria uma chamada para IAMVideoAccelerator::BeginFrame antes de decodificar a imagem compactada em uma superfície especificada em wDecodedPictureIndex e, em seguida, uma chamada para IAMVideoAccelerator::EndFrame depois de passar todos os buffers compactados usados para decodificar a imagem, em seguida, uma segunda chamada para IAMVideoAccelerator::BeginFrame antes de comandar a combinação de combinação alfa da fonte gráfica com a imagem decodificada em uma superfície especificada em wBlendedDestinationIndex e, em seguida, uma segunda chamada para IAMVideoAccelerator::EndFrame após a operação de combinação de mistura alfa. O ponteiro pOutputData em AMVABeginFrameInfo deve ser NULL (e dwSizeOutputData será "0"). O HRESULT retornado por IAMVideoAccelerator::BeginFrame deve ser:

    • S_OK se a superfície descompactada estiver disponível e pronta para uso.
    • E_PENDING se a superfície descompactada ainda não estiver disponível para uso, mas ficará disponível em breve (se a superfície descompactada estiver sendo lida para exibição e a leitura/exibição da superfície ainda não tiver sido concluída).
    • E_FAIL ou E_INVALIDARG alguma outra indicação de erro somente se um erro de formato de dados ou protocolo for detectado (como um valor incorreto de dwSizeInputData ou um pOutputData não NULL ).
  6. As indicações de função DXVA e os buffers de dados associados são enviados usando IAMVideoAccelerator::Execute. Mais de uma bDXVA_Func valor pode ser indicado na mesma chamada para IAMVideoAccelerator::Execute. Os valores bDXVA_Func devem ser empacotados no parâmetro dwFunction da chamada, com o primeiro comando de função nos oito MSBs, o próximo comando nos próximos oito bits e assim por diante, com todos os bits restantes preenchidos com zeros. O valor 0xFF para bDXVA_Func indica que o bDXVA_Func é estendido para dois ou quatro bytes. Se o segundo byte também for 0xFF, isso indicará que bDXVA_Func é estendido para quatro bytes. Se os quatro bits superiores do terceiro byte forem 0xF ou 0x0, isso indicará que bDXVA_Func contém um DXVA_ConfigQueryOrReplyFunc ou DXVA_EncryptProtocolFunc. Os comandos de vários bytes não devem indicar continuação após o final de dwFunction. É necessário ter cuidado com o decodificador para garantir que nenhuma dependência sequencial esteja presente entre diferentes valores de bDXVA_Func especificados na mesma chamada para IAMVideoAccelerator::Execute e que todas as possíveis condições de corrida (como entre a decodificação de imagens e a mesclagem de subfila, entre o carregamento de subfila e a mesclagem subfila e assim por diante) sejam impedidas por chamadas apropriadas para IAMVideoAccelerator:: BeginFrame e IAMVideoAccelerator::QueryRenderStatus antes das chamadas subsequentes para IAMVideoAccelerator::Execute.

    • Se dwFunction contiver uma DXVA_ConfigQueryOrReplyFunc, o ponteiro lpPrivateInputData para passar dados para o acelerador nesta chamada apontará para uma estrutura de dados de configuração, o ponteiro lpPrivateOutputData para receber informações do acelerador apontará para uma área em que uma estrutura de dados de configuração alternativa ou duplicada possa ser colocada, o ponteiro pamvaBufferInfo para uma matriz de AMVABUFFERINFO deverá ser NULL, e dwNumBuffers devem ser zero. O HRESULT retornado contém a indicação S_OK ou S_FALSE em resposta à consulta, ou E_FAIL ou E_INVALIDARG alguma outra indicação de erro HRESULT no caso de um problema grave na execução do protocolo (como um parâmetro invalid.configuration). Todas as chamadas para IAMVideoAccelerator::Execute para todos os usos de DXVA_ConfigQueryOrReplyFunc devem preceder todas as outras chamadas para IAMVideoAccelerator::Execute.

    • Se dwFunction contiver um DXVA_EncryptProtocolFunc, o ponteiro lpPrivateInputData para passar dados para o acelerador nessa chamada apontará para uma estrutura de dados do protocolo de criptografia que começa com DXVA_EncryptProtocolHeader, o ponteiro lpPrivateOutputData para receber informações do acelerador apontará para uma área em que os dados a serem retornados (como um certificado) pelo protocolo de criptografia (que começará com DXVA_EncryptProtocolHeader) poderão ser colocados, o ponteiro pamvaBufferInfo para uma matriz de AMVABUFFERINFO será NULL e dwNumBuffers será zero. O HRESULT retornado contém S_OK desde que o protocolo de criptografia esteja funcionando normalmente e contenha E_FAIL ou E_INVALIDARG ou alguma outra indicação de erro HRESULT no caso de um problema grave na execução do protocolo.

    • Se dwFunction não contiver um DXVA_ConfigQueryOrReplyFunc ou DXVA_EncryptProtocolFunc, o ponteiro lpPrivateInputData para passar dados para o acelerador apontará para uma lista de descrição do buffer. As quatro primeiras entradas na estrutura de lista de descrição do buffer para cada buffer (dwTypeIndex, dwBufferIndex, dwDataOffset e dwDataSize) devem ser iguais às da estrutura de dados AMVABUFFERINFO para o mesmo buffer. Se bDXVA_Func for igual a "1" for especificado em dwFunction e bPicReadbackRequests for "1", o ponteiro lpPrivateOutputData para receber informações do acelerador apontará para uma área de memória persistente (por exemplo, heap) a ser preenchida em com dados de macroblock de leitura/volta do acelerador (esses dados não têm garantia de estarem presentes até que IAMVideoAccelerator::QueryRenderStatus para gravação no mesmo buffer de parâmetros de imagem indique S_OK conforme descrito no item 10 abaixo). Caso contrário, o ponteiro lpPrivateOutputData para receber informações do acelerador apontará para um único DWORD a ser definido como um dos seguintes valores de indicação (particularmente útil para relatar erros de bitstream na operação VLD fora do host).

      Valor Descrição
      0 Execução OK.
      1 Problema secundário no formato de dados encontrado.
      2 Problema significativo no formato de dados encontrado.
      3 Problema grave no formato de dados encontrado.
      4 Outro problema grave encontrado.

       

      Se qualquer tipo de problema "grave" for indicado, o decodificador de software deverá deixar de operar as funções, a menos que seja possível executar uma ação corretiva. Esses dados retornados do acelerador não devem ser lidos pelo host até que a renderização do buffer para a imagem seja concluída, como pode ser testado por IAMVideoAccelerator::QueryRenderStatus. O HRESULT retornado contém S_OK desde que a operação de interface esteja funcionando normalmente e possa retornar E_FAIL ou E_INVALIDARG ou alguma outra indicação de erro HRESULT no caso de um problema grave.

  7. O buffer de parâmetros de decodificação de imagem deve estar entre os primeiros buffers enviados para a decodificação de cada imagem ao usar IAMVideoAccelerator::Execute com bDXVA_Func igual a "1", e todos os buffers para decodificar uma imagem em um bitstream devem ser enviados antes de quaisquer buffers para decodificar imagens subsequentes. Se um buffer de comando de controle de macroblock for enviado, um buffer de dados de diferença residual correspondente deverá ser enviado (contendo dados para os mesmos macroblocks) com a mesma chamada IAMVideoAccelerator::Execute .

  8. IAMVideoAccelerator::EndFrame deve ser chamado depois que todos os buffers compactados tiverem sido enviados que causarão a criação do conteúdo de saída em uma superfície não compactada especificada (resultado de operações especificadas para wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex ou wPicResampleDestPicIndex). A finalidade dessa chamada para IAMVideoAccelerator::EndFrame é notificar o hardware do acelerador de vídeo de que todos os dados necessários para a operação especificada foram enviados. O ponteiro para os dados a serem enviados downstream por meio de IAMVideoAccelerator::EndFrame deve apontar para um único WORD wEndPictureIndex contendo o índice do quadro que está terminando. Esse parâmetro deve corresponder ao valor wBeginPictureIndex especificado na chamada anterior para IAMVideoAccelerator::BeginFrame antes do envio dos buffers compactados relevantes. Subsequente a uma chamada para IAMVideoAccelerator::EndFrame, A superfície não compactada com índice wEndPictureIndex não deve ser encontrada em nenhuma imagem wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex ou wPicResampleDestPicIndex até que outra chamada para IAMVideoAccelerator::BeginFrame seja emitida para anunciar que isso ocorrerá e um S_OK foi retornado como resultado. No entanto, esse índice de superfície de destino pode ocorrer em comandos de acesso de leitura subsequentes, como wForwardRefPictureIndex, wBackwardRefPictureIndex, wPicResampleSourcePicIndex ou bRefPicSelect[i]. O HRESULT retornado por IAMVideoAccelerator::EndFrame deve ser S_OK, a menos que haja algum tipo de formato de dados ou erro de protocolo; nesse caso, pode ser E_FAIL ou E_INVALIDARG ou alguma outra indicação de erro.

  9. No caso da decodificação baseada em campo (por exemplo, em fluxos de bits MPEG-2), não haverá um mapeamento um-para-um de imagens funcionais no bitstream para superfícies descompactadas na interface do acelerador. Ao decodificar imagens de campo em um bitstream MPEG-2, haverá duas "imagens" decodificadas para produzir uma superfície descompactada de saída completa. Na definição da interface VA do DirectX, cada quadro corresponde a cada uso de wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex ou wPicResampleDestPicIndex. Portanto, dois pares de chamadas para IAMVideoAccelerator::BeginFrame e IAMVideoAccelerator::EndFrame são necessários para a decodificação de imagens de campo em superfícies descompactadas de saída.

  10. Uma chamada para IAMVideoAccelerator::QueryRenderStatus com dwFlags igual a zero, que ocorre em algum momento após uma chamada para IAMVideoAccelerator::EndFrame com um wEndPictureIndex específico e verifica o status de um buffer que foi enviado que continha o wEndPictureIndex em wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex ou wPicResampleDestPicIndex retornará uma indicação de S_OK se todas as operações para gravar os dados no A superfície descompactada foi concluída e retornará E_PENDING se a operação ainda não tiver sido concluída. E_FAIL ou E_INVALIDARG ou alguma outra indicação de erro pode ser retornada no caso de um erro de protocolo.

Mapeando aceleração de vídeo DirectX para IAMVideoAccelerator