Condividi tramite


Elaborazione incentrata sui filtri

Se un filtro utilizza un'elaborazione basata su filtro, per impostazione predefinita AVStream chiama la routine di callback AVStrMiniFilterProcess fornita dal minidriver quando i frame di dati sono disponibili su ogni istanza del pin. I minidriver possono modificare questo comportamento predefinito impostando il membro Flags della struttura KSPIN_DESCRIPTOR_EX .

Per implementare l'elaborazione basata sui filtri, fornire un puntatore a una routine di callback AVStrMiniFilterProcess fornita dal 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. Una volta che InstancesNecessary è stato soddisfatto, i pin aggiuntivi in KSSTATE_STOP non impediranno l'elaborazione dei filtri.

  • Il numero richiesto di istanze di pin viene soddisfatto (come specificato dal membro InstancesNecessary della struttura KSPIN_DESCRIPTOR_EX .

  • Il minidriver non ha chiuso la portella di 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 del pin.

Gli esempi di codice seguenti illustrano come usare le strutture del 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]. I pin [0] prima di aver verificato 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 è vero, si garantisce l'esistenza del pin.

Quindi, per specificare il pin su cui acquisire 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 di 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 su filtro usano il puntatore di flusso solo per l'accesso al header di flusso. Nel modello incentrato sui filtri AVStream modifica internamente il puntatore di flusso. Di conseguenza, i minidriver devono procedere con cautela se manipolano il puntatore di flusso in un driver incentrato sui filtri.