AVStream-Rohre und -Leitungen
Eine Pipe ist ein Satz von AVStream-Filtern, die eine gemeinsame Zuweisung verwenden.
Die folgende Abbildung zeigt eine Pipe, die aus drei AVStream-Filtern besteht: einem Quellfilter, einem Inplace-Transformationsfilter und einem Rendererfilter.
In diesem Beispiel hat KSProxy (nicht dargestellt) eine Zuweisung ausgewählt, die durch den Alloc-Block im Diagramm dargestellt wird.
AVStream erstellt ein internes Anfordererobjekt, das dem Quellfilter zugeordnet ist. Im Diagramm wird der Anforderer als Req angezeigt. Der Minidriver gibt im AllocatorFraming-Member von KSPIN_DESCRIPTOR_EX den Typ des Arbeitsspeichers und die Menge des fortlaufenden Arbeitsspeichers an, der einem Frame zugewiesen werden soll. Dementsprechend ruft der Anforderer Frames vom Allocator ab und übergibt sie an die nächste Komponente in der Leitung.
Daten aus dem Quellfilter fließen in einen Transformationsfilter ein, der von einem anderen AVStream-Treiber implementiert wird.
Schließlich fließen Daten in den Rendererfilter, der von einem dritten AVStream-Filter implementiert wird.
Da alle Pins in diesem Diagramm AVStream-Pins sind, verwendet AVStream seine eigenen internen Transportschnittstellen, anstatt IRPs über IoCallDriver zu senden, wodurch die Latenz reduziert und die Leistung verbessert wird.
Insbesondere wenn die Anwendung bewirkt, dass das Diagramm zu KSSTATE_ACQUIRE wechselt (wenn der Benutzer für instance auf Wiedergabe in GraphEdit klickt), verbindet AVStream die Filterwarteschlangen direkt wie oben gezeigt.
Daher werden nachgeschaltete Frames an den Anforderer zurückgegeben, wo sie nach Abschluss des Renderings wiederverwendet werden können. Dieser AVStream-Datenpfad ist eine Verbindung.
Sehen Sie sich ein zweites Beispiel an, das in der folgenden Abbildung gezeigt wird, in dem der Transformationsfilter kein AVStream-Filter, sondern immer noch ein Kernelmodusfilter ist.
Wie im ersten Beispiel enthält dieses Beispiel drei Filter: eine AVStream-Quelle, eine KS-Transformation (dies kann ein Treiber sein, der KS direkt oder einen Minitreiber unter der Streamklasse verwendet) und einen AVStream-Renderer.
Wie in der ersten Abbildung werden zunächst die Stifte miteinander verbunden. Wenn das Filterdiagramm jedoch auf KSSTATE_ACQUIRE übergehen, unterstützt der Kernelstream 1.0-Filter die AVStream-Transportschnittstelle nicht. Daher umgeht AVStream die Pins nicht. Stattdessen muss sie E/A verwenden, um Daten zwischen Filtern zu verschieben.
Wenn ein Frame die Warteschlange des Quellfilters verlässt, ruft AVStream IoCallDriver auf. In diesem Aufruf enthält der Irp-Parameter den Frame, der vom Ausgabepin der Quelle an den Transformationsfilter übergeben werden soll.
Wenn der Eingabenadel des Renderers den IRP empfängt, platziert der Pin den IRP in der Warteschlange. Wenn der Renderertreiber einen Frame vervollständigt, gibt er den Frame an den Eingabenadel des Renderers zurück, wie im zweiten Beispiel gezeigt.
AVStream ruft jetzt IoCompleteRequest auf, um den Frame Upstream zurückzugeben. Der Ausgabepin des Quellfilters empfängt eine Vervollständigungsbenachrichtigung. Die Rückrufroutine für den Pinprozess des Minidrivers kann dann KsStreamPointerUnlock aufrufen und Frames zurück zum Anfordernden verschieben, um sie in die Leitung zu recyceln.
Betrachten Sie ein letztes Beispiel, in dem sich die Framequelle im Benutzermodus befindet. (Alternativ kann sich das endgültige Frameziel im Benutzermodus befinden.)
In der folgenden Abbildung empfängt ein Nicht-Inplace-Transformationsfilter im Kernelmodus Frames von einem DirectShow-Filter im Benutzermodus und sendet den transformierten Frame an einen AVStream-Renderer im Kernelmodus:
Wenn Frames aus dem Benutzermodus eingehen, platziert das AVStream-Pinobjekt sie in der Warteschlange für den Eingabepipeabschnitt.
Der Nicht-Inplace-Transformationsfilter ordnet die transformierten Frames im Kernelmodus zu und verwendet dann die zweite Pipe als Verbindung für diese Frames. Da der Renderer ein AVStream-Filter ist, umgeht AVStream die Pins und verwendet die AVStream-Transportschnittstelle, um die Frames direkt in der Warteschlange des Renderingfilters zu platzieren.
Der Minitreiber kann Frames in die Leitung einfügen , indem KsPinSubmitFrame oder KsPinSubmitFrameMdl aufgerufen wird. Wenn der Minitreiber diese Methode verwendet, empfängt der AVStream-Anforderer frames als Ergebnis dieser Aufrufe und nicht von einer Kernelmoduszuweisung.