Catene di filtri
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.
L'interfaccia IFilterChain fornisce i metodi seguenti per controllare le catene di filtri:
Label | 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::Connessione, 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.
- 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.
Argomenti correlati