Elaborazione incentrata sui filtri

Se un filtro usa l'elaborazione incentrata sui filtri, per impostazione predefinita AVStream chiama la routine di callback AVStrMiniFilterProcess fornita da minidriver quando sono disponibili frame di dati in ogni istanza del pin. I minidriver possono modificare questo comportamento predefinito impostando il membro Flags della struttura KSPIN_DESCRIPTOR_EX .

Per implementare l'elaborazione incentrata sui filtri, fornire un puntatore a una routine di callback AVStrMiniFilterProcess fornita da minidriver nel membro Process della struttura KSFILTER_DISPATCH . Impostare il membro Process di KSPIN_DISPATCH su NULL.

AVStream chiama AVStrMiniFilterProcess solo quando vengono soddisfatte tutte le condizioni seguenti:

  • I fotogrammi sono disponibili nei pin che richiedono fotogrammi per l'elaborazione. I minidriver possono modificare il comportamento di elaborazione impostando i flag nel membro Flag di KSPIN_DESCRIPTOR_EX. Prestare particolare attenzione alle combinazioni dei flag che si escludono a vicenda KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING e KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. Il minidriver può anche modificare il set di pin che richiedono fotogrammi tramite l'uso delle routine KsPinAttachAndGate o KsPinAttachOrGate .

  • Il numero di istanze del pin è uguale o maggiore del membro InstancesNecessary della struttura KSPIN_DESCRIPTOR_EX . Il membro ClientState della struttura KSPIN specifica l'enumeratore KSSTATE specifico in corrispondenza del quale è attualmente impostato il pin. Dopo che InstancesNecessary è stato soddisfatto, i pin aggiuntivi nello stato KSSTATE_STOP non impediranno l'elaborazione del filtro.

  • Viene soddisfatto il numero necessario di istanze di pin, come specificato dal membro InstancesNecessary della struttura KSPIN_DESCRIPTOR_EX .

  • Il minidriver non ha chiuso il controllo del processo del filtro usando le funzioni KSGATEXxx .

Nella routine di callback AVStrMiniFilterProcess , il minidriver riceve un puntatore a una matrice di strutture KSPROCESSPIN_INDEXENTRY . AVStream ordina la matrice di strutture KSPROCESSPIN_INDEXENTRY in base all'ID pin.

Gli esempi di codice seguenti illustrano come usare le strutture dei pin del processo. Il codice viene tratto dall'esempio AVStream Filter-Centric Simulated Capture Driver (Avssamp), che illustra come scrivere un driver di acquisizione incentrato sui filtri. Il codice sorgente e una descrizione di questo esempio sono inclusi nel download degli esempi di Windows Driver Kit.

Il minidriver riceve una matrice di strutture KSPROCESSPIN_INDEXENTRY nell'invio del processo di filtro. In questo esempio, il minidriver estrae la prima struttura KSPROCESSPIN dalla struttura KSPROCESSPIN_INDEXENTRY dell'indice VIDEO_PIN_ID:

NTSTATUS
CCaptureFilter::
Process (
    IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
    )
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}

Il minidriver non deve fare riferimento a ProcessPinsIndex [n]. Aggiunge [0] prima di verificare che il membro Count di ProcessPinsIndex [n] sia almeno uno o che il membro InstancesNecessary della struttura KSPIN_DESCRIPTOR_EX contenuto all'interno di Pin [ 0] sia almeno uno. Se quest'ultimo è true, il pin è garantito che esista.

Quindi, per specificare il pin in cui acquisire i fotogrammi, la routine di callback AVStrMiniFilterProcess passa un puntatore a una struttura KSPROCESSPIN a CaptureFrame, una routine di acquisizione fornita dal fornitore:

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

La routine di acquisizione può quindi copiare da o verso il membro Dati della struttura KSPROCESSPIN. Potrebbe anche aggiornare i membri BytesUsed e Terminate di questa struttura, come nell'esempio seguente:

RtlCopyMemory ( ProcessPin -> Data,
                m_SynthesisBuffer,
                m_VideoInfoHeader -> bmiHeader.biSizeImage
               );
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;

Il minidriver può anche accedere alla struttura dell'intestazione del flusso corrispondente al puntatore di flusso corrente e al pin:

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

La maggior parte dei minidriver che usano l'elaborazione basata sui filtri usa il puntatore di flusso solo per l'accesso all'intestazione del flusso. Nel modello incentrato sui filtri AVStream modifica internamente il puntatore di flusso. Di conseguenza, i minidriver devono procedere con cautela se modificano il puntatore di flusso in un driver incentrato sui filtri.