Condividi tramite


Splitter AVStream

Un minidriver AVStream può usare la funzionalità del driver di classe AVStream per suddividere un flusso di dati in diverse copie man mano che il flusso passa attraverso un pin specificato. Questo processo di suddivisione può essere utile se il driver deve copiare un flusso di input per produrre due flussi di output identici.

A tale scopo, impostare KSPIN_FLAG_SPLITTER nel membro Flags della struttura KSPIN_DESCRIPTOR_EX del pin. Quando questo flag viene impostato su un pin, il pin funge da separatore automatico. AVStream copia automaticamente tutti i dati necessari per suddividere il flusso.

Nelle versioni successive a DirectX8.0, il flag KSPIN_FLAG_SPLITTER funziona per i pin sia nei filtri incentrati sui filtri incentrati sui filtri chesui pin. Le versioni precedenti supportano questo flag solo per i pin nei filtri incentrati sui filtri.

Il diagramma seguente illustra la configurazione di un filtro in cui il pin di input suddivide un flusso in due pin di output. I filtri downstream di questo pin di output modificano i dati in posizione.

Diagramma che illustra un filtro avstream con un pin di output di divisione.

I fotogrammi arrivano sul pin di input e vengono inseriti nella coda di input. Il minidriver interagisce solo con la coda di input e la coda di output per il pin originale. AVStream copia automaticamente i dati dalla coda del primo pin alla coda del secondo pin.

Per semplicità, questo diagramma non mostra come vengono forniti fotogrammi al pin di output. Per fornire frame al pin di output, ad esempio, potrebbe essere presente un richiedente e un allocatore associato a ogni coda e appartenente a questa sezione della pipe. In alternativa, i fotogrammi potrebbero provenire da un filtro downstream.

Nella struttura KSFILTER_DISPATCH il minidriver specifica un puntatore a una routine di callback AVStrMiniFilterProcess fornita dal fornitore. Questa routine di callback è la posizione in cui il minidriver riceve un puntatore a una struttura KSPROCESSPIN_INDEXENTRY contenente la matrice di strutture KSPROCESSPIN descritte di seguito.

Questo diagramma mostra come il minidriver distingue tra i due pin di output nell'elenco dei pin del processo:

diagramma di una tabella di puntini di processo per due puntini di divisione.

In questo diagramma db fa riferimento al membro DelegateBranch della struttura KSPROCESSPIN e CS fa riferimento al membro CopySource . Sia i membri DelegateBranch che CopySource del pin di input e il primo pin di output sono NULL. Ciò indica che il minidriver è responsabile della gestione dei fotogrammi su questi pin.

Il secondo pin di output, tuttavia, ha un oggetto CopySource che punta al primo pin di output. Ciò indica che il secondo pin di output si trova in una pipe separata dal primo pin di output e che AVStream copia automaticamente tutti i dati inseriti nella coda del primo pin di output nella coda del secondo pin di output.

Casi di divisione più complessi possono verificarsi quando due pin di output vengono incorporati nella stessa pipe. Un minidriver può includere due pin di output basati su splitter nella stessa pipe, ad esempio, purché i filtri downstream non modificherebbero i dati inviati da questi pin. Poiché i dati non vengono modificati, i pin di output vengono considerati di sola lettura; entrambi i filtri downstream ricevono gli stessi buffer.

È anche possibile che alcuni dei filtri downstream che si collegano automaticamente al pin di divisione modifino i dati mentre altri non lo fanno.

In questo caso, il layout del filtro potrebbe essere simile al diagramma seguente, che illustra un filtro che contiene tre istanze del pin di output diviso:

diagramma che illustra un filtro avstream con tre pin di output divisi.

I pin A e B vengono assegnati alla stessa pipe perché i filtri downstream non modificano i dati; i filtri downstream di A e B ricevono gli stessi puntatori del buffer.

Il minidriver interagisce solo con la coda di input e una singola coda di output. AVStream copia automaticamente dalla coda A/B e dalla coda C. Crea anche un oggetto splitter che invia gli stessi frame di dati tramite il pin A e il pin B (si noti che le intestazioni del flusso differiscono).

La matrice di strutture KSPROCESSPIN è la seguente:

diagramma di una tabella dei pin di processo per tre pin di output suddivisi.

L'unico pin con cui il minidriver deve interagire in circostanze normali è il pin A.

Per semplificare i diagrammi precedenti, i richiedenti e gli allocatori sono stati omessi dai diagrammi. I diagrammi sono progettati per illustrare solo il processo di suddivisione dei fotogrammi.