Notifiche end-of-stream

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Quando un filtro di origine viene inviato dati, chiama il metodo IPin::EndOfStream nel pin di input downstream. Il filtro downstream propaga la chiamata al filtro successivo e così via. Quando la chiamata EndOfStream raggiunge il renderer, il renderer invia un evento EC_COMPLETE a Filter Graph Manager. Se il renderer ha più pin di input, recapita l'evento EC_COMPLETE dopo che ogni pin di input ha ricevuto la notifica end-of-stream.

Un filtro deve serializzare le chiamate EndOfStream con altre chiamate di streaming, ad esempio IMemInputPin::Receive. In altre parole, il filtro downstream deve sempre ricevere le chiamate nell'ordine corretto.

In alcuni casi, un filtro downstream potrebbe rilevare la fine del flusso prima che il filtro di origine venga eseguito. Ad esempio, il filtro downstream potrebbe analizzare il flusso. In tal caso, il filtro downstream può inviare la notifica end-of-stream, nel qual caso deve restituire S_FALSE da IMemInputPin::Receive finché il grafico si arresta o scarica. Il valore restituito S_FALSE informa il filtro di origine per interrompere l'invio di dati.

Gestione predefinita di EC_COMPLETE

Per impostazione predefinita, Filter Graph Manager non inoltra ogni evento EC_COMPLETE all'applicazione. Attende invece che tutti i flussi non abbiano segnalato EC_COMPLETE e quindi invii un singolo evento EC_COMPLETE. Pertanto, l'applicazione riceve l'evento dopo il completamento di ogni flusso.

Per determinare il numero di flussi, Filter Graph Manager conta il numero di filtri che supportano la ricerca (tramite IMediaSeeking o IMediaPosition) e hanno un pin di input di cui è stato eseguito il rendering, definito come pin di input senza output corrispondenti. Filter Graph Manager determina se viene eseguito il rendering di un pin in uno dei due modi seguenti:

Notifiche end-of-stream in modalità pull

In una connessione IAsyncReader il filtro di origine non invia una notifica end-of-stream. Instread, questa operazione viene eseguita dal filtro downstream, che in genere è un filtro parser. Il parser invia la chiamata EndOfStream downstream. Non invia un upstream al filtro di origine.

Distribuzione del flusso finale