Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um minidriver AVStream centrado em pin deve dar suporte a várias propriedades para que ele seja capturado na VRAM. Esta seção descreve a sequência de solicitações que o minidriver recebe antes e durante o processamento de VRAM.
Antes da captura ser iniciada, o proxy KS envia uma solicitação KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property. O minidriver deve retornar valores diferentes dependendo se o driver está capturando na memória do sistema ou VRAM.
Capturando na memória do sistema
Para capturar na memória do sistema, retorne KS_CAPTURE_ALLOC_SYSTEM_AGP.
Em seguida, o driver de captura recebe uma solicitação KSPROPERTY_CURRENT_CAPTURE_SURFACE set-property com um tipo de valor de memória do sistema. O driver de captura agora atua como um dispositivo DMA mestre de barramento e coloca os dados diretamente na memória do sistema.
Nesse modo, o driver de captura recebe buffers de memória do sistema na função de retorno de chamada AVStrMiniPinProcess do pin de saída.
Para obter informações sobre como implementar o DMA na função de callback do processo de pino, consulte DMA baseado em pacotes no AVStream.
Para capturar com vários pinos de saída (por exemplo, vídeo separado, áudio e pinos de VBI), cada pino deve dar suporte às propriedades de VRAM e ao processamento, conforme descrito anteriormente. O proxy gera uma thread separada para cada pin.
Capturando para VRAM
Se o driver suporta a captura de VRAM, retorne KS_CAPTURE_ALLOC_VRAM em resposta a KSPROPERTY_PREFERRED_CAPTURE_SURFACE.
Em seguida, o minidriver recebe uma solicitação KSPROPERTY_DISPLAY_ADAPTER_GUID get-property, consultando o GUID do adaptador de exibição.
Obtenha o GUID do adaptador a partir do driver gráfico de miniporto fornecido pelo fornecedor. A estrutura DXGK_INTERFACESPECIFICDATA contém o GUID do adaptador a ser retornado na solicitação de propriedade. Essa estrutura é gerada pelo subsistema de kernel de gráficos (DXGK) do DirectX e é passada para o driver de miniporte quando o adaptador é inicializado.
Se o pino for compatível com o transporte de VRAM e os GUIDs do adaptador gráfico e do filtro a jusante corresponderem, o módulo proxy KS será selecionado como alocador. O proxy notifica o pino de captura sobre a seleção da transferência de superfície de VRAM entre os pinos, definindo a propriedade KSPROPERTY_CURRENT_CAPTURE_SURFACE com o tipo de superfície selecionado para a captura.
Se o pino receber KS_CAPTURE_ALLOC_VRAM, ele receberá solicitações de processamento de VRAM.
As solicitações de processamento de VRAM consistem em duas partes. Primeiro, o driver de captura recebe uma solicitação de KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. O manipulador get recebe um IRP que contém o identificador de superfície de VRAM no modo kernel.
O driver de captura ou o driver de miniporto de exibição deve mapear o identificador de superfície da VRAM para um endereço físico VRAM real. O identificador de superfície de VRAM não permanece válido; não armazene-o em cache para uso posterior.
Retorne o endereço mapeado no VRAM_SURFACE_INFO_PROPERTY_S fornecido na solicitação de propriedade. O driver de captura pode emitir um IOCTL para solicitar o mapeamento do display miniport driver.
Em segundo lugar, o AVStrMiniPinProcess do filtro de captura é chamado quando um pin tem dados a serem processados.
O minidriver agora deve chamar KsPinGetLeadingEdgeStreamPointer para adquirir e bloquear o ponteiro de fluxo de borda superior para esse pino. Essa função retorna um ponteiro para uma estrutura KSSTREAM_POINTER .
Essa estrutura de ponteiro de fluxo contém um ponteiro para um KSSTREAM_HEADER.
No membro Data do cabeçalho do fluxo, encontre um ponteiro para uma estrutura VRAM_SURFACE_INFO.
Essa estrutura contém o endereço físico retornado em resposta a KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. O membro hSurface que representa o identificador é NULL.
O driver de captura deve:
Programe o hardware de captura com o endereço físico da VRAM.
Trate da conclusão do frame de vídeo.
Preencha o membro cbCaptured de VRAM_SURFACE_INFO com o número de bytes copiados para a superfície de VRAM. Não defina o membro DataUsed de KSSTREAM_HEADER com o número de bytes capturados. Em vez disso, defina DataUsed como sizeof(VRAM_SURFACE_INFO).
Se o driver de captura realizar a marcação de data/hora, defina PresentationTime, Duration e, se relevante, OptionsFlags em KSSTREAM_HEADER.
Chame KsStreamPointerAdvanceOffsets para continuar processando ou excluir todos os clones e conclua a solicitação chamando KsStreamPointerDelete.
O método CCapturePin::ProcessD3DSurface no arquivo Capture.cpp no Driver de Exemplo de Hardware Simulado (AVSHwS) do AVStream nos exemplos do Windows Driver Kit (WDK) demonstra uma maneira de implementar esse retorno de chamada para suporte à VRAM.