Passaggio 3. Supporto della negoziazione dei tipi di supporto

[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.

Questo è il passaggio 3 dell'esercitazione Scrittura di filtri di trasformazione.

Quando due pin si connettono, devono accettare un tipo di supporto per la connessione. Il tipo di supporto descrive il formato dei dati. Senza il tipo di supporto, un filtro potrebbe recapitare un tipo di dati, solo per avere un altro filtro considerarlo come un altro.

Il meccanismo di base per la negoziazione dei tipi di supporti è il metodo IPin::ReceiveConnection . Il pin di output chiama questo metodo sul pin di input con un tipo di supporto proposto. Il pin di input accetta la connessione o la rifiuta. Se rifiuta la connessione, il pin di output può provare un altro tipo di supporto. Se non vengono trovati tipi appropriati, la connessione ha esito negativo. Facoltativamente, il pin di input può annunciare un elenco di tipi che preferisce tramite il metodo IPin::EnumMediaTypes . Il pin di output può usare questo elenco quando propone tipi di supporti, anche se non deve.

La classe CTransformFilter implementa un framework generale per questo processo, come indicato di seguito:

  • Il pin di input non ha tipi di supporti preferiti. Si basa interamente sul filtro upstream per proporre il tipo di supporto. Per i dati video, questo ha senso, perché il tipo di supporto include le dimensioni dell'immagine e la frequenza dei fotogrammi. In genere, tali informazioni devono essere fornite da un filtro di origine upstream o da un filtro parser. Nel caso dei dati audio, il set di formati possibili è più piccolo, quindi può essere pratico per il pin di input per offrire alcuni tipi preferiti. In tal caso, eseguire l'override di CBasePin::GetMediaType nel pin di input.
  • Quando il filtro upstream propone un tipo di supporto, il pin di input chiama il metodo CTransformFilter::CheckInputType , che accetta o rifiuta il tipo.
  • Il pin di output non si connetterà a meno che il pin di input non sia connesso prima. Questo comportamento è tipico per i filtri di trasformazione. Nella maggior parte dei casi, il filtro deve determinare il tipo di input prima di poter impostare il tipo di output.
  • Quando il pin di output esegue la connessione, include un elenco di tipi di supporti che propone al filtro downstream. Chiama il metodo CTransformFilter::GetMediaType per generare questo elenco. Il pin di output tenterà anche qualsiasi tipo di supporto proposto dal filtro downstream.
  • Per verificare se un tipo di output specifico è compatibile con il tipo di input, il pin di output chiama il metodo CTransformFilter::CheckTransform.

I tre metodi CTransformFilter elencati in precedenza sono metodi virtuali pure, pertanto la classe derivata deve implementarle. Nessuno di questi metodi appartiene a un'interfaccia COM; sono semplicemente parte dell'implementazione fornita dalle classi di base.

Le sezioni seguenti descrivono ogni metodo in modo più dettagliato:

Modalità di connessione dei filtri

Scrittura di filtri DirectShow