Notifications de fin de flux
[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.]
Lorsqu’un filtre source envoie des données, il appelle la méthode IPin::EndOfStream sur la broche d’entrée en aval. Le filtre en aval propage l’appel au filtre suivant, et ainsi de suite. Lorsque l’appel EndOfStream atteint le convertisseur, celui-ci envoie un événement EC_COMPLETE au Gestionnaire de graphe de filtres. Si le convertisseur a plusieurs broches d’entrée, il remet l’événement EC_COMPLETE une fois que chaque broche d’entrée a reçu la notification de fin de flux.
Un filtre doit sérialiser les appels EndOfStream avec d’autres appels de streaming, tels que IMemInputPin::Receive. (En d’autres termes, le filtre en aval doit toujours recevoir les appels dans le bon ordre.)
Dans certains cas, un filtre en aval peut détecter la fin du flux avant que le filtre source ne le fasse. (Par exemple, le filtre en aval peut analyser le flux.) Dans ce cas, le filtre en aval peut envoyer la notification de fin de flux, auquel cas il doit retourner S_FALSE à partir de IMemInputPin::Receive jusqu’à ce que le graphique s’arrête ou se vide. La valeur de retour S_FALSE informe le filtre source d’arrêter l’envoi de données.
Gestion par défaut des EC_COMPLETE
Par défaut, le Gestionnaire de graphe de filtre ne transfère pas tous les événements EC_COMPLETE à l’application. Au lieu de cela, il attend que tous les flux aient signalé EC_COMPLETE, puis envoie un événement de EC_COMPLETE unique. Ainsi, l’application reçoit l’événement une fois chaque flux terminé.
Pour déterminer le nombre de flux, le Gestionnaire de graphe de filtre compte le nombre de filtres qui prennent en charge la recherche (via IMediaSeeking ou IMediaPosition) et a une broche d’entrée rendue , qui est définie comme une broche d’entrée sans sortie correspondante. Le Gestionnaire de graphe de filtres détermine si une broche est rendue de l’une des deux manières suivantes :
- La méthode IPin::QueryInternalConnections de l’épingle retourne zéro dans le paramètre nPin .
- Le filtre expose l’interface IAMFilterMiscFlags et retourne l’indicateur AM_FILTER_MISC_FLAGS_IS_RENDERER.
Notifications de fin de flux en mode extraction
Dans une connexion IAsyncReader , le filtre source n’envoie pas de notification de fin de flux. Instread, cette opération est effectuée par le filtre en aval, qui est généralement un filtre d’analyseur. L’analyseur envoie l’appel EndOfStream en aval. Il n’envoie pas un amont au filtre source.
Rubriques connexes