Reconnexion des broches

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Pendant une connexion de broche, un filtre peut se déconnecter et se reconnecter à l’une de ses autres broches, comme suit :

  1. Le filtre appelle IPin::QueryAccept sur l’épingle de l’autre filtre et spécifie le nouveau type de média.
  2. Si QueryAccept retourne S_OK, le filtre appelle IFilterGraph2::ReconnectEx pour reconnecter les broches.

Voici quelques exemples de cas où un filtre peut avoir besoin de reconnecter des broches :

  • Filtres de tee. Un filtre de départ fractionne un flux d’entrée en plusieurs sorties sans modifier les données du flux. Un filtre de départ peut accepter une plage de types de supports, mais les types doivent correspondre à toutes les connexions d’épingle. Par conséquent, lorsque la broche d’entrée se connecte, le filtre peut avoir besoin de renégocier toutes les connexions existantes sur les broches de sortie, et vice versa. Pour obtenir un exemple, consultez l’exemple de filtre InfTee.
  • Filtres trans-in-place. Un filtre trans-in-place modifie les données d’entrée dans la mémoire tampon d’origine au lieu de copier les données dans une mémoire tampon de sortie distincte. Un filtre trans-in-place doit utiliser le même allocateur pour les connexions amont et en aval. La première broche à connecter (entrée ou sortie) négocie un allocateur de la manière habituelle. Toutefois, lorsque l’autre broche se connecte, le premier allocateur peut ne pas être acceptable. Dans ce cas, la deuxième broche choisit un autre allocateur et la première broche se reconnecte à l’aide du nouvel allocateur. Pour obtenir un exemple d’implémentation, consultez la classe CTransInPlaceFilter .

Dans la méthode ReconnectEx , le Gestionnaire de graphes de filtre déconnecte et reconnecte de façon asynchrone les broches. Le filtre ne doit pas tenter la reconnexion, sauf si QueryAccept retourne S_OK. Sinon, l’épingle reste déconnectée, ce qui provoque des erreurs de graphique. En outre, le filtre doit demander la reconnexion à partir de l’intérieur de la méthode IPin::Connect , sur le même thread. Si la méthode Connect retourne sur un thread, tandis qu’un autre thread effectue la demande de reconnexion, le Gestionnaire de graphe de filtres peut exécuter le graphique avant d’effectuer la reconnexion, ce qui provoque des erreurs de graphique.