Partager via


Propriétés de capture VRAM

Un minidriver AVStream centré sur les broches doit prendre en charge plusieurs propriétés pour qu’il soit capturé sur VRAM. Cette section décrit la séquence de requêtes que le minidriver reçoit avant et pendant le traitement VRAM.

Avant que la capture ne soit lancée, le proxy KS envoie une requête KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property. Le minidriver doit retourner des valeurs différentes selon que le pilote capture dans la mémoire système ou la VRAM.

Capture dans la mémoire système

Pour capturer dans la mémoire système, retournez KS_CAPTURE_ALLOC_SYSTEM_AGP.

Le pilote de capture reçoit ensuite une requête KSPROPERTY_CURRENT_CAPTURE_SURFACE set-property avec un type de valeur de mémoire système. Le pilote de capture agit désormais en tant que périphérique DMA master bus et place les données directement dans la mémoire système.

Dans ce mode, le pilote de capture reçoit des mémoires tampons système dans la fonction de rappel AVStrMiniPinProcess de la broche de sortie.

Pour plus d’informations sur l’implémentation de DMA dans votre rappel de processus d’épingle, consultez DMA basé sur les paquets dans AVStream.

Pour capturer avec plusieurs broches de sortie (pour instance, des broches vidéo, audio et VBI distinctes), chaque broche doit prendre en charge les propriétés et le traitement VRAM, comme décrit précédemment. Le proxy génère un thread distinct pour chaque broche.

Capture sur VRAM

Si votre pilote prend en charge la capture VRAM, retournez KS_CAPTURE_ALLOC_VRAM en réponse à KSPROPERTY_PREFERRED_CAPTURE_SURFACE.

Le minidriver reçoit ensuite une requête KSPROPERTY_DISPLAY_ADAPTER_GUID get-property, en interrogeant le GUID de la carte graphique.

Obtenez le GUID de l’adaptateur à partir du pilote miniport graphique fourni par le fournisseur. La structure DXGK_INTERFACESPECIFICDATA contient le GUID de l’adaptateur à retourner dans la demande de propriété. Cette structure est générée par le sous-système du noyau graphique DirectX (DXGK) et est passée au pilote miniport lors de l’initialisation de l’adaptateur.

Si la broche prend en charge le transport VRAM et les GUID de la carte graphique et de la correspondance de filtre en aval, le module proxy KS est sélectionné comme allocateur. Le proxy informe la broche de capture de la sélection du transport de surface VRAM entre les broches en définissant la propriété KSPROPERTY_CURRENT_CAPTURE_SURFACE avec le type de surface sélectionné pour la capture.

Si l’épingle reçoit KS_CAPTURE_ALLOC_VRAM, elle reçoit alors des demandes de traitement VRAM.

Les demandes de traitement VRAM se composent de deux parties. Tout d’abord, le pilote de capture reçoit une demande get de KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. Le gestionnaire get reçoit un IRP qui contient le handle de surface VRAM en mode noyau.

Le pilote de capture ou le pilote de miniport d’affichage doivent mapper la poignée de surface VRAM à une adresse physique VRAM réelle. Le handle de surface VRAM ne reste pas valide ; ne le mettez pas en cache pour une utilisation ultérieure.

Retourne l’adresse mappée dans le VRAM_SURFACE_INFO_PROPERTY_S qui a été fourni dans la demande de propriété. Le pilote de capture peut émettre un IOCTL pour demander le mappage à partir du pilote de miniport d’affichage.

Deuxièmement, avStrMiniPinProcess du filtre de capture est appelé lorsqu’une broche a des données à traiter.

Le minidriver doit maintenant appeler KsPinGetLeadingEdgeStreamPointer pour acquérir et verrouiller le pointeur de flux de bord de pointe pour cette broche. Cette fonction retourne un pointeur vers une structure KSSTREAM_POINTER .

Cette structure de pointeur de flux contient un pointeur vers un KSSTREAM_HEADER.

Dans le membre Données de l’en-tête de flux, recherchez un pointeur vers une structure VRAM_SURFACE_INFO .

Cette structure contient l’adresse physique retournée en réponse à KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. Le membre hSurface qui représente le handle est NULL.

Le pilote de capture doit :

  • Programmez le matériel de capture avec l’adresse physique VRAM.

  • Gérer la saisie semi-automatique de l’image vidéo.

  • Renseignez le membre cbCaptured de VRAM_SURFACE_INFO avec le nombre d’octets copiés dans la surface VRAM. Ne définissez pas le membre DataUsed de KSSTREAM_HEADER avec le nombre d’octets capturés. Au lieu de cela, définissez DataUsed sur sizeof(VRAM_SURFACE_INFO).

  • Si votre pilote de capture effectue l’horodatage, définissez PresentationTime, Duration et, le cas échéant, OptionsFlags dans KSSTREAM_HEADER.

  • Appelez KsStreamPointerAdvanceOffsets pour continuer à traiter ou supprimer tous les clones et terminer la demande en appelant KsStreamPointerDelete.

La méthode CCapturePin::P rocessD3DSurface dans le fichier Capture.cpp dans les exemples AVStream Simulated Hardware Sample Driver (AVSHwS) dans le Kit de pilotes Windows (WDK) montre un moyen d’implémenter ce rappel pour la prise en charge de VRAM.