Propriedades de captura de VRAM
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 de a captura ser iniciada, o proxy KS envia uma solicitação de propriedade get de KSPROPERTY_PREFERRED_CAPTURE_SURFACE. O minidriver deve retornar valores diferentes dependendo se o driver está capturando na memória do sistema ou na VRAM.
Capturando na memória do sistema
Para capturar a memória do sistema, retorne KS_CAPTURE_ALLOC_SYSTEM_AGP.
Em seguida, o driver de captura recebe uma KSPROPERTY_CURRENT_CAPTURE_SURFACE solicitação set-property com um tipo de valor de memória do sistema. O driver de captura agora atua como um dispositivo DMA master 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 pino de saída.
Para obter informações sobre como implementar o DMA no retorno de chamada do processo de fixação, consulte DMA baseado em pacote 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 um thread separado para cada pin.
Capturando para VRAM
Se o driver der suporte à captura de VRAM, retorne KS_CAPTURE_ALLOC_VRAM em resposta a KSPROPERTY_PREFERRED_CAPTURE_SURFACE.
O minidriver recebe um KSPROPERTY_DISPLAY_ADAPTER_GUID solicitação get-property, consultando o GUID do adaptador de exibição.
Obtenha o GUID do adaptador do driver de miniporto gráfico 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 DXGK (kernel de elementos gráficos) do DirectX e é passada para o driver de miniporte quando o adaptador é inicializado.
Se o pin for compatível com o transporte de VRAM e os GUIDs do adaptador de exibição e do filtro downstream corresponderem, o módulo proxy KS será selecionado como o alocador. O proxy notifica o pino de captura sobre a seleção do transporte 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 get 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 devem 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.
Retornar o endereço mapeado no VRAM_SURFACE_INFO_PROPERTY_S que foi fornecido na solicitação de propriedade. O driver de captura pode emitir um IOCTL para solicitar o mapeamento do driver de miniporto de exibição.
Em segundo lugar, a AVStrMiniPinProcess do filtro de captura é chamada quando um pin tem dados a serem processados.
O minidriver agora deve chamar KsPinGetLeadingEdgeStreamPointer para adquirir e bloquear o ponteiro de fluxo de borda à esquerda 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 Dados do cabeçalho do fluxo, localize 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.
Manipule a conclusão do quadro 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 executar carimbo de data/hora, defina PresentationTime, Duration e, se relevante, OptionsFlags em KSSTREAM_HEADER.
Chame KsStreamPointerAdvanceOffsets para continuar processando ou excluindo todos os clones e conclua a solicitação chamando KsStreamPointerDelete.
O método CCapturePin::P rocessD3DSurface no arquivo Capture.cpp no AVSHwS (Driver de Exemplo de Hardware Simulado) do AVStream nos exemplos do WDK (Kit de Driver do Windows) mostra uma maneira de implementar esse retorno de chamada para suporte à VRAM.