次の方法で共有


先頭と末尾のエッジ ストリーム ポインター

デフォルトでは、各 AVStream キューには、先頭のエッジ ストリーム ポインターが含まれています。 先頭のエッジは、キューに到着した新しいフレームを指します。 具体的には、先頭のエッジは最初にキューに到着した最初のフレームを指し、ミニドライバーによって移動するまで動きません。 AVStream は先頭のエッジを作成し、そのエッジはキューの有効期間中に存在します。 ミニドライバーは、Microsoft が提供する関数を使用して、先頭のエッジを操作できます。

新しいフレームがキューに到着すると、AVStream は、先頭のエッジがまだフレームを指していない場合に限り、このフレームを指すように先頭のエッジを設定します。

先頭のエッジ ストリーム ポインターへのポインターを取得するために、ミニドライバーは KsPinGetLeadingEdgeStreamPointer を呼び出します。

ミニドライバーは、次の表にまとめられている 2 つの状況を除くすべての状況で、先頭のエッジを進める役割があります。

状況 AVStream の動作

これまでは空だったキューにフレームが到達します。

AVStream は、このフレームを指す先頭のエッジを設定します。

先頭のエッジはフレームを指します。 このフレームに対応する IRP は取り消されます。

AVStream によって、先頭のエッジを進めます。 先頭のエッジが新しいフレームを指すようになりました。

ストリーム ポインターの進行の詳細については、「ストリーム ポインターの概要」を参照してください。

末尾のエッジ ストリーム ポインターの指定

ミニドライバーは、キューに末尾のストリーム ポインターを指定できます。 通常、末尾のエッジは、ミニドライバーの最も古い対象フレームを示します。 末尾のエッジを指定するには、KSPIN_DESCRIPTOR_EX 構造体に関連する Flags メンバーの KSPIN_FLAG_DISTINCT_TRAILING_EDGE フラグを設定します。 次の、KsPinGetTrailingEdgeStreamPointer を呼び出し、末尾のエッジ ストリーム ポインターへのポインターを取得します。

末尾のエッジが進むと、それまで指していたフレームの参照カウントがゼロになり、フレームが完了します。 フレームが IRP に含まれる最後のフレームである場合、シンク ピンは呼び出し元に対して IRP を完了させます。ソース ピンは、それが接続されているピンに対して IRP を送信します。

フレーム ウィンドウの維持

ストリーム ポインターの概要」で説明したフレーム参照カウント ルールの結果、先頭と末尾の間にあるフレームは、そのフレームがストリーム ポインターによって参照されていなくても、キャンセルされるまでキューに残ります。 そのため、ミニドライバーは、先頭のエッジと末尾のエッジのポインターを使用して、複数の連続したフレームの作業ウィンドウを維持できます。 たとえば、ウィンドウ内のフレームが処理中または入力中である可能性があります。

次の図では、最も古いフレームが一番下にあります。 新しいフレームが上部に到着します。 各フレームの数値は、そのフレームの参照カウントです。 ストリーム ポインターが進むと、この図の上に移動します。

diagram illustrating avstream stream pointers referencing pin queues.

左端のキューは、ミニドライバーが末尾のエッジを使用してフレームのワーキング セットを作成する方法を示しています。 ストリーム ポインターがこれらのフレームを参照していないにもかかわらず、先頭と末尾のエッジの間の各フレームの参照カウントが 1 になっています。

真ん中のキューは、ストリーム ポインターのクローニングの例です。 ドライバーは、AVStream DMA サービスのピンの処理ステップで説明されているように、繰り返しクローンを作成して、先頭のエッジを進めます。

右端のキューは、ストリーム ポインターのクローンを使用して、ミニドライバーが末尾のエッジの背後にあるフレームの参照カウントを維持する方法を示しています。