Übersicht über daten Flow in DirectShow
Dieser Abschnitt bietet einen umfassenden Überblick über die Funktionsweise des Datenflusses in DirectShow. Details finden Sie in anderen Abschnitten der Dokumentation.
Daten werden in Puffern gespeichert, bei denen es sich einfach um Bytearrays handelt. Jeder Puffer wird von einem COM-Objekt umschlossen, das als Medienbeispiel bezeichnet wird und die IMediaSample-Schnittstelle implementiert. Beispiele werden von einem anderen Objekttyp erstellt, der als Allocator bezeichnet wird und die IMemAllocator-Schnittstelle implementiert. Eine Zuweisung wird für jede Pinverbindung zugewiesen, obwohl zwei oder mehr Pinverbindungen dieselbe Zuweisung gemeinsam nutzen können. Die folgende Abbildung veranschaulicht diesen Prozess.

Jede Zuweisung erstellt einen Pool von Medienbeispielen und ordnet die Puffer für jede Stichprobe zu. Wenn ein Filter einen Puffer mit Daten füllen muss, fordert er ein Beispiel von der Zuweisung an, indem IMemAllocator::GetBufferaufgerufen wird. Wenn die Zuweisung über Stichproben verfügt, die derzeit nicht von einem anderen Filter verwendet werden, gibt die GetBuffer-Methode sofort mit einem Zeiger auf das Beispiel zurück. Wenn alle Zuweisungsbeispiele verwendet werden, wird die -Methode blockiert, bis eine Stichprobe verfügbar wird. Wenn die Methode ein Beispiel zurückgibt, fügt der Filter Daten in den Puffer ein, legt die entsprechenden Flags für das Beispiel fest (in der Regel einschließlich eines Zeitstempels) und übermittelt das Beispiel downstream.
Wenn ein Rendererfilter ein Beispiel empfängt, überprüft er den Zeitstempel und hält an der Stichprobe fest, bis die Referenzuhr des Filterdiagramms angibt, dass die Daten gerendert werden sollen. Nachdem der Filter die Daten gerendert hat, gibt er das Beispiel frei. Das Beispiel wird erst wieder in den Pool der Stichproben der Zuweisung aufgenommen, wenn der Verweiszähler der Stichprobe 0 (null) ist. Dies bedeutet, dass jeder Filter das Beispiel freigegeben hat. Die folgende Abbildung veranschaulicht diesen Prozess.

Der Upstreamfilter kann vor dem Renderer ausgeführt werden, d. h., er füllt Puffer schneller aus, als der Renderer sie verbraucht. Dennoch werden Beispiele nicht früh gerendert, da der Renderer jedes bis zur Präsentationszeit enthält. Darüber hinaus überschreibt der Upstreamfilter Puffer nicht versehentlich, da GetSample nur Stichproben zurückgibt, die andernfalls nicht verwendet werden. Die Menge, um die der Upstreamfilter ausgeführt werden kann, richtet sich nach der Anzahl der Stichproben im Pool der Zuweisung.
Das vorherige Diagramm zeigt nur eine Zuweisung, aber in der Regel gibt es mehrere Zuweisungen pro Stream. Wenn der Renderer also ein Beispiel freigibt, kann dies einen kaskadierenden Effekt haben. Das folgende Diagramm zeigt eine Situation, in der ein Decoder einen komprimierten Videoframe enthält, während er darauf wartet, dass der Renderer ein Beispiel freigibt. Ein Parserfilter wartet auch darauf, dass der Decoder ein Beispiel freigibt.

Wenn der Renderer sein Beispiel freigibt, wird der ausstehende Aufruf von GetBuffer des Decoders zurückgegeben. Der Decoder kann dann den komprimierten Videoframe decodieren und das darin enthaltene Beispiel freigeben, wodurch die Blockierung des ausstehenden GetBuffer-Aufrufs des Parsers aufgehoben wird.