次の方法で共有


フィルター中心の処理

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

フィルター中心の処理を実装するには、ミニドライバーが提供する AVStrMiniFilterProcess コールバック ルーチンへのポインターを、KSFILTER_DISPATCH構造体の Process メンバーに提供します。 KSPIN_DISPATCHProcess メンバーを 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 はストリーム ポインターを内部的に操作します。 その結果、ミニドライバーは、フィルター中心のドライバーでストリーム ポインターを操作する場合は注意して続行する必要があります。