Condividi tramite


QueryAccept (Downstream)

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita 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.

Questo meccanismo consente a un pin di output di proporre un nuovo formato al peer downstream. Il nuovo formato non deve richiedere dimensioni del buffer maggiori. Il pin di output esegue le operazioni seguenti:

  1. Chiama IPin::QueryAccept o IPinConnection::D ynamicQueryAccept sul pin downstream, per verificare se l'altro pin può accettare il nuovo tipo di supporto (vedere figura, passaggio A).

  2. Se il valore restituito dal passaggio 1 è S_OK, il pin collega il tipo di supporto all'esempio successivo. A tale scopo, chiama prima IMemAllocator::GetBuffer per ottenere l'esempio (B). Chiama quindi IMediaSample::SetMediaType per collegare il tipo di supporto a tale esempio (C). Collegando il tipo di supporto all'esempio, il filtro indica che il formato è stato modificato, a partire da tale esempio.

  3. Il pin fornisce l'esempio (D).

  4. Quando il filtro downstream riceve l'esempio, chiama IMediaSample::GetMediaType per recuperare il nuovo tipo di supporto.

    queryaccept (downstream)

Tutti i pin supportano il metodo QueryAccept. Tuttavia, questo metodo è leggermente ambiguo, perché un valore restituito di S_OK non garantisce sempre che sia possibile modificare il formato mentre il grafico è attivo. Alcuni filtri potrebbero restituire S_OK ma rifiutare la modifica se il grafico è attivo. Il metodo DynamicQueryAccept, supportato da alcuni pin di input, definisce in modo esplicito S_OK per indicare che il pin può modificare i formati mentre è attivo. Se un pin di input supporta l'interfaccia IPinConnection, è necessario chiamare DynamicQueryAccept anziché QueryAccept.

Nella maggior parte dei casi, questo meccanismo non consente modifiche drastiche al formato, ad esempio la modifica della profondità del bit. Una situazione in cui può essere usata è quando un decodificatore video commuta le tavolozze. I dettagli di base del formato rimangono invariati, ad esempio le dimensioni dell'immagine e la profondità di bit, ma il nuovo tipo di supporto ha un set diverso di voci di tavolozza.

nota sull'implementazione

Nelle classi di base DirectShow CBasePin::QueryAccept chiama il metodo CheckMediaType, che viene chiamato anche durante la connessione pin iniziale. Nel caso di un filtro di trasformazione, il pin di input checkMediaType metodo deve sempre controllare se il pin di output è connesso e, in tal caso, se il tipo di supporto di input è compatibile con il tipo di supporto di output. Pertanto, questa implementazione sarà probabilmente valida per QueryAccept. In caso contrario, è necessario eseguire l'override di QueryAccept per eseguire eventuali controlli aggiuntivi necessari. Si noti inoltre che la classe CTransformFilter incapsula questa logica all'interno dei metodi CheckInputType e CheckTransform. La classeCTransInPlaceFilter, invece, chiama sempre QueryAccept sul successivo filtro upstream o downstream.

Il metodo CBaseInputPin::Receive verifica la presenza di un tipo di supporto nell'esempio in ingresso e, se presente, chiama CheckMediaType. Tuttavia, non aggiorna il membro m_mt del pin, che contiene il tipo di supporto corrente. Quando il filtro elabora l'esempio, è necessario controllare l'esempio per un tipo di supporto. Se è presente un nuovo tipo, probabilmente sarà necessario archiviarlo, chiamando SetMediaType sul pin o impostando direttamente il valore di m_mt. D'altra parte, la classe CVideoTransformFilter, progettata per i filtri di trasformazione video, archivia il tipo di supporto quando cambia. Per informazioni dettagliate, vedere il codice sorgente per CVideoTransformFilter::Receive nella libreria di classi di base DirectShow.

In alcuni casi, è possibile passare semplicemente il QueryAccept chiamata downstream, quindi collegare il tipo di supporto all'esempio di output e lasciare che il filtro downstream gestisca la modifica del formato.