フィルターがフィルター中心の処理を使用する場合、既定では、各ピン インスタンスで使用可能なデータ フレームがある場合、AVStream はミニドライバー提供 の AVStrMiniFilterProcess コールバック ルーチンを呼び出します。 ミニドライバーは、KSPIN_DESCRIPTOR_EX構造体の Flags メンバーを設定することで、この既定の動作を変更できます。
フィルター中心の処理を実装するには、ミニドライバーが提供する AVStrMiniFilterProcess コールバック ルーチンへのポインターを、KSFILTER_DISPATCH構造体の Process メンバーに提供します。 KSPIN_DISPATCHの Process メンバーを NULL に設定します。
AVStream は、次のすべての条件が満たされた場合にのみ AVStrMiniFilterProcess を呼び出します。
フレームは、処理を行うためにフレームを必要とするピンで使用できます。 ミニドライバーは、KSPIN_DESCRIPTOR_EXの Flags メンバーにフラグを設定することで、処理動作 を変更できます。 相互排他的なフラグである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 Filter-Centric Simulated Capture Driver (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] を参照しないでください。ProcessPinsIndex [n] の Count メンバーが少なくとも 1 つであるか、またはPins [0] 内に含まれる KSPIN_DESCRIPTOR_EX 構造体の InstancesNecessary メンバーが少なくとも 1 つであることを確認する前に。 (後者が 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 はストリーム ポインターを内部的に操作します。 その結果、ミニドライバーは、フィルター中心のドライバーでストリーム ポインターを操作する場合は注意して続行する必要があります。