Condividi tramite


Classe CDynamicOutputPin

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

La CDynamicOutputPin classe implementa un pin di output che supporta le riconnessioni dinamiche e le modifiche al formato.

Questa classe deriva dalla classe CBaseOutputPin e implementa l'interfaccia IPinFlowControl . Supporta diverse operazioni importanti per la compilazione dinamica del grafico:

  • Riconnessione dinamica: il pin può disconnettersi e riconnettersi mentre il filtro è ancora attivo (sospeso o in esecuzione).
  • Modifica del formato dinamico: il pin può negoziare un nuovo tipo di supporto mentre il filtro è ancora attivo, senza riconnettersi.
  • Controllo del flusso: il filtro proprietario (o un'applicazione) può bloccare il flusso di dati dal pin senza arrestare il filtro.

Per altre informazioni, vedere Compilazione dinamica del grafo.

Il pin ha tre possibili stati: bloccato, sbloccato e in sospeso. Nello stato in sospeso , il pin è in attesa del completamento di un'operazione su un altro thread, prima che il pin passi allo stato bloccato. Mentre il pin è bloccato, il filtro non può recapitare i dati tramite il pin o modificare la connessione del pin.

Per coordinare più thread, il filtro proprietario deve seguire determinate regole. Per altre informazioni sui thread nel grafico dei filtri, vedere Thread e sezioni critiche. Prima di tutto, il thread di streaming deve chiamare sempre il metodo CDynamicOutputPin::StartUsingOutputPin prima di chiamare uno dei metodi seguenti:

Successivamente, deve chiamare il metodo CDynamicOutputPin::StopUsingOutputPin .

In secondo luogo, il thread dell'applicazione non deve chiamare nessuno dei metodi nell'elenco precedente. In terzo luogo, il thread di streaming non deve chiamare i metodi di classe che bloccano o sbloccano il pin. Questi metodi sono: CDynamicOutputPin::Block, CDynamicOutputPin::SynchronousBlockOutputPin, CDynamicOutputPin::AsynchronousBlockOutputPin e CDynamicOutputPin::UnblockOutputPin.

Queste regole assicurano che il thread dell'applicazione non possa bloccare il pin mentre il thread di streaming lo usa e viceversa. Dopo che il thread di streaming ha chiamato StartUsingOutputPin, il pin non verrà bloccato fino a quando il thread di streaming chiama StopUsingOutputPin. Viceversa, se il pin è bloccato, StartUsingOutputPin attende fino a quando il pin non viene sbloccato.

Per evitare di dimenticare di chiamare StopUsingOutputPin, è possibile usare la classe CAutoUsingOutputPin . Chiama StopUsingOutputPin automaticamente quando esce dall'ambito.

Quando il filtro proprietario unisce o lascia il grafico del filtro (nel relativo metodo IBaseFilter::JoinFilterGraph ), deve chiamare il metodo CDynamicOutputPin::SetConfigInfo del pin.

Variabili membro protette Descrizione
m_BlockStateLock Sezione critica che protegge lo stato di blocco.
m_hUnblockOutputPinEvent Evento segnalato quando il pin non è bloccato.
m_hNotifyCallerPinBlockedEvent Evento segnalato quando il pin si blocca correttamente o l'utente annulla un blocco in sospeso.
m_BlockState Stato di blocco.
m_dwBlockCallerThreadID Identificatore del thread che ha chiamato l'ultimo metodo IPinFlowControl::Block su questo pin.
m_dwNumOutstandingOutputPinUsers Numero di thread di streaming che usano questo pin.
m_hStopEvent Evento segnalato quando il filtro si arresta o il pin scarica i dati.
m_pGraphConfig Puntatore all'interfaccia IGraphConfig per l'esecuzione di riconnessioni dinamiche.
m_bPinUsesReadOnlyAllocator Flag che specifica se i campioni dell'allocatore del pin sono di sola lettura.
Metodi protetti Descrizione
SynchronousBlockOutputPin Blocca il pin; non restituisce finché il pin non viene bloccato.
AsynchronousBlockOutputPin Blocca il pin; potrebbe restituire prima che il pin venga bloccato.
UnblockOutputPin Sblocca il pin.
BlockOutputPin Blocca il pin.
WaitEvent Attende fino a quando non viene segnalato l'evento specificato.
Metodi pubblici Descrizione
CDynamicOutputPin Metodo del costruttore.
~CDynamicOutputPin Metodo distruttore.
SetConfigInfo Specifica il puntatore IGraphConfig e l'evento di arresto.
DeliverBeginFlush Richiede al pin di input connesso di avviare un'operazione di scaricamento.
DeliverEndFlush Richiede il pin di input connesso per terminare un'operazione di scaricamento.
Inactive Notifica al pin che il filtro è stato arrestato.
Attivo Notifica al pin che il filtro è ora attivo.
CompleteConnect Completa una connessione a un pin di input. Virtuale.
StartUsingOutputPin Ottiene l'accesso al pin per un'operazione di streaming. Virtuale.
StopUsingOutputPin Rilascia l'accesso al pin dopo un'operazione di streaming. Virtuale.
StreamingThreadUsingOutputPin Determina se un thread esegue un'operazione di streaming sul pin. Virtuale.
ChangeOutputFormat Modifica dinamicamente il tipo di supporto per la connessione e fornisce nuove informazioni di segmento.
ChangeMediaType Modifica dinamicamente il tipo di supporto per la connessione.
DynamicReconnect Esegue una riconnessione dinamica con un nuovo tipo di supporto.
Metodi IPin Descrizione
Disconnetti Interrompe la connessione di pin corrente.
Metodi IPinFlowControl Descrizione
Blocca Blocca o sblocca il flusso di dati dal pin.

Requisiti

Requisito Valore
Intestazione
Amfilter.h (include Streams.h)
Libreria
Strmbase.lib (build al dettaglio);
Strmbasd.lib (build di debug)