AVStream-Splitter
Ein AVStream-Minidriver kann die AVStream-Klassentreiberfunktionalität verwenden, um einen Datenstrom in mehrere Kopien aufzuteilen, wenn der Stream einen bestimmten Pin durchläuft. Dieser Aufteilungsprozess kann nützlich sein, wenn Ihr Treiber einen Eingabedatenstrom kopieren muss, um zwei identische Ausgabestreams zu erzeugen.
Legen Sie hierzu KSPIN_FLAG_SPLITTER im Flags-Member der KSPIN_DESCRIPTOR_EX-Struktur des Pins fest. Wenn dieses Flag auf einer Pin festgelegt ist, fungiert der Pin als automatischer Splitter. AVStream kopiert automatisch alle Daten, die zum Aufteilen des Datenstroms erforderlich sind.
In Versionen nach DirectX8.0 funktioniert das KSPIN_FLAG_SPLITTER-Flag sowohl für Pins für filterzentrierte als auch für pinzentrierte Filter. Frühere Versionen unterstützen dieses Flag nur für Anheftungen an filterzentrierte Filter.
Das folgende Diagramm zeigt die Konfiguration eines Filters, in dem der Eingabestift einen Stream in zwei Ausgabepins aufteilt. Die nachgeschalteten Filter dieses Ausgabenadels ändern die Daten an Ort und Stelle.
Frames werden am Eingabenadel eingetroffen und in der Eingabewarteschlange platziert. Der Minidriver interagiert nur mit der Eingabewarteschlange und der Ausgabewarteschlange für den ursprünglichen Pin. AVStream kopiert automatisch Daten aus der Warteschlange der ersten Pin in die Warteschlange der zweiten Pin.
Der Einfachheit halber zeigt dieses Diagramm nicht, wie Frames für den Ausgabepin bereitgestellt werden. Zum Bereitstellen von Frames für den Ausgabepin können für instance jeder Warteschlange ein Anforderer und eine Zuweisung zugeordnet sein, die zu diesem Pipeabschnitt gehören. Alternativ können die Frames aus einem downstream-Filter stammen.
In der KSFILTER_DISPATCH-Struktur gibt der Minidriver einen Zeiger auf eine vom Anbieter bereitgestellte AVStrMiniFilterProcess-Rückrufroutine an. In dieser Rückrufroutine empfängt der Minitreiber einen Zeiger auf eine KSPROCESSPIN_INDEXENTRY Struktur, die das unten dargestellte Array von KSPROCESSPIN-Strukturen enthält.
Dieses Diagramm zeigt, wie der Minidriver zwischen den beiden Ausgabepins in der Liste der Prozesspins unterscheidet:
In diesem Diagramm bezieht sich DB auf das DelegateBranch-Element der KSPROCESSPIN-Struktur und CS auf das CopySource-Element . Sowohl die DelegateBranch - als auch die CopySource-Member des Eingabestifts und der erste Ausgabepin sind NULL. Dies gibt an, dass der Minitreiber für die Verarbeitung von Frames an diesen Pins verantwortlich ist.
Der zweite Ausgabepin verfügt jedoch über eine CopySource , die auf den ersten Ausgabepin verweist. Dies gibt an, dass sich der zweite Ausgabepin in einer separaten Pipe vom ersten Ausgabepin befindet und dass AVStream automatisch alle Daten kopiert, die in die Warteschlange des ersten Ausgabepins eingefügt werden, in die Warteschlange des zweiten Ausgabepins.
Kompliziertere Splitterfälle können auftreten, wenn zwei Ausgabestifte in derselben Pipe integriert sind. Ein Minidriver kann beispielsweise zwei splitterbasierte Ausgabepins in derselben Pipe enthalten, solange nachgeschaltete Filter die von diesen Pins gesendeten Daten nicht ändern. Da Daten nicht geändert werden, werden die Ausgabepins als schreibgeschützt betrachtet. Beide Downstreamfilter erhalten die gleichen Puffer.
Es ist auch möglich, dass einige der nachgeschalteten Filter, die automatisch an den Splitterpin angefügt werden, die Daten ändern, während andere dies nicht tun.
In diesem Fall könnte das Filterlayout dem folgenden Diagramm ähneln, das einen Filter darstellt, der drei Instanzen des geteilten Ausgabepins enthält:
Die Pins A und B werden derselben Pipe zugewiesen, da die nachgeschalteten Filter die Daten nicht ändern. die Filter nach A und B erhalten die gleichen Pufferzeiger.
Der Minitreiber interagiert nur mit der Eingabewarteschlange und einer einzelnen Ausgabewarteschlange. AVStream kopiert automatisch aus der A/B-Warteschlange und der C-Warteschlange. Außerdem wird ein Splitterobjekt erstellt, das die gleichen Datenrahmen über Pin A und Pin B sendet (beachten Sie, dass sich die Streamheader unterscheiden).
Das Array der KSPROCESSPIN-Strukturen lautet wie folgt:
Der einzige Pin, mit dem der Minitreiber unter normalen Umständen interagieren muss, ist Pin A.
Um die obigen Diagramme zu vereinfachen, wurden die Anforderer und Zuweisungen in den Diagrammen weggelassen. Die Diagramme sollen nur den Frameteilungsprozess veranschaulichen.