先頭と末尾のエッジ ストリーム ポインター
デフォルトでは、各 AVStream キューには、先頭のエッジ ストリーム ポインターが含まれています。 先頭のエッジは、キューに到着した新しいフレームを指します。 具体的には、先頭のエッジは最初にキューに到着した最初のフレームを指し、ミニドライバーによって移動するまで動きません。 AVStream は先頭のエッジを作成し、そのエッジはキューの有効期間中に存在します。 ミニドライバーは、Microsoft が提供する関数を使用して、先頭のエッジを操作できます。
新しいフレームがキューに到着すると、AVStream は、先頭のエッジがまだフレームを指していない場合に限り、このフレームを指すように先頭のエッジを設定します。
先頭のエッジ ストリーム ポインターへのポインターを取得するために、ミニドライバーは KsPinGetLeadingEdgeStreamPointer を呼び出します。
ミニドライバーは、次の表にまとめられている 2 つの状況を除くすべての状況で、先頭のエッジを進める役割があります。
状況 | AVStream の動作 |
---|---|
これまでは空だったキューにフレームが到達します。 |
AVStream は、このフレームを指す先頭のエッジを設定します。 |
先頭のエッジはフレームを指します。 このフレームに対応する IRP は取り消されます。 |
AVStream によって、先頭のエッジを進めます。 先頭のエッジが新しいフレームを指すようになりました。 |
ストリーム ポインターの進行の詳細については、「ストリーム ポインターの概要」を参照してください。
末尾のエッジ ストリーム ポインターの指定
ミニドライバーは、キューに末尾のストリーム ポインターを指定できます。 通常、末尾のエッジは、ミニドライバーの最も古い対象フレームを示します。 末尾のエッジを指定するには、KSPIN_DESCRIPTOR_EX 構造体に関連する Flags メンバーの KSPIN_FLAG_DISTINCT_TRAILING_EDGE フラグを設定します。 次の、KsPinGetTrailingEdgeStreamPointer を呼び出し、末尾のエッジ ストリーム ポインターへのポインターを取得します。
末尾のエッジが進むと、それまで指していたフレームの参照カウントがゼロになり、フレームが完了します。 フレームが IRP に含まれる最後のフレームである場合、シンク ピンは呼び出し元に対して IRP を完了させます。ソース ピンは、それが接続されているピンに対して IRP を送信します。
フレーム ウィンドウの維持
「ストリーム ポインターの概要」で説明したフレーム参照カウント ルールの結果、先頭と末尾の間にあるフレームは、そのフレームがストリーム ポインターによって参照されていなくても、キャンセルされるまでキューに残ります。 そのため、ミニドライバーは、先頭のエッジと末尾のエッジのポインターを使用して、複数の連続したフレームの作業ウィンドウを維持できます。 たとえば、ウィンドウ内のフレームが処理中または入力中である可能性があります。
次の図では、最も古いフレームが一番下にあります。 新しいフレームが上部に到着します。 各フレームの数値は、そのフレームの参照カウントです。 ストリーム ポインターが進むと、この図の上に移動します。
左端のキューは、ミニドライバーが末尾のエッジを使用してフレームのワーキング セットを作成する方法を示しています。 ストリーム ポインターがこれらのフレームを参照していないにもかかわらず、先頭と末尾のエッジの間の各フレームの参照カウントが 1 になっています。
真ん中のキューは、ストリーム ポインターのクローニングの例です。 ドライバーは、AVStream DMA サービスのピンの処理ステップで説明されているように、繰り返しクローンを作成して、先頭のエッジを進めます。
右端のキューは、ストリーム ポインターのクローンを使用して、ミニドライバーが末尾のエッジの背後にあるフレームの参照カウントを維持する方法を示しています。