フィルター中心の処理

フィルターがフィルター中心の処理を使用する場合、各ピン インスタンスで使用可能なデータ フレームがある場合、デフォルトで AVStream はミニドライバーが提供する AVStrMiniFilterProcess コールバック ルーチンを呼び出します。 ミニドライバーは、KSPIN_DESCRIPTOR_EX 構造体の Flags メンバーを設定することで、このデフォルトの動作を変更できます。

フィルター中心の処理を実装するには、ミニドライバーが提供する AVStrMiniFilterProcessコールバック ルーチンへのポインターを、KSFILTER_DISPATCH 構造体の Process メンバーに提供します。 KSPIN_DISPATCHProcess メンバーをNULLに設定します。

AVStream は、次のすべての条件が満たされた場合にのみ AVStrMiniFilterProcess を呼び出します。

  • フレームは、処理にフレームが必要なピンで使用できます。 ミニドライバーは、KSPIN_DESCRIPTOR_EXFlags メンバーにフラグを設定することで、処理動作を変更できます。 相互に排他的な KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING フラグと KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING フラグの組み合わせに特に注意してください。 ミニドライバーは、KsPinAttachAndGate ルーチンまたは KsPinAttachOrGate ルーチンを使用して、フレームが必要なピンのセットを変更することもできます。

  • ピン インスタンスの数は、KSPIN_DESCRIPTOR_EX 構造体の InstancesNecessary メンバと同じかそれ以上です。 KSPIN 構造体の ClientStateメンバーは、ピンが現在設定されている特定の KSSTATE 列挙子を指定します。 InstancesNecessary が満たされた後、KSSTATE_STOP 状態の追加のピンはフィルター処理を妨げません。

  • 必要な数のピン インスタンスが満たされます (KSPIN_DESCRIPTOR_EX 構造体の InstancesNecessary メンバーによって指定されます)。

  • ミニドライバーは、KSGATEXxx 関数を使用してフィルターのプロセス制御ゲートを閉じていません。

ミニドライバーは、AVStrMiniFilterProcess コールバック ルーチンで、KSPROCESSPIN_INDEXENTRY 構造体の配列へのポインターを受け取ります。 AVStream は、KSPROCESSPIN_INDEXENTRY 構造体の配列をピン ID で順序付けします。

次のコードの例は、プロセス ピン構造の使用方法を示しています。 このコードは、フィルター中心のキャプチャ ドライバーを作成する方法を示す 「AVStream フィルター中心の模擬キャプチャ ドライバー (Avssamp)」のサンプルから取得されます。 ソース コードとこのサンプルの説明は、Windows Driver Kit サンプルのダウンロードに含まれています。

ミニドライバーは、フィルター プロセスディスパッチで KSPROCESSPIN_INDEXENTRY 構造体の配列を受け取ります。 この例では、ミニドライバーはインデックス VIDEO_PIN_ID の KSPROCESSPIN_INDEXENTRY 構造から最初の KSPROCESSPIN 構造体を抽出します。

NTSTATUS
CCaptureFilter::
Process (
    IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
    )
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}

ミニドライバーは、ProcessPinsIndex [n] の Count メンバが 1 以上であるか、Pins [0] に含まれる KSPIN_DESCRIPTOR_EX 構造体の InstancesNecessary メンバが 1 以上であるかを確認する前に、 ProcessPinsIndex [n].Pins [0] を参照すべきではありません。 (後者が true の場合、ピンは存在することが保証されます)。

次に、フレームをキャプチャするピンを指定するために、AVStrMiniFilterProcess コールバック ルーチンは、KSPROCESSPIN 構造体へのポインターをベンダーが提供するキャプチャ ルーチンである CaptureFrame に渡します。

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

キャプチャ ルーチンは、KSPROCESSPIN 構造体の Data メンバー間でコピーできます。 また、次の例のように、この構造体の BytesUsed メンバーと Terminate メンバーを更新する場合があります。

RtlCopyMemory ( ProcessPin -> Data,
                m_SynthesisBuffer,
                m_VideoInfoHeader -> bmiHeader.biSizeImage
               );
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;

ミニドライバーは、現在のストリーム ポインターとピンに対応するストリーム ヘッダー構造にアクセスすることもできます。

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

フィルター中心の処理を使用するほとんどのミニドライバーは、ストリーム ヘッダーへのアクセスにのみストリーム ポインターを使用します。 フィルター中心のモデルでは、AVStream はストリーム ポインターを内部的に操作します。 その結果、ミニドライバーは、フィルター中心のドライバーでストリーム ポインターを操作する場合、注意して作業を進める必要があります。