Freigeben über


Filterorientierte Verarbeitung

Wenn ein Filter Filterorientierte Verarbeitung verwendet, ruft AVStream standardmäßig die vom Minidriver bereitgestellte AVStrMiniFilterProcess-Rückrufroutine auf, wenn Datenrahmen in jeder Pininstanz verfügbar sind. Minidriver können dieses Standardverhalten ändern, indem das Flags-Element der KSPIN_DESCRIPTOR_EX-Struktur festgelegt wird.

Um die filterorientierte Verarbeitung zu implementieren, stellen Sie einen Zeiger auf eine minidriver-bereitgestellte AVStrMiniFilterProcess-Rückrufroutine im Process-Element der KSFILTER_DISPATCH-Struktur bereit. Legen Sie das Process-Element von KSPIN_DISPATCH auf NULL fest.

AVStream ruft AVStrMiniFilterProcess nur auf, wenn alle folgenden Bedingungen erfüllt sind:

  • Frames sind an Pins verfügbar, die für die Verarbeitung Frames benötigen. Minidriver können das Verarbeitungsverhalten ändern, indem Flags im Flags-Element von KSPIN_DESCRIPTOR_EX festgelegt werden. Achten Sie besonders auf Kombinationen der sich gegenseitig ausschließenden Kennzeichen KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING und KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. Der Minidriver kann auch die Menge der Pins ändern, die Frames erfordern, indem er die KsPinAttachAndGate- oder KsPinAttachOrGate-Routinen verwendet.

  • Die Anzahl der Pininstanzen ist gleich oder größer als das InstancesNecessary-Element der KSPIN_DESCRIPTOR_EX-Struktur . Das ClientState-Element der KSPIN-Struktur gibt den bestimmten KSSTATE-Enumerator an, auf dem der Pin derzeit festgelegt ist. Nachdem InstancesNecessary erfüllt wurde, verhindern zusätzliche Pins im KSSTATE_STOP Zustand die Filterverarbeitung nicht.

  • Die erforderliche Anzahl von Pin-Instanzen wird erfüllt (wie durch das InstancesNecessary-Mitglied der KSPIN_DESCRIPTOR_EX-Struktur angegeben).

  • Der Minidriver hat das Prozesskontrolltor des Filters nicht mit den KSGATEXxx-Funktionen geschlossen.

In der AVStrMiniFilterProcess-Rückrufroutine empfängt der Minidriver einen Zeiger auf ein Array von KSPROCESSPIN_INDEXENTRY Strukturen. AVStream sortiert das Array der KSPROCESSPIN_INDEXENTRY-Strukturen nach Pin-ID.

Die folgenden Codebeispiele veranschaulichen die Verwendung der Prozess-Pinstrukturen. Der Code stammt aus dem Beispiel AVStream Filter-Centric Simulated Capture Driver (Avssamp), das veranschaulicht, wie ein filterorientierter Aufnahmetreiber geschrieben wird. Quellcode und eine Beschreibung dieses Beispiels sind im Download des Windows Driver Kit enthalten.

Der Minidriver empfängt ein Array von KSPROCESSPIN_INDEXENTRY Strukturen in seinem Filter-Process Dispatch. In diesem Beispiel extrahiert der Minidriver die erste KSPROCESSPIN-Struktur aus der KSPROCESSPIN_INDEXENTRY-Struktur des Index VIDEO_PIN_ID.

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

Der Minidriver sollte nicht auf ProcessPinsIndex [n] verweisen. Pins [0], bevor überprüft wurde, ob das Count-Element von ProcessPinsIndex [n] mindestens eins ist oder dass das InstancesNecessary-Element der KSPIN_DESCRIPTOR_EX-Struktur in Pins [0] mindestens eins ist. (Wenn letzteres zutrifft, ist der Pin garantiert vorhanden.)

Um dann den Pin anzugeben, an dem Frames erfasst werden sollen, übergibt die AVStrMiniFilterProcess-Rückrufroutine einen Zeiger an eine KSPROCESSPIN-Struktur an CaptureFrame, eine vom Anbieter bereitgestellte Erfassungsroutine:

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

Die Erfassungsroutine kann dann in das oder aus dem Daten-Mitglied der KSPROCESSPIN-Struktur kopiert werden. Es kann auch die BytesUsed - und Terminate-Member dieser Struktur aktualisieren, wie im folgenden Beispiel:

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

Der Minidriver kann auch auf die Datenstromkopfstruktur zugreifen, die dem aktuellen Datenstromzeiger und dem Pin entspricht.

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

Die meisten Minidriver, die eine filterorientierte Verarbeitung einsetzen, verwenden den Streamzeiger lediglich, um auf den Stream-Header zuzugreifen. Im filterorientierten Modell manipuliert AVStream den Datenstromzeiger intern. Daher sollten Minidriver vorsichtig sein, wenn sie den Streamzeiger in einem filterzentrierten Treiber bearbeiten.