VRAM キャプチャのプロパティ
ピン中心の AVStream ミニドライバーは、VRAM にキャプチャするために、いくつかのプロパティをサポートする必要があります。 このセクションでは、ミニドライバーが VRAM 処理の前と処理中に受信する要求のシーケンスについて説明します。
キャプチャが開始される前に、KS プロキシは KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property 要求を送信します。 ミニドライバーは、ドライバーがキャプチャしているのがシステム メモリか VRAM かどうかに応じて異なる値を返す必要があります。
システム メモリへのキャプチャ
システム メモリにキャプチャするには、KS_CAPTURE_ALLOC_SYSTEM_AGPを返します。
キャプチャ ドライバーは、システム メモリ値の種類を持つ KSPROPERTY_CURRENT_CAPTURE_SURFACE set-property 要求を受け取ります。 キャプチャ ドライバーがバス マスター DMA デバイスとして機能し、データをシステム メモリに直接配置するようになりました。
このモードでは、キャプチャ ドライバーは、出力ピンの AVStrMiniPinProcess コールバック関数でシステム メモリ バッファーを受け取ります。
ピン プロセス コールバックで DMA を実装する方法については、AVStream のパケット ベースの DMA を参照してください。
複数の出力ピン (個別のビデオ、オーディオ、VBI ピンなど) でキャプチャするには、前に説明したように、各ピンが VRAM プロパティと処理をサポートする必要があります。 プロキシは、ピンごとに個別のスレッドを生成します。
VRAM へのキャプチャ
ドライバーが VRAM キャプチャをサポートしている場合は、KSPROPERTY_PREFERRED_CAPTURE_SURFACEに応答してKS_CAPTURE_ALLOC_VRAMを返します。
ミニドライバーは次に、KSPROPERTY_DISPLAY_ADAPTER_GUID get-property 要求を受け取り、ディスプレイ アダプターの GUID を照会します。
ベンダーが提供するグラフィックス ミニポート ドライバーからアダプター GUID を取得します。 DXGK_INTERFACESPECIFICDATA構造体には、プロパティ要求で返すアダプター GUID が含まれています。 この構造体は、DirectX グラフィックス カーネル (DXGK) サブシステムによって生成され、アダプターが初期化されるときにミニポート ドライバーに渡されます。
ピンが VRAM トランスポートをサポートし、ディスプレイ アダプターとダウンストリーム フィルターの GUID が一致する場合、KS プロキシ モジュールがアロケーターとして選択されます。 プロキシは、キャプチャ用に選択したサーフェスタイプでKSPROPERTY_CURRENT_CAPTURE_SURFACEプロパティを設定することで、ピン間のVRAMサーフェストランスポートの選択についてキャプチャピンに通知します。
ピンはKS_CAPTURE_ALLOC_VRAMを受信すると、次にVRAM 処理要求を受信します。
VRAM 処理要求は、2 つの部分で構成されます。 まず、キャプチャ ドライバーは、KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESSの get 要求を受け取ります。 get ハンドラーは、カーネル モードの VRAM サーフェス ハンドルを含む IRP を受け取ります。
キャプチャ ドライバーまたはディスプレイ ミニポート ドライバーは、VRAM サーフェス ハンドルを実際の VRAM 物理アドレスにマップする必要があります。 VRAM サーフェス ハンドルは有効に保持されないので、後で使用するためにキャッシュしないでください。
プロパティ要求で指定されたVRAM_SURFACE_INFO_PROPERTY_S内のマップされたアドレスを返します。 キャプチャ ドライバーは、ディスプレイ ミニポート ドライバーからのマッピングを要求する IOCTL を発行できます。
次に、キャプチャ フィルターの AVStrMiniPinProcess が、ピンに処理するデータがある場合に呼び出されます。
ミニドライバーは KsPinGetLeadingEdgeStreamPointer を呼び出して、このピンの先頭エッジ ストリーム ポインターを取得してロックする必要があります。 この関数は、KSSTREAM_POINTER構造体へのポインターを返します。
このストリーム ポインター構造体には、KSSTREAM_HEADERへのポインターが含まれています。
ストリーム ヘッダーの Data メンバーで、VRAM_SURFACE_INFO構造体へのポインターを見つけます。
この構造体には、KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESSに応答して返される物理アドレスが含まれています。 ハンドルを表す hSurface メンバーは NULL です。
キャプチャ ドライバーでは、次の手順を実行する必要があります。
VRAM 物理アドレスを使用してキャプチャ ハードウェアをプログラムします。
ビデオ フレームの完了を処理します。
VRAM_SURFACE_INFOの cbCaptured メンバーに、VRAM サーフェスにコピーされたバイト数を入力します。 キャプチャされたバイト数を KSSTREAM_HEADERの DataUsed メンバーに設定しないでください。 代わりに、DataUsed を sizeof(VRAM_SURFACE_INFO) に設定します。
キャプチャ ドライバーがタイムスタンプを実行する場合は、PresentationTime、Duration、および関連する場合は OptionsFlags をKSSTREAM_HEADERに設定します。
KsStreamPointerAdvanceOffsets を呼び出して、すべてのクローンの処理または削除を続行し、KsStreamPointerDelete を呼び出して要求を完了します。
Windows Driver Kit (WDK) サンプルの AVStream Simulated Hardware Sample Driver (AVSHwS) のCapture.cpp ファイル内の CCapturePin::P rocessD3DSurface メソッドは、VRAM サポート用にこのコールバックを実装する方法の 1 つを示しています。