Uso de la captura de WDDM en DirectShow
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Este tema se aplica a Windows Vista y versiones posteriores.
Algunas tarjetas de vídeo tienen funcionalidad integrada de captura de vídeo. En estas tarjetas, los fotogramas de vídeo capturados se colocan en memoria de vídeo (VRAM). Antes de Windows Vista, no había ningún mecanismo estándar para procesar los fotogramas mientras seguían en VRAM. En su lugar, los datos tenían que copiarse en la memoria del sistema, procesarse y, a continuación, copiarse de nuevo en VRAM para su presentación. En Windows Vista, DirectShow ahora admite un mecanismo para mantener los fotogramas de vídeo en VRAM a lo largo de la canalización de procesamiento, desde la captura hasta la visualización.
El filtro KsProxy determina si el controlador admite la captura de superficie VRAM consultando el controlador para la propiedad KSPROPERTY_PREFERRED_CAPTURE_SURFACE. (Esta propiedad se documenta en la documentación del Kit de controladores de Windows). Si el controlador admite la captura de superficie VRAM, KsProxy asigna un tipo especial de muestra multimedia que contiene un puntero a una superficie de Direct3D.
A continuación, KsProxy determina si el filtro de bajada admite DirectX Video Acceleration (DXVA) 2.0, como se indica a continuación:
- KsProxy consulta el pin de entrada de bajada para la interfaz IMFGetService .
- Si el pin expone IMFGetService, KsProxy llama a IMFGetService::GetService para la interfaz IDirect3DDeviceManager . El identificador de servicio es MR_VIDEO_ACCELERATION_SERVICE.
Ambas interfaces se documentan en la documentación del SDK de Media Foundation.
Si el filtro de bajada no admite DXVA 2.0, KsProxy asigna un búfer de memoria del sistema adicional. Usa este búfer para copiar los fotogramas de vídeo de VRAM a la memoria del sistema. El método IMediaSample::GetPointer del ejemplo multimedia devuelve un puntero a este búfer de memoria del sistema.
Sin embargo, si el filtro de bajada admite DXVA 2.0, KsProxy no asigna un búfer de memoria del sistema. En ese caso, el método GetPointer devuelve E_NOTIMPL. En su lugar, se espera que el filtro de bajada acceda directamente a la superficie direct3D de la muestra. Hay dos maneras de que el filtro de bajada obtenga un puntero a la superficie, ambos equivalentes:
- Consulte el ejemplo de la interfaz IMFGetService y llame a GetService para la interfaz IDirect3DSurface9 . El identificador de servicio se MR_BUFFER_SERVICE.
- Consulte el ejemplo de la interfaz IMediaSample2Config y llame a IMediaSample2Config::GetSurface.
Temas relacionados