Microsoft DirectX 8.0 |
Microsoft® DirectShow® はすべてユーザー モード ソフトウェア コンポーネントである。DirectShow フィルタ グラフに参加するキャプチャ カード、TV チューナー、ハードウェア デコーダ、サウンドカードのようなカーネルモード ハードウェア デバイスはフィルタ グラフ内ではユーザーモード フィルタとして表現されなければならない。この機能は DirectShow が提供する特殊な「ラッパー フィルタ」が複数のタイプのデバイスに対して行っている。これらのフィルタはオーディオ キャプチャ フィルタ、VFW キャプチャ フィルタ、TV チューナー フィルタ、アナログ ビデオ クロスバー フィルタそして、TV オーディオ フィルタを含む。これらのラッパー フィルタに加えて、DirectShow は KsProxy フィルタを提供する、これは任意のタイプの Windows Driver Model® (WDM) ストリーミング デバイスを表現し、独立系ハードウェア ベンダー (IHV) のカスタム機能サポート用に拡張可能である。これは Ksproxy プラグイン によって行われ、このプラグインは KsProxy によって集成される COM オブジェクトである。
ラッパー フィルタはサポートする COM インターフェイスによって動作し、そのインターフェイスは予想されるデバイスの性能を表現する。アプリケーション ユーザーはそのインターフェイスを使ってフィルタにあるいはフィルタから情報を渡す。そのフィルタはインターフェイスの呼び出しをデバイス ドライバが理解可能な情報に翻訳する、次にフィルタはカーネルモードのデバイスへあるいはデバイスからその情報を渡す。(KsProxy は同様の方法で動作する、しかしフィルタ グラフに公開するインターフェイスは表現するデバイスによって異なる) VfW フキャプチャ フィルタやオーディオ キャプチャ フィルタのようなフィルタについては、そのインターフェイスは拡張できない。TV チューナー フィルタとアナログ ビデオ クロスバーと TYV オーディオ フィルタは KsProxy をベースにしていないけれど、IKSPropertySet インターフェイスをサポートする、これはカスタム プロパティ セットを 1 つのインターフェイス経由で扱う汎用の方法である。
アプリケーション開発者にとって、ユーザー モード フィルタとしてのラッピング ハードウェア デバイスに関する原則は、アプリケーションではその他すべての DirectShow フィルタを制御するのと同じ方法でデバイスを制御するということである。アプリケーションの側で特別なプログラミングは必要なく、カーネル モード デバイスとの通信に関係するすべての詳細はフィルタ自身の中にカプセル化される。
初期の Video for Windows (VfW) キャプチャ カードをサポートするために、DirectShow は VFW キャプチャ フィルタを提供する。ターゲット システムに VfW カードがある場合は、DirectShow のシステム デバイス列挙子を使用して検出できる。列挙子は、グラフに VfW キャプチャ フィルタを追加し、追加したフィルタを検出されたカードに関連付けるためにも使用する。その後はフィルタ グラフの残りの部分を通常の方法で作成できる。詳細については、「デバイスとフィルタの列挙」を参照すること。
最近のサウンド カードは、マイクおよびその他のタイプのデバイス用の入力ジャックを備えている。また、個々の入力ごとにボリューム、高音域、および低音域を制御するオンボードのミキシング能力を備えているのが一般的である。DirectShow では、サウンド カードの入力とミキサーはオーディオ キャプチャ フィルタにラッピングされている。ローカル システムの各サウンド カードは、システム デバイス列挙子を使用して検出できる。これについては、「デバイスとフィルタの列挙」で説明している。システムのサウンド カードを表示するには、SDK と共にインストールされている GraphEdit を開き、オーディ キャプチャ ソースのカテゴリから選択する。ここに表示されるフィルタは、それぞれがオーディオ キャプチャ フィルタの別個のインスタンスである。
最近のハードウェア デコーダとキャプチャ カードは、Windows Driver Model (WDM) 規格に適合している。このようなデバイスは、VfW デバイスに比べて高機能であり、Windows NT/Windows 2000 と Windows 98/Me 間の移植が可能である。WDM ビデオ キャプチャ カードは、VfW では利用できない機能をサポートすることができ、キャプチャ フォーマット列挙、プログラムによるビデオ パラメータ (色相や輝度など) の制御 、プログラムによる入力選択、TVTuner サポート、VBI サポートなどが可能である。
WDM ストリーミング デバイスをサポートするために、DirectShow は KsProxy (ksproxy.ax) と呼ばれるフィルタを提供している。KsProxy は、その機能の多様さから "アーミー ナイフ フィルタ" と呼ばれてきた。また、基礎になるカーネル モード ドライバの能力に応じて、フィルタ全体および個々のピンでサポートされるピンとインターフェイスの数が異なるため、"カメレオン フィルタ" とも呼ばれる。フィルタ グラフに "KsProxy" という名前で表示されることはなく、常に、レジストリで発見された、デバイスの "フレンドリ" 名になっている。この名前はもともとドライバの .inf ファイルに指定されている名前である。システムに WDM デバイスがある場合は、 GraphEdit ユーティリティ プログラムを開き、[Graph] の [Insert Filters] をクリックし、WDM ストリーミング デバイスのノードまで下にスクロールする。システムの WDM カードが 1 つしかない場合でも、そのカードに複数のデバイスが含まれることがある。各デバイスは別個のフィルタとして表され、各フィルタは実際には KsProxy である。
アプリケーションでシステム デバイス列挙子を使用し、プログラムによってターゲット システムの WDM デバイス モニカ (たとえば TV チューナー カード) を探す場合、KsProxy (ドライバによって定義された "フレンドリ名" を使用している) は、後続の BindToObject メソッドの呼び出しでインスタンス化される。KsProxy は、すべての種類の WDM オーディオ デバイスまたはビデオ デバイスを表すことができるが、表すデバイスの種類を事前に知ることはできない。そのため、サポートされているプロパティ セットをドライバに問い合わせる必要がある。プロパティ セットは、WDM ストリーム クラス ドライバおよび MPEG-2 ソフトウェア デコーダなどの一部のユーザー モード フィルタによって使用されるデータ構造のコレクションである。次に、KsProxy は自分自身を動的に構成し、適切なインターフェイスをフィルタ グラフとアプリケーションに公開する。アプリケーションおよびその他のフィルタがこれらのインターフェイスを呼び出すと、KsProxy はメソッド パラメータをプロパティ セットに変換してドライバに送信する。IHV はプラグインを提供することによって KsProxy を拡張できる。プラグインはデバイスの特殊な能力を公開するベンダー独自のインターフェイスである。これらすべての詳細はアプリケーションに対して隠蔽されている。アプリケーションでは、KsProxy をほかの DirectShow ユーザー モード フィルタと同じように使用して、WDM デバイスからイベントを受け取り、WDM デバイスのイベントを制御する。
WDM デバイスはカーネル ストリーミング モデルをサポートしている。カーネル ストリーミング モデルを使用すると、データをユーザーモードに渡すことなく、完全にカーネルモードで直接ストリーミングすることができる。カーネル モードとユーザー モードの間でデータを渡す操作は多くのコンピュータ資源を消費する。カーネル ストリーミングによって、ホスト CPU に負荷をかけずに高速なビットレートを利用できる。WDM ベースのフィルタはカーネル ストリーミングを使って、システムのメイン メモリにデータをコピーすることなく、マルチメディア データを (それが同じカードであろうとなかろうと) あるハードウェア デバイスから別のデバイスに直接渡す。
アプリケーション側から見ると、グラフ内のマルチメディア データが 1 つのユーザー モード フィルタから次のユーザー モード フィルタに移動しているように見える。実際には、データがユーザー モードに渡されることはなく、カーネル モード デバイスから別のカーネル モード デバイスへ直接ストリーミングされ、ビデオ グラフィック カードでレンダリングされる。当然、ファイルへのキャプチャの場合など、フィルタ グラフ内のある時点で実際にデータをカーネル モードからユーザー モードに渡さなければならない場合もある。しかし、ユーザー モード アクセスへの移行では、必ずしもメモリの新しい場所にデータがコピーされる必要はない。アプリケーションでは、キャプチャ グラフを構築するとき、ハードウェア デバイスから別のハードウェア デバイスへ、またはハードウェア デバイスからユーザー モード フィルタへデータが目的のパスをフォローするように、明示的に制御できる。詳細については、ビデオ キャプチャに関する項目を参照すること。
通常、アプリケーション開発者は背景情報としてしかカーネル ストリーミングの詳細を考慮する必要はない。WDM、カーネル ストリーミング、KsProxy、および関連トピックの詳細については、Microsoft DDK を参照すること。