Riconnessione dei pin
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stato sostituito 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.
Durante una connessione pin, un filtro può disconnettersi e riconnettere uno degli altri pin, come indicato di seguito:
- Il filtro chiama IPin::QueryAccept sul pin dell'altro filtro e specifica il nuovo formato di supporto.
- Se queryAccept restituisce S_OK, il filtro chiama IFilterGraph2::ReconnectEx per riconnettere i pin.
Di seguito sono riportati alcuni esempi di quando un filtro potrebbe dover riconnettere i pin:
- Filtri tee. Un filtro tee suddivide un flusso di input in diversi output senza modificare i dati nel flusso. Un filtro a T può accettare una gamma di tipi di media, ma i tipi devono corrispondere tra tutte le connessioni dei pin. Pertanto, quando il pin di input si connette, il filtro potrebbe dover rinegoziare eventuali connessioni esistenti sui pin di output e viceversa. Per un esempio, vedere l'esempio di filtro InfTee.
- Filtri trans in loco. Un filtro sul posto modifica i dati di input nel buffer originale invece di copiare i dati in un buffer di output separato. Un filtro trans-in-place deve usare lo stesso allocatore sia per le connessioni upstream che downstream. Il primo pin a connettersi (input o output) negozia un allocatore nel modo consueto. Tuttavia, quando l'altro pin si connette, il primo allocatore potrebbe non essere accettabile. In tal caso, il secondo pin sceglie un allocatore diverso e il primo pin si riconnette usando il nuovo allocatore. Per un'implementazione di esempio, vedere la classeCTransInPlaceFilter.
Nel metodo ReconnectEx, Filter Graph Manager disconnette e riconnette i pin in modo asincrono. Il filtro non deve tentare la riconnessione a meno che queryAccept restituisca S_OK. In caso contrario, il pin verrà lasciato disconnesso, causando errori del grafico. Inoltre, il filtro deve richiedere la riconnessione dall'interno del metodo IPin::Connect, nello stesso thread. Se il metodo Connect restituisce su un thread, mentre un altro thread effettua la richiesta di riconnessione, Filter Graph Manager potrebbe eseguire il grafico prima di effettuare la riconnessione, causando errori del grafico.