Propiedades de captura de VRAM
Un minidriver AVStream centrado en patillas debe admitir varias propiedades para que se capturen en VRAM. En esta sección se describe la secuencia de solicitudes que recibe el minidriver antes y durante el procesamiento de VRAM.
Antes de iniciar la captura, el proxy de KS envía una solicitud de KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property. El minidriver debe devolver valores diferentes en función de si el controlador está capturando en memoria del sistema o VRAM.
Captura en la memoria del sistema
Para capturar en la memoria del sistema, devuelva KS_CAPTURE_ALLOC_SYSTEM_AGP.
A continuación, el controlador de captura recibe una solicitud KSPROPERTY_CURRENT_CAPTURE_SURFACE set-property con un tipo de valor de memoria del sistema. El controlador de captura actúa ahora como dispositivo DMA maestro de bus y coloca los datos directamente en la memoria del sistema.
En este modo, el controlador de captura recibe búferes de memoria del sistema en la función de devolución de llamada AVStrMiniPinProcess del pin de salida.
Para obtener información sobre cómo implementar DMA en la devolución de llamada del proceso de anclaje, consulte DMA basado en paquetes en AVStream.
Para capturar con varios pines de salida (por ejemplo, vídeo independiente, audio y patillas VBI), cada patilla debe admitir las propiedades de VRAM y el procesamiento como se ha descrito anteriormente. El proxy genera un subproceso independiente para cada patilla.
Captura en VRAM
Si el controlador admite la captura de VRAM, devuelva KS_CAPTURE_ALLOC_VRAM en respuesta a KSPROPERTY_PREFERRED_CAPTURE_SURFACE.
A continuación, el minidriver recibe una solicitud de KSPROPERTY_DISPLAY_ADAPTER_GUID get-property, consultando el GUID del adaptador de pantalla.
Obtenga el GUID del adaptador del controlador de miniport gráficos proporcionado por el proveedor. La estructura DXGK_INTERFACESPECIFICDATA contiene el GUID del adaptador que se va a devolver en la solicitud de propiedad. Esta estructura se genera mediante el subsistema del kernel de gráficos directX (DXGK) y se pasa al controlador de miniporte cuando se inicializa el adaptador.
Si el pin admite el transporte VRAM y los GUID del adaptador de pantalla y la coincidencia de filtro de bajada, el módulo de proxy KS se selecciona como asignador. El proxy notifica al pin de captura sobre la selección del transporte de superficie de VRAM entre los pines estableciendo la propiedad KSPROPERTY_CURRENT_CAPTURE_SURFACE con el tipo de superficie seleccionado para la captura.
Si el pin recibe KS_CAPTURE_ALLOC_VRAM, recibirá solicitudes de procesamiento de VRAM.
Las solicitudes de procesamiento de VRAM constan de dos partes. En primer lugar, el controlador de captura recibe una solicitud get-request de KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. El controlador get recibe un IRP que contiene el identificador de superficie VRAM en modo kernel.
El controlador de captura o el controlador de minipuerto de pantalla deben asignar el controlador de superficie VRAM a una dirección física de VRAM real. El identificador de superficie VRAM no sigue siendo válido; no lo almacene en caché para su uso posterior.
Devuelve la dirección asignada en el VRAM_SURFACE_INFO_PROPERTY_S que se proporcionó en la solicitud de propiedad. El controlador de captura puede emitir un IOCTL para solicitar la asignación desde el controlador de miniporte de pantalla.
En segundo lugar, se llama al avStrMiniPinProcess del filtro de captura cuando un pin tiene datos que procesar.
El minidriver ahora debe llamar a KsPinGetLeadingEdgeStreamPointer para adquirir y bloquear el puntero de flujo de borde inicial para este pin. Esta función devuelve un puntero a una estructura KSSTREAM_POINTER .
Esta estructura de puntero de secuencia contiene un puntero a un KSSTREAM_HEADER.
En el miembro Data del encabezado de secuencia, busque un puntero a una estructura VRAM_SURFACE_INFO .
Esta estructura contiene la dirección física devuelta en respuesta a KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. El miembro hSurface que representa el identificador es NULL.
El controlador de captura debe:
Programe el hardware de captura con la dirección física VRAM.
Controle la finalización de fotogramas de vídeo.
Rellene el miembro cbCaptured de VRAM_SURFACE_INFO con el número de bytes copiados en la superficie VRAM. No establezca el miembro DataUsed de KSSTREAM_HEADER con el número de bytes capturados. En su lugar, establezca DataUsed en sizeof(VRAM_SURFACE_INFO).
Si el controlador de captura realiza la marca de tiempo, establezca PresentationTime, Duration y, si procede, OptionsFlags en KSSTREAM_HEADER.
Llame a KsStreamPointerAdvanceOffsets para continuar procesando o eliminando todos los clones y complete la solicitud llamando a KsStreamPointerDelete.
El método CCapturePin::P rocessD3DSurface en el archivo Capture.cpp del controlador de ejemplo de hardware simulado AVStream (AVSHwS) en los ejemplos del Kit de controladores de Windows (WDK) muestra una manera de implementar esta devolución de llamada para la compatibilidad con VRAM.