Condividi tramite


Tubi e circuiti AVStream

Una pipe è un set di filtri AVStream che condividono un allocatore comune.

La figura seguente mostra una pipe composta da tre filtri AVStream: un filtro di origine, un filtro di trasformazione inplace e un filtro del renderer.

diagramma che illustra una pipe usando tutti i filtri avstream.

In questo esempio KSProxy (non visualizzato) ha scelto un allocatore, rappresentato dal blocco Alloc nel diagramma.

AVStream crea un oggetto richiedente interno associato al filtro di origine. Nel diagramma, il richiedente viene visualizzato come Req. Il minidriver specifica nel membro AllocatorFraming di KSPIN_DESCRIPTOR_EX il tipo di memoria e la quantità di memoria continua da assegnare a un frame. Di conseguenza, il richiedente ottiene fotogrammi dall'allocatore e li passa al componente successivo nel circuito.

I dati dal filtro di origine vengono caricati in un filtro di trasformazione implementato da un altro driver AVStream.

Infine, i dati passano al filtro del renderer implementato da un terzo filtro AVStream.

Poiché tutti i pin in questo grafico sono pin AVStream, AVStream usa le proprie interfacce di trasporto interne anziché l'invio di IRP tramite IoCallDriver, riducendo la latenza e migliorando le prestazioni.

In particolare, quando l'applicazione causa la transizione del grafico a KSSTATE_ACQUIRE (ad esempio, quando l'utente fa clic su Play in GraphEdit), AVStream connette direttamente le code di filtro come illustrato sopra.

Pertanto, i frame inviati downstream tornano al richiedente, dove possono essere riciclati al termine del rendering. Questo percorso dati AVStream è un circuito.

Si consideri un secondo esempio, illustrato nella figura seguente, in cui il filtro di trasformazione non è un filtro AVStream, ma è ancora un filtro in modalità kernel.

diagramma che illustra una pipe usando un filtro di trasformazione in modalità kernel non avstream.

Come nel primo esempio, questo esempio include tre filtri: un'origine AVStream, una trasformazione KS (questo potrebbe essere un driver che usa direttamente KS o un minidriver sotto classe di flusso) e un renderer AVStream.

Come nella prima figura, i pin sono prima interconnessi. Quando il grafico del filtro passa a KSSTATE_ACQUIRE, tuttavia, il filtro Kernel Streaming 1.0 non supporta l'interfaccia di trasporto AVStream. Di conseguenza, AVStream non ignora i pin; deve invece usare I/O per spostare i dati tra i filtri.

In particolare, quando un frame lascia la coda del filtro di origine, AVStream chiama IoCallDriver. In questa chiamata il parametro Irp contiene il frame da passare dal pin di output dell'origine al filtro di trasformazione.

Quando il pin di input del renderer riceve l'IRP, il pin inserisce l'IRP nella coda. Quando il driver del renderer completa un frame, restituisce il frame al pin di input del renderer, come illustrato nel secondo esempio.

AVStream chiama ora IoCompleteRequest per restituire il frame upstream. Il pin di output del filtro di origine riceve una notifica di completamento. La routine di callback del processo di pin del minidriver può quindi chiamare KsStreamPointerUnlock e spostare i fotogrammi al richiedente da riciclare nel circuito.

Si consideri un esempio finale in cui l'origine frame è in modalità utente. In alternativa, la destinazione del frame finale potrebbe essere in modalità utente.

Nella figura seguente, un filtro di trasformazione in modalità kernel non inplace riceve fotogrammi da un filtro DirectShow in modalità utente e invia il frame trasformato a un renderer AVStream in modalità kernel:

diagramma che illustra i frame ricevuti da un'origine in modalità utente e inviata a un renderer avstream.

Quando i frame arrivano dalla modalità utente, l'oggetto pin AVStream li inserisce nella coda per la sezione della pipe di input.

Il filtro di trasformazione non posto alloca i frame trasformati in modalità kernel e quindi usa la seconda pipe come circuito per questi fotogrammi. Poiché il renderer è un filtro AVStream, AVStream ignora i pin e usa l'interfaccia di trasporto AVStream per posizionare i frame direttamente nella coda del filtro di rendering.

Il minidriver può inserire fotogrammi nel circuito chiamando KsPinSubmitFrame o KsPinSubmitFrameMdl. Se il minidriver usa questo metodo, il richiedente AVStream riceve i frame come risultato di queste chiamate, anziché da un allocatore in modalità kernel.