ハードウェア デバイスがフィルタ グラフに参加する方法

ここでは、Microsoft® DirectShow® がオーディオおよびビデオ ハードウェアとやり取りする方法を説明する。

ラッパー フィルタ

DirectShow フィルタはすべてユーザー モード ソフトウェア コンポーネントである。ビデオ キャプチャ カードなどのカーネル モード ハードウェア デバイスが DirectShow フィルタ グラフに参加するには、デバイスをユーザー モード フィルタとして表現する必要がある。この機能は、DirectShow が提供する専用の "ラッパー" フィルタによって実行される。このようなフィルタには、オーディオ キャプチャ フィルタ、VFW キャプチャ フィルタ、TV チューナー フィルタ、TV オーディオ フィルタ、およびアナログ ビデオ クロスバー フィルタがある。また、DirectShow は KsProxy と呼ばれるフィルタも提供する。このフィルタは任意のタイプの Windows Driver Model® (WDM) ストリーミング デバイスを表現できる。ハードウェア ベンダーは、KsProxy によって集成される COM オブジェクトである "Ksproxy プラグイン" を提供することによって、KsProxy を拡張して独自の機能をサポートできる。

ラッパー フィルタは、デバイスの機能を表す COM インターフェイスを公開する。アプリケーションは、このインターフェイスを使って、フィルタとの間で情報を受け渡す。フィルタは COM メソッドの呼び出しをデバイス ドライバの呼び出しに変換し、その情報をカーネル モードのドライバに渡した後、結果を変換してアプリケーションに返す。TV チューナー、TV オーディオ、アナログ ビデオ クロスバー、および KsProxy の各フィルタは、IKsPropertySet インターフェイスによってカスタム ドライバのプロパティをサポートする。VFW キャプチャ フィルタおよびオーディオ キャプチャ フィルタは、この方法では拡張できない。

アプリケーションを開発する場合、ラッパー フィルタによって、アプリケーションは他の DirectShow フィルタの制御と同様にデバイスを制御できる。特殊なプログラミングは不要である。カーネル モード デバイスとのやり取りの詳細はフィルタ内にカプセル化されている。

Video for Windows デバイス

VFW キャプチャ フィルタは、以前の Video for Windows (VfW) キャプチャ カードをサポートする。ターゲット システムに VfW カードがある場合は、DirectShow のシステム デバイス列挙子を使って検出し、フィルタ グラフに追加できる。詳細については、「デバイスとフィルタの列挙」を参照すること。

オーディオ キャプチャとミキシング デバイス (サウンド カード)

最近のサウンド カードは、マイクおよびその他のタイプのデバイス用の入力ジャックを備えている。また、個々の入力ごとにボリューム・高音域・低音域を制御するオンボードのミキシング能力を備えているのが一般的である。DirectShow では、サウンド カードの入力とミキサはオーディオ キャプチャ フィルタによってラッピングされている。各サウンド カードは、システム デバイス列挙子によって検出できる。システムのサウンド カードを表示するには、GraphEdit を実行し、オーディオ キャプチャ ソースのカテゴリから選択する。カテゴリ内の各フィルタは、それぞれがオーディオ キャプチャ フィルタの別個のインスタンスである。「GraphEdit の使い方」を参照すること。

WDM ストリーミング デバイス

最近のハードウェア デコーダとキャプチャ カードは、Windows Driver Model (WDM) 規格に適合している。このようなデバイスは、VfW デバイスに比べて高機能であり、Windows NT/Windows 2000 と Windows 98/Me 間の移植が可能である。WDM ビデオ キャプチャ カードは、VfW では利用できない機能をサポートすることができ、キャプチャ フォーマットの列挙、プログラムによる色相や輝度などのビデオ パラメータの制御 、プログラムによる入力選択、TV チューナーのサポートなどが可能である。

WDM ストリーミング デバイスをサポートするために、DirectShow は KsProxy フィルタ (ksproxy.ax) を提供している。KsProxy は、その機能の多様さから "アーミー ナイフ フィルタ" と呼ばれてきた。フィルタ上のピン数、およびフィルタによって公開される COM インターフェイスの数は、基盤となるドライバの機能によって異なる。KsProxy は、フィルタ グラフには "KsProxy" という名前では表示されない。常にデバイスの内容を表すわかりやすい名前が付けられ、レジストリ内で使われる。システムの WDM デバイスを表示するには、GraphEdit を実行し、WDM ストリーミングのカテゴリから選択する。システムの WDM カードが 1 つしかない場合でも、そのカードに複数のデバイスが含まれることがある。各デバイスは別個のフィルタとして表されるが、各フィルタは実際には KsProxy である。

アプリケーションはシステム デバイス列挙子を使って、システムの WDM デバイス モニカを探す。モニカの BindToObject を呼び出すことによって KsProxy を初期化する。KsProxy はすべての種類の WDM デバイスを表すことができるので、ドライバに照会してドライバがサポートするプロパティ セットを調べる必要がある。プロパティ セットは、WDM ドライバおよび MPEG-2 ソフトウェア デコーダなどの一部のユーザー モード フィルタが使用するデータ構造のコレクションである。KsProxy は自分自身を構成し、プロパティ セットに対応した COM インターフェイスを公開する。KsProxy はプロパティ セットへの COM メソッドの呼び出しを変換し、ドライバに送信する。ハードウェア ベンダーはプラグインを提供することによって KsProxy を拡張できる。プラグインはデバイスの特殊な機能を公開するベンダー独自のインターフェイスである。これらのすべての詳細はアプリケーションから隠蔽されている。アプリケーションは、他の DirectShow フィルタの場合と同様に、KsProxy を介してデバイスを制御する。

カーネル ストリーミング

WDM はカーネル ストリーミングをサポートしている。カーネル ストリーミングでは、ユーザー モードに切り替えることなく、データを完全にカーネル モードでストリーミングすることができる。カーネル モードとユーザー モードの切り替えは多くのコンピュータ資源を消費する。カーネル ストリーミングによって、ホスト CPU に負荷をかけずに高速なビットレートを利用できる。WDM ベースのフィルタはカーネル ストリーミングを使って、システムのメイン メモリにデータをコピーすることなく、マルチメディア データを、それが同じカードであろうとなかろうと、あるハードウェア デバイスから別のデバイスに直接渡す。

アプリケーション側から見ると、データが 1 つのユーザー モード フィルタから次のユーザー モード フィルタに移動しているように見える。実際には、データがユーザー モードに渡されることはなく、カーネル モード デバイスから別のカーネル モード デバイスへ直接ストリーミングされ、ビデオ グラフィック カードでレンダリングされる。ファイルへのキャプチャの場合など、ある時点でデータをカーネル モードからユーザー モードに渡さなければならない場合もある。ただし、この切り替えによって、必ずしもデータをメモリ内の新しい場所にコピーする必要はない。

通常、アプリケーション開発者が、背景情報として理解しておく以外に、カーネル ストリーミングの詳細を考慮する必要はない。WDM、カーネル ストリーミング、KsProxy、および関連トピックの詳細については、Microsoft DDK を参照すること。