Compartilhar via


Usando a Captura do WDDM no DirectShow

[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.]

Este tópico se aplica ao Windows Vista e posterior.

Algumas placas de vídeo integraram a funcionalidade de captura de vídeo. Nesses cartões, os quadros de vídeo capturados são colocados na VRAM (memória de vídeo). Antes do Windows Vista, não havia mecanismo padrão para processar os quadros enquanto eles permaneceram na VRAM. Em vez disso, os dados tinham que ser copiados para a memória do sistema, processados e copiados de volta para a VRAM para exibição. No Windows Vista, o DirectShow agora dá suporte a um mecanismo para manter os quadros de vídeo na VRAM em todo o pipeline de processamento, da captura à exibição.

O filtro KsProxy determina se o driver dá suporte à captura de superfície de VRAM consultando o driver para a propriedade KSPROPERTY_PREFERRED_CAPTURE_SURFACE. (Essa propriedade está documentada na documentação do Kit de Driver do Windows.) Se o driver der suporte à captura de superfície de VRAM, o KsProxy alocará um tipo especial de amostra de mídia que contém um ponteiro para uma superfície Direct3D.

Em seguida, o KsProxy determina se o filtro downstream dá suporte à DXVA (Aceleração de Vídeo DirectX) 2.0, da seguinte maneira:

  1. O KsProxy consulta o pino de entrada downstream para a interface IMFGetService .
  2. Se o pin expor IMFGetService, o KsProxy chamará IMFGetService::GetService para a interface IDirect3DDeviceManager . O service identier é MR_VIDEO_ACCELERATION_SERVICE.

Essas duas interfaces estão documentadas na documentação do SDK do Media Foundation.

Se o filtro downstream não der suporte ao DXVA 2.0, o KsProxy alocará um buffer de memória do sistema adicional. Ele usa esse buffer para copiar os quadros de vídeo da VRAM para a memória do sistema. O método IMediaSample::GetPointer do exemplo de mídia retorna um ponteiro para esse buffer de memória do sistema.

No entanto, se o filtro downstream der suporte à DXVA 2.0, o KsProxy não alocará um buffer de memória do sistema. Nesse caso, o método GetPointer retorna E_NOTIMPL. Em vez disso, espera-se que o filtro downstream acesse diretamente a superfície Direct3D da amostra. Há duas maneiras de o filtro downstream obter um ponteiro para a superfície, ambas equivalentes:

  • Consulte o exemplo para a interface IMFGetService e chame GetService para a interface IDirect3DSurface9 . O identificador de serviço é MR_BUFFER_SERVICE.
  • Consulte o exemplo para a interface IMediaSample2Config e chame IMediaSample2Config::GetSurface.

Tópicos avançados de captura