Condividi tramite


Riconnessione dei pin

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine 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, FMMediaEngine e Audio/Video Capture 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:

  1. Il filtro chiama IPin::QueryAccept nel pin dell'altro filtro e specifica il nuovo tipo di supporto.
  2. 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 di tee suddivide un flusso di input in più output senza modificare i dati nel flusso. Un filtro di tee può accettare un intervallo di tipi multimediali, ma i tipi devono corrispondere a tutte le connessioni pin. Pertanto, quando il pin di input si connette, il filtro potrebbe dover rinegoziare le connessioni esistenti nei pin di output e viceversa. Per un esempio, vedere l'esempio di filtro InfTee.
  • Filtri sul posto. Un filtro sul posto trasposto modifica i dati di input nel buffer originale anziché copiare i dati in un buffer di output separato. Un filtro sul posto trasposto deve usare lo stesso allocatore sia per le connessioni upstream che per le connessioni downstream. Il primo pin per connettersi (input o output) negozia un allocatore nel modo consueto. Quando l'altro pin si connette, tuttavia, il primo allocatore potrebbe non essere accettabile. In questo 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 classe CTransInPlaceFilter .

Nel metodo ReconnectEx , Filter Graph Manager disconnette in modo asincrono e riconnette i pin. Il filtro non deve tentare la riconnessione a meno che QueryAccept non restituisca S_OK. In caso contrario, il pin verrà 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.