Condividi tramite


Notifiche di fine flusso

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEnginee Acquisizione audio/video in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente di usare un nuovo codice MediaPlayer, IMFMediaEngine e Acquisizione audio/video 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 completato inviando dati, chiama il metodo IPin::EndOfStream sul 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 di fine flusso.

Un filtro deve serializzare 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 funzioni. Ad esempio, il filtro downstream potrebbe analizzare il flusso. In tal caso, il filtro downstream può inviare la notifica di fine flusso, nel qual caso deve restituire S_FALSE da IMemInputPin::Receive finché il grafico non si arresta o non si scarica. Il valore restituito S_FALSE informa il filtro di origine per interrompere l'invio dei 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 abbiano segnalato EC_COMPLETE e quindi invii un singolo evento EC_COMPLETE. L'applicazione riceve quindi 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, 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 di fine flusso. Instread, questa operazione viene eseguita dal filtro downstream, che in genere è un filtro parser. Il parser invia il EndOfStream chiamare downstream. Non invia un upstream al filtro di origine.

distribuzione dell' end-of-stream