Delen via


Filter-gecentreerde verwerking

Als een filter gebruikmaakt van filtergerichte verwerking, roept AVStream standaard de door de minidriver geleverde AVStrMiniFilterProcess-callbackroutine aan wanneer er gegevensframes beschikbaar zijn voor elk pincodeexemplaren. Minidrivers kunnen dit standaardgedrag wijzigen door het lid Vlaggen van de KSPIN_DESCRIPTOR_EX structuur in te stellen.

Als u filtergerichte verwerking wilt implementeren, geeft u een aanwijzer naar een door de minidriver geleverde AVStrMiniFilterProcess-callbackroutine in het proceslid van de KSFILTER_DISPATCH-structuur . Stel het proceslid van KSPIN_DISPATCH in op NULL.

AVStream roept AVStrMiniFilterProcess alleen aan wanneer aan alle volgende voorwaarden wordt voldaan:

  • Frames zijn beschikbaar op pinnen waarvoor frames verwerkt moeten worden. Minidrivers kunnen het verwerkingsgedrag wijzigen door vlaggen in te stellen in het lid Vlaggen van KSPIN_DESCRIPTOR_EX. Let vooral op combinaties van de vlaggen die wederzijds exclusief zijn, KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING en KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. De minidriver kan ook de verzameling pinnen wijzigen waarvoor frames nodig zijn met de KsPinAttachAndGate of KsPinAttachOrGate-routines.

  • Het aantal pin-instanties is gelijk aan of groter dan het InstancesNecessary-lid van de KSPIN_DESCRIPTOR_EX-structuur. Het ClientState-lid van de KSPIN-structuur geeft de specifieke KSSTATE-enumerator aan waarop de pin momenteel is ingesteld. Nadat instancesNecessary is bereikt, kunnen extra pinnen in de status KSSTATE_STOP de filterverwerking niet voorkomen.

  • Het vereiste aantal pin-exemplaren is bereikt (zoals opgegeven door het InstancesNecessary-lid van de KSPIN_DESCRIPTOR_EX-structuur).

  • De minidriver heeft de procesbesturingspoort van het filter niet gesloten met behulp van de KSGATEXxx-functies .

In de callbackroutine AVStrMiniFilterProcess ontvangt de minidriver een aanwijzer naar een matrix van KSPROCESSPIN_INDEXENTRY structuren. AVStream ordeert de matrix van KSPROCESSPIN_INDEXENTRY structuren op pincode-id.

In de volgende codevoorbeelden ziet u hoe u de procespinstructuren gebruikt. De code wordt opgehaald uit het AVStream-voorbeeld Filter-Centric Simulated Capture Driver (Avssamp), waarin wordt gedemonstreerd hoe u een filtergericht capture-stuurprogramma schrijft. Broncode en een beschrijving van dit voorbeeld zijn opgenomen in de download van windows Driver Kit-voorbeelden.

De minidriver ontvangt een matrix van KSPROCESSPIN_INDEXENTRY structuren in de filterprocesverzending. In dit voorbeeld extraheert de minidriver de eerste KSPROCESSPIN-structuur uit de KSPROCESSPIN_INDEXENTRY-structuur met index VIDEO_PIN_ID.

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

De minidriver mag niet verwijzen naar ProcessPinsIndex [n]. Pinnen [0] voordat is geverifieerd dat het aantal lid van ProcessPinsIndex [n] ten minste één is , of dat het lid InstancesNecessary van de KSPIN_DESCRIPTOR_EX structuur in Pins [0] ten minste één is. (Als de laatste waar is, is de pincode gegarandeerd aanwezig.)

Als u vervolgens de pin wilt opgeven waarop frames moeten worden vastgelegd, geeft de callbackroutine AVStrMiniFilterProcess een aanwijzer door aan een KPROCESSPIN-structuur aan CaptureFrame, een door de leverancier geleverde opnameroutine:

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

De opnameroutine kan vervolgens kopiëren naar of van het gegevenslid van de KPROCESSPIN-structuur. Het kan ook de BytesUsed en Terminate-leden van deze structuur bijwerken, zoals in het volgende voorbeeld:

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

De minidriver heeft ook toegang tot de streamheaderstructuur die overeenkomt met de huidige stroompointer en pin:

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

De meeste minidrivers die gebruikmaken van filtergerichte verwerking, gebruiken alleen de streampointer voor toegang tot de streamheader. In het filtergerichte model bewerkt AVStream de streampointer intern. Als gevolg hiervan moeten minidrivers voorzichtig blijven als ze de streampointer manipuleren in een filtergericht stuurprogramma.