Condividi tramite


Catene di filtri

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine 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, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Una catena di filtri è una sequenza di filtri che soddisfa le condizioni seguenti:

  • Ogni filtro nella catena ha al massimo un pin di input connesso e un pin di output connesso.
  • È possibile attraversare ogni filtro nella catena senza attraversare filtri all'esterno della catena.

Nel diagramma seguente, ad esempio, i filtri A-B, C-D e F-G-H sono catene di filtri. Ogni sottochain in F-G-H (F-G e G-H) è anche una catena di filtri. Una catena di filtri può essere costituita da un singolo filtro, quindi i filtri A, B, C, D, F, G e H sono anche catene di filtro distinte. Il filtro E ha due connessioni di input, quindi qualsiasi sequenza di filtri che include il filtro E non è una catena di filtri.

catena di filtri (esempio 1)

L'interfaccia IFilterChain fornisce i metodi seguenti per controllare le catene di filtri:

Etichetta Valore
IFilterChain::StartChain Avvia una catena.
IFilterChain::StopChain Arresta una catena.
IFilterChain::P auseChain Sospende una catena.
IFilterChain::RemoveChain Rimuove una catena dal grafico.

 

Non esiste alcun metodo specifico per l'aggiunta di una catena. Per aggiungere una catena, inserire i nuovi filtri usando il metodo IFilterGraph::AddFilter . Connettere quindi i filtri chiamando IGraphBuilder::Connect, IGraphBuilder::Render o metodi simili.

Quando il grafico è in esecuzione, una catena di filtri può passare dall'esecuzione all'altra e arrestata. Quando il grafico viene sospeso, può passare da una pausa all'altra e arrestata. Queste sono le uniche transizioni di stato possibili con catene di filtri.

Linee guida per la catena di filtri

Quando si usano i metodi IFilterChain , è importante assicurarsi che i filtri nel grafico possano supportare le operazioni di concatenamento dei filtri. In caso contrario, è possibile che si verifichino errori deadlock o grafici. I filtri connessi alla catena devono funzionare correttamente dopo la modifica dello stato della catena.

Il modo migliore per usare IFilterChain è con un set di filtri progettati appositamente per il concatenamento. Usare le linee guida seguenti per assicurarsi che i filtri siano sicuri per le operazioni della catena di filtri. Questi punti fanno riferimento al diagramma seguente.

catena di filtri (esempio 2)

  • Prima che lo stato della catena di filtri venga modificato, è necessario completare tutte le chiamate di elaborazione dati al limite della catena di filtri. Questa regola si applica ai metodi IMemInputPin::Receive, IPin::NewSegment e IPin::EndOfStream. I filtri nella catena devono restituire dalle chiamate a questi metodi effettuati da filtri all'esterno della catena; e i filtri all'esterno della catena devono restituire dalle chiamate effettuate dai filtri all'interno della catena.

Nel diagramma precedente, ad esempio, il filtro B deve completare tutte le chiamate di elaborazione dati dal filtro A e il filtro E deve completare tutte le chiamate dal filtro D. Se i pin espongono le interfacce IPinFlowControl e IPinConnection , è possibile eseguire il push dei dati tramite il grafico chiamando i metodi IPinFlowControl::Block e IGraphConfig::P ushThroughData , come descritto in Dynamic Reconnection. I filtri possono anche supportare metodi privati per il push dei dati.

  • I filtri upstream devono prevedere la modifica dello stato della catena. Nel diagramma precedente, ad esempio, si supponga che la catena venga arrestata ma che il filtro A chiami IMemInputPin::Receive. La chiamata ha esito negativo e la risposta del filtro A consiste nell'arrestare lo streaming. Quando l'applicazione riavvia la catena, non ha alcun effetto perché il filtro A non trasmette più i dati.
  • I filtri downstream devono anche prevedere la modifica dello stato della catena. In caso contrario, il filtro downstream potrebbe bloccarsi mentre attende campioni che non arrivano mai. Ad esempio, i filtri multiplexer (MUX) spesso richiedono dati da tutti i pin di input. L'interruzione del flusso di dati da un pin di input potrebbe impedire l'elaborazione degli altri flussi. Ciò può causare il deadlock del grafico.
  • Ogni connessione pin da un filtro all'esterno della catena a un filtro all'interno della catena deve avere un proprio allocatore, che non è condiviso da altre connessioni. Quando la catena modifica lo stato o viene rimosso dal grafico, l'allocatore potrebbe essere decommesso. Se altre connessioni usano lo stesso allocatore, non possono più elaborare campioni.
  • Non rimuovere una catena a meno che i filtri connessi alla catena supportino la disconnessione dinamica. In genere, i filtri connessi supporteranno l'interfaccia IPinConnection o IPinFlowControl , ma potrebbero supportare interfacce private.

Compilazione dinamica del grafo