Führende und nachfolgende Edgestreamzeiger
Standardmäßig enthält jede AVStream-Warteschlange einen führenden Streamzeiger. Der führende Rand zeigt auf neue Frames, wenn sie in der Warteschlange eintreffen. Insbesondere zeigt die Führende Kante zunächst auf den ersten Frame, um in die Warteschlange zu gelangen, und bewegt sich erst, wenn der Minidriver ihn bewegt. AVStream erstellt den führenden Edge, der dann für die Lebensdauer der Warteschlange vorhanden ist. Minidriver können den führenden Edge mithilfe von Funktionen von Microsoft bearbeiten.
Wenn ein neuer Frame in einer Warteschlange eintrifft, legt AVStream die führende Kante so fest, dass sie auf diesen Frame zeigt, vorausgesetzt, die führende Kante zeigt nicht bereits auf einen Frame.
Um einen Zeiger auf den führenden Streamzeiger abzurufen, ruft der Minidriver KsPinGetLeadingEdgeStreamPointer auf.
Der Minidriver ist für die Weiterentwicklung des Spitzenplatzes in allen Situationen verantwortlich, mit Der Folgenden Tabelle sind jedoch die beiden Situationen zusammengefasst.
Situation | Verhalten von AVStream |
---|---|
Ein Frame wird in einer zuvor leeren Warteschlange eingetroffen. |
AVStream legt die führende Kante so fest, dass sie auf diesen Frame verweist. |
Die führende Kante zeigt auf einen Frame. Die diesem Frame entsprechende IRP wird abgebrochen. |
AVStream treibt den Vorsprung voran. Die Kante zeigt nun auf einen neueren Frame. |
Weitere Informationen zum Voranbringen von Streamzeigern finden Sie unter Einführung in Streamzeiger .
Angeben eines nachfolgenden Edgestreamzeigers
Minidriver können angeben, dass eine Warteschlange über einen nachfolgenden Edgestreamzeiger verfügt. Der hintere Rand gibt normalerweise den ältesten Frame an, der für den Minidriver von Interesse ist. Um eine nachfolgende Kante anzugeben, legen Sie das KSPIN_FLAG_DISTINCT_TRAILING_EDGE-Flag im Flags-Element der relevantenKSPIN_DESCRIPTOR_EX-Struktur fest. Rufen Sie dann KsPinGetTrailingEdgeStreamPointer auf, um einen Zeiger auf den nachfolgenden Edgestreamzeiger zu erhalten.
Wenn die nachfolgende Kante voranschreitet, sinkt die Referenzanzahl für den Frame, auf den er zuvor gezeigt hat, auf 0, und der Frame wird abgeschlossen. Wenn der Frame der letzte in seinem IRP enthaltene ist, schließt ein Senkennadel die IRP an den Aufrufer ab. ein Quellpin sendet den IRP an den Pin, mit dem er verbunden ist.
Verwalten eines Framefensters
Als Ergebnis der unter Einführung in Streamzeiger beschriebenen Regeln für die Frameverweisanzahl verbleibt ein Frame zwischen der führenden und der nachfolgenden Kante in der Warteschlange, bis er abgebrochen wird, auch wenn kein Streamzeiger auf den Frame verweist. Daher kann ein Minidriver die führenden und nachfolgenden Edgezeiger verwenden, um ein Arbeitsfenster mit mehreren zusammenhängenden Frames beizubehalten. Frames im Fenster können z. B. auf die Verarbeitung oder Füllung warten.
Im folgenden Diagramm befinden sich die ältesten Frames am unteren Rand. Neue Frames kommen oben an. Die Zahl in jedem Frame ist die Referenzanzahl für diesen Frame. Wenn die Streamzeiger voranschreiten, werden sie in diesem Diagramm nach oben verschoben.
Die linke Warteschlange zeigt, wie der Minidriver eine nachgestellte Kante verwenden kann, um einen funktionierenden Satz von Frames zu erstellen. Jeder Frame zwischen der führenden und der nachfolgenden Kante weist die Referenzanzahl 1 auf, obwohl keine Streamzeiger auf diese Frames verweisen.
Die mittlere Warteschlange ist ein Beispiel für das Klonen von Streamzeigern. Der Treiber hat wiederholt geklont und dann den Führenden Edge erweitert, wie in den Anheftprozessschritten in AVStream DMA Services beschrieben.
Die Warteschlange ganz rechts zeigt, wie der Minidriver die Referenzanzahl für einen Frame hinter dem nachfolgenden Rand mithilfe eines Streamzeigerklons beibehalten kann.