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:
- Il metodo IPin::QueryInternalConnections del pin restituisce zero nel parametro nPin.
- Il filtro espone l'interfacciaIAMFilterMiscFlagse restituisce il flag AM_FILTER_MISC_FLAGS_IS_RENDERER.
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.
Argomenti correlati
-
distribuzione dell' end-of-stream