Share via


Chaînes de filtre

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est 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.]

Une chaîne de filtres est une séquence de filtres qui répond aux conditions suivantes :

  • Chaque filtre de la chaîne a au maximum une broche d’entrée connectée et une broche de sortie connectée.
  • Il est possible de parcourir chaque filtre de la chaîne sans traverser les filtres en dehors de la chaîne.

Par exemple, dans le diagramme suivant, les filtres A-B, C-D et F-G-H sont des chaînes de filtre. Chaque sous-chaîne en F-G-H (F-G et G-H) est également une chaîne de filtre. Une chaîne de filtre peut se composer d’un seul filtre. Par conséquent, les filtres A, B, C, D, F, G et H sont également des chaînes de filtre distinctes. Le filtre E a deux connexions d’entrée. Par conséquent, toute séquence de filtres qui inclut le filtre E n’est pas une chaîne de filtre.

chaîne de filtre (exemple 1)

L’interface IFilterChain fournit les méthodes suivantes pour contrôler les chaînes de filtre :

Étiquette Valeur
IFilterChain::StartChain Démarre une chaîne.
IFilterChain::StopChain Arrête une chaîne.
IFilterChain::P auseChain Interrompt une chaîne.
IFilterChain::RemoveChain Supprime une chaîne du graphique.

 

Il n’existe aucune méthode spécifique pour ajouter une chaîne. Pour ajouter une chaîne, insérez les nouveaux filtres à l’aide de la méthode IFilterGraph::AddFilter . Ensuite, connectez les filtres en appelant IGraphBuilder::Connect, IGraphBuilder::Render ou des méthodes similaires.

Lorsque le graphe est en cours d’exécution, une chaîne de filtre peut basculer entre l’exécution et l’arrêt. Lorsque le graphe est suspendu, il peut basculer entre suspendu et arrêté. Il s’agit des seules transitions d’état possibles avec des chaînes de filtre.

Instructions relatives à la chaîne de filtre

Lorsque vous utilisez des méthodes IFilterChain , il est important de vous assurer que les filtres du graphique peuvent prendre en charge les opérations de chaînage de filtre. Sinon, vous risquez de provoquer des interblocages ou des erreurs de graphique. Les filtres connectés à la chaîne doivent fonctionner correctement une fois que la chaîne change d’état.

La meilleure façon d’utiliser IFilterChain est avec un ensemble de filtres que vous avez conçu spécifiquement pour le chaînage. Utilisez les instructions suivantes pour vous assurer que vos filtres sont sécurisés pour les opérations de chaîne de filtre. Ces points font référence au diagramme suivant.

chaîne de filtre (exemple 2)

  • Avant que l’état de la chaîne de filtre ne change, tous les appels de traitement des données à la limite de la chaîne de filtre doivent être effectués. Cette règle s’applique aux méthodes IMemInputPin::Receive, IPin::NewSegment et IPin::EndOfStream. Les filtres de la chaîne doivent revenir des appels à ces méthodes effectués par des filtres en dehors de la chaîne ; et les filtres en dehors de la chaîne doivent revenir à partir d’appels effectués par les filtres au sein de la chaîne.

Par exemple, dans le diagramme précédent, le filtre B doit effectuer tous les appels de traitement des données à partir du filtre A, et le filtre E doit terminer tous les appels du filtre D. Si les broches exposent les interfaces IPinFlowControl et IPinConnection , vous pouvez envoyer les données via le graphique en appelant les méthodes IPinFlowControl::Block et IGraphConfig::P ushThroughData , comme décrit dans Reconnection dynamique. Les filtres peuvent également prendre en charge les méthodes privées pour envoyer les données.

  • Les filtres en amont doivent s’attendre à ce que l’état de la chaîne change. Par exemple, dans le diagramme précédent, supposons que la chaîne soit arrêtée, mais que le filtre A appelle IMemInputPin::Receive. L’appel échoue et la réponse du filtre A est d’arrêter la diffusion en continu. Lorsque l’application redémarre la chaîne, cela n’a aucun effet, car le filtre A n’est plus en streaming de données.
  • Les filtres en aval doivent également s’attendre à ce que l’état de la chaîne change. Si ce n’est pas le cas, le filtre en aval peut se bloquer pendant qu’il attend des échantillons qui n’arrivent jamais. Par exemple, les filtres de multiplexeur (MUX) nécessitent souvent des données de toutes leurs broches d’entrée. L’arrêt du flux de données à partir d’une broche d’entrée peut empêcher le traitement des autres flux. Cela peut entraîner un blocage du graphique.
  • Chaque connexion de broche d’un filtre en dehors de la chaîne à un filtre dans la chaîne doit avoir son propre répartiteur, qui n’est pas partagé par d’autres connexions. Lorsque la chaîne change d’état ou est supprimée du graphique, l’allocateur peut être décompressé. Si d’autres connexions utilisaient le même allocateur, elles ne peuvent plus traiter d’exemples.
  • Ne supprimez pas une chaîne, sauf si les filtres connectés à la chaîne prennent en charge la déconnexion dynamique. En règle générale, les filtres connectés prennent en charge l’interface IPinConnection ou IPinFlowControl , mais peuvent prendre en charge les interfaces privées à la place.

Génération de graphiques dynamiques