Prise en charge de la capture vidéo et d’autres appareils enfants
Un pilote miniport d’affichage et le pilote d’un périphérique de capture vidéo ou d’un autre appareil enfant peuvent définir mutuellement une interface privée que le pilote enfant peut utiliser pour communiquer avec son appareil via le pilote miniport parent. Un pilote de capture vidéo enfant doit être étroitement couplé au pilote miniport d’affichage parent. En fait, la capture vidéo pourrait être implémentée dans le cadre du pilote miniport d’affichage. Un pilote de capture vidéo peut utiliser l’interface privée avec le pilote miniport d’affichage pour accéder au bus I2C et à d’autres fins.
Pour initialiser l’interface privée, le pilote de capture vidéo envoie une demande de IRP_MN_QUERY_INTERFACE au pilote de port d’affichage (partie de Dxgkrnl.sys) pour le pilote de miniport d’affichage. Une fois que le pilote de port d’affichage reçoit une telle demande, il appelle la fonction DxgkDdiQueryInterface du pilote miniport et passe un pointeur vers une structure QUERY_INTERFACE qui contient des informations pour initialiser l’interface privée.
Note Si la capture vidéo est implémentée dans le cadre du pilote miniport d’affichage, la capture vidéo peut appeler DxgkDdiQueryInterface directement.
Chaque pilote d’un appareil enfant (y compris les périphériques de capture vidéo) doit retourner le GUID de l’adaptateur qui indique le matériel auquel l’appareil est associé. Le GUID de l’adaptateur est fourni au pilote de miniport d’affichage dans le membre AdapterGuid de la structure DXGK_START_INFO vers laquelle pointe le paramètre DxgkStartInfo de la fonction DxgkDdiStartDevice envoyée lors de l’initialisation de l’adaptateur. Les composants de capture en mode utilisateur peuvent ensuite mapper ce GUID d’adaptateur à une carte d’affichage.
Dans le modèle de pilote d’affichage Microsoft Windows 2000, les applications de capture vidéo envoient des mémoires tampons de capture de mémoire système en mode noyau. Le mode noyau décrit ensuite les mémoires tampons système à l’aide de structures MDL (Descriptor list) de mémoire et envoie les MDL au pilote de capture vidéo. En plus de prendre en charge la capture dans la mémoire système, le modèle de pilote d’affichage Windows Vista prend en charge la capture en mémoire vidéo. Le runtime Direct3D appelle des fonctions de type DirectX Video Acceleration 2.0 pour diriger le GPU pour effectuer un post-traitement sur les données de capture. Au lieu d’envoyer des dll MDL pour décrire les mémoires tampons de mémoire vidéo, le pilote d’affichage en mode utilisateur envoie des valeurs de type D3DKMT_HANDLE qui sont des handles pour capturer les allocations de mémoire tampon. Par conséquent, la combinaison pilote de capture vidéo et pilote d’affichage miniport peut utiliser des fonctions de rappel existantes telles que DxgkCbGetHandleData pour référencer des données privées qui décrivent la mémoire tampon de capture. La combinaison de pilotes peut également utiliser la fonction de rappel DxgkCbGetCaptureAddress pour retourner l’adresse physique de la mémoire tampon de capture.
Les applications de capture vidéo appellent le runtime Direct3D pour créer des mémoires tampons de capture ; le runtime appelle ensuite le pilote d’affichage en mode utilisateur. Le runtime appelle la fonction CreateResource du pilote d’affichage en mode utilisateur avec l’indicateur de champ de bits CaptureBuffer défini dans le membre Indicateurs de la structure D3DDDIARG_CREATERESOURCE pour créer des mémoires tampons de capture. Le pilote miniport d’affichage doit également spécifier l’indicateur de champ bit capture pour le gestionnaire de mémoire vidéo lorsque le gestionnaire de mémoire appelle la fonction DxgkDdiCreateAllocation du pilote d’affichage pour créer des allocations pour les mémoires tampons de capture. Lorsque des mémoires tampons de capture sont créées, elles sont immédiatement épinglées dans la mémoire et ne sont pas épinglées tant qu’elles ne sont pas libérées. Étant donné que la pile de captures doit envoyer des handles d’allocation en mode noyau pour les mémoires tampons de capture au pilote de capture, le runtime appelle la fonction GetCaptureAllocationHandle du pilote d’affichage en mode utilisateur pour mapper chaque handle de ressource au handle d’allocation en mode noyau pour cette ressource.
Le pilote de capture peut indiquer s’il prend en charge la capture dans la mémoire système directement. Si le pilote de capture prend en charge la capture directement dans la mémoire système, les dll MDL sont envoyées au pilote de capture à cet effet. Si le pilote de capture ne prend pas en charge la capture directe dans la mémoire système, le runtime crée des mémoires tampons de capture vidéo et le pilote de capture doit les remplir. La fonction CaptureToSysMem du pilote d’affichage en mode utilisateur est appelée pour copier le contenu d’une mémoire tampon de capture sur une surface de mémoire système. Le runtime peut utiliser CaptureToSysMem plutôt que la fonction Blt pour tirer parti du matériel spécial pour les transferts de blocs de bits (bitblt) qui ne nécessitent pas que le pilote d’affichage en mode utilisateur appelle la fonction pfnRenderCb .
Étant donné qu’AVStream contrôle la capture vidéo, le sous-système du noyau graphique DirectX n’est pas conscient du moment où la capture vidéo se produit. Toutefois, le sous-système du noyau graphique connaît les allocations utilisées comme tampons de capture. Lorsqu’une mémoire tampon de capture est sur le point d’être détruite, le sous-système du noyau graphique appelle la fonction DxgkDdiStopCapture du pilote miniport d’affichage pour indiquer que l’opération de capture doit immédiatement cesser d’utiliser une allocation comme mémoire tampon de capture. Si l’opération de capture a déjà été arrêtée via la pile de captures, le pilote peut ignorer l’appel en toute sécurité.