Mutex de contrôle de filtre dans AVStream
Chaque filtre AVStream instance a un mutex de contrôle de filtre associé. Ce mutex est utilisé pour synchroniser l’accès à la hiérarchie d’objets à partir du filtre vers le bas avec des broches individuelles. La création et la destruction des filtres et des broches sont synchronisées avec ce mutex.
La hiérarchie d’objets est garantie stable uniquement à partir d’un filtre spécifique instance vers le bas pendant que le mutex du contrôle de filtre est maintenu. Par conséquent, le minidriver doit obtenir le mutex du contrôle de filtre avant de parcourir la hiérarchie d’objets en dessous du niveau de filtre à l’aide des fonctions KsXxxGetFirstChildXxx et KsXxxGetNextSiblingXxx .
Le mutex du contrôle de filtre est également utilisé pour synchroniser les transitions d’état.
AVStream obtient le mutex du contrôle de filtre lorsqu’il gère les propriétés qui nécessitent que la hiérarchie reste stable, par exemple lors de la modification du descripteur.
N’oubliez pas qu’un mutex de contrôle de filtre unique est utilisé pour la hiérarchie d’objets sous chaque filtre individuel. Cela signifie qu’un objet pin utilise le mutex de contrôle de filtre de son parent lorsqu’un minidriver appelle une fonction avec un objet pin.
AVStream conserve le mutex du contrôle de filtre pour le compte du minidriver lorsqu’il appelle les routines fournies par le minidriver suivantes :
À l’instar du mutex d’appareil, le mutex de contrôle de filtre ne doit pas être obtenu de manière récursive. Si, par exemple, AVStream effectue un rappel à un minidriver pour un dispatch Create dans le contexte du thread A, et que le minidriver tente ultérieurement d’obtenir le mutex à partir du thread A, le thread A interblocage avec lui-même.
Un interblocage peut se produire si vous effectuez l’une des actions suivantes :
Essayez d’acquérir le mutex du contrôle de filtre à partir de la routine de processus.
Essayez d’obtenir le mutex du contrôle de filtre à partir du rappel Veille ou Veille.
Pour manipuler le mutex du contrôle de filtre, utilisez les fonctions suivantes :
KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl