AVStream のフロー制御ゲート

AVStream では、制御フロー メカニズムとしてロジック ゲートが使用されます。 各ロジック ゲートは KSGATE 構造体で表されます。

AVStream は、各フィルターまたはピンを 1 つの AND ゲートで初期化します。 その後、ミニドライバーはこのメカニズムを使用して、その特定のオブジェクトがデータを処理できるタイミングを判断できます。 ピンの処理コントロール ゲートを取得するために、ミニドライバーは KsPinGetAndGate を呼び出します。 フィルターの処理制御ゲートを取得するには、 KsFilterGetAndGate を呼び出します。

新しいロジック ゲートを作成するために、ミニドライバーは KsGateInitializeAnd または KsGateInitializeOr を呼び出します。 あるゲートの出力を別のゲートへの入力として使用して、状態遷移を転送できます。 これを行うには、これらの呼び出しで NextOrGate または NextAndGate パラメーターを指定します。

ロジック ゲートへの既存の入力を閉じるには、 KsGateTurnInputOff を呼び出します。 ミニドライバーは、アクティブなピンを停止して閉じるか、無期限に処理を中断するために、この呼び出しを行う場合があります。

同様に、 KsGateTurnInputOn を呼び出して、特定のゲートへの既存の入力を開きます。

スレッドは、処理の準備ができたら、処理オブジェクトの処理を制御する AND ゲートの入力 に をキャプチャしようとします。 これを行うには、ミニドライバーは KsGateCaptureThreshold を呼び出します。

AND ゲートが開いている場合、AVStream はゲートへの入力をオフにし、処理を開始します。 ゲートは処理中に閉じられるようになったため、他のスレッドはゲートの入力 をキャプチャできません。 一度にデータを処理できるスレッドは 1 つだけです。

ゲートの状態を変更せずにチェックするために、ミニドライバーは KsGateGetStateUnsafe を呼び出すことができます。 ただし、この関数は同期を処理しないことに注意してください。

ロジック ゲートを削除するには、 KsGateTerminateAnd または KsGateTerminateOr を呼び出します。 削除するゲートは、ゲート チェーンの先頭にある必要があります。

入力としてピンをロジック ゲートに接続し、入力と同じロジック ゲートをフィルターの AND ゲートに接続するには、 KsPinAttachAndGate または KsPinAttachOrGate を呼び出します。

ゲートの状態の決定

AND ゲートの場合、KSGATE 構造体の Count メンバーの値は、1 から オフ 入力の数を引いた値です。

Count = 1 - ( オフ 入力の数)

この値が 0 以下の場合、ゲートは閉じられます。 この値が 0 より大きい場合、ゲートは開いています。

OR ゲートの場合、KSGATE の Count メンバーの値は、ゲートへの入力 数です。

Count = (入力 数)

この値が 0 の場合、ゲートは閉じられます。 Count が 0 より大きい場合、ゲートは開いています。

AND ゲートの有効な カウント 範囲は 1 以下です。OR ゲートの有効な カウント 範囲は 0 以上です。 Count を無効な値に設定しないでください。AVStream では、ミニドライバーによってゲートが有効な状態に設定されたことは確認されません。