Notifications de fin de flux

Lorsqu’un filtre source est terminé pour envoyer 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 renderer, le renderer envoie un événement EC_COMPLETE au Gestionnaire de filtre Graph. Si le renderer 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 l’ordre correct.)

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 d’IMemInputPin::Receive jusqu’à ce que le graphique s’arrête ou vide. La valeur de retour S_FALSE informe le filtre source pour arrêter l’envoi de données.

Gestion par défaut de EC_COMPLETE

Par défaut, le Gestionnaire de filtre Graph ne transfère pas chaque événement EC_COMPLETE à l’application. Au lieu de cela, il attend que tous les flux aient signalé EC_COMPLETE, puis envoie un seul événement de EC_COMPLETE. Ainsi, l’application reçoit l’événement une fois chaque flux terminé.

Pour déterminer le nombre de flux, le Gestionnaire de filtre Graph compte le nombre de filtres qui prennent en charge la recherche (via IMediaSeeking ou IMediaPosition) et ont une broche d’entrée rendue, définie comme une broche d’entrée sans sortie correspondante. Le Gestionnaire de filtre Graph détermine si une broche est rendue de l’une des deux façons suivantes :

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, ceci est effectué 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 en amont au filtre source.

Livraison de la fin du flux