Microsoft DirectX 8.0

WDM ビデオ キャプチャについて

ここでは、Microsoft® Windows® ドライバ モデル (WDM) および Microsoft® DirectShow® を使用したビデオ キャプチャの概要を示す。WDM ビデオ キャプチャと DirectShow の密接な関連性について説明する。

また、ストリーム クラスと WDM 接続およびストリーミング アーキテクチャ (CSA) の密接な関連性、ビデオ キャプチャ ミニドライバ (ストリーム クラス ドライバのクライアント) について簡単に説明する。ただし、ここで説明する内容を理解するには、これらのトピックに関する基礎知識が必要である。背景情報については、http://www.microsoft.com/hwdev/desinit/ を参照すること。

ここでは次の内容について説明する。

Windows ビデオ キャプチャの簡単な歴史

マイクロソフトは 1992 年に Windows 3.1 用の Video for Windows 1.x をリリースし、ディスクへの動画のキャプチャ用に最適化した。以降、PCI バス、バス マスタリング コントローラ、NT ストライプ セット、Fast/Wide SCSI を採用したことと、キャプチャしたビデオをアダプタ メモリからディスクに直接転送し、データ コピーを使わないようにしたことで、ビデオ キャプチャ レートは大幅に向上した。Video for Windows は現在キャプチャ レートが 20 MB/秒を超え、クライアント数も多いが、ビデオ会議の出現によって Video for Windows アーキテクチャの弱点が明らかになったことから、新しいビデオ キャプチャ技術を開発する必要が生じた。

Video for Windows アーキテクチャには、ビデオ会議、テレビ視聴、ビデオ フィールドのキャプチャや、垂直同期間隔 (VBI) などのその他のデータ ストリーム用の重要な機能が欠けている。このような制限への対応策として、ベンダー各社は製品固有の独自の拡張機能を実装して Video for Windows を拡張してきた。しかし、標準インターフェイスが存在しないため、拡張機能を利用するアプリケーションはハードウェアに依存したコードを含まざるを得ない。Video for Windows のキャプチャ ドライバとディスプレイ ドライバは密接に結合している。これは、キャプチャ ドライバを変更した場合はディスプレイ ドライバも変更しなければならないことを意味する。

さらに、Video for Windows のインターフェイスである AVICap と DirectShow の組み合わせは効率的に動作しない。理由は、AVICap がバッファを割り当てるからである。AVICap を通して DirectShow にアクセスすると、移行遷移の時点でバッファをコピーする必要があり、非常に効率が悪い。DVD、MPEG デコーダ、ビデオ デコーダおよびチューナー、ビデオ ポート エクステンション (VPE) およびオーディオ CODEC が単一のアダプタに統合されたことによって、これらすべてのデバイスをサポートし、リソースの競合を処理する統一ドライバ モデルが求められていた。

WDM の概要

WDM ビデオ キャプチャは、Video for Windows アーキテクチャに固有の問題を解決するために開発された。WDM ビデオ キャプチャの主な利点は次のとおりである。

Video for Windows アプリケーションには大規模なインストール ベースがあるため、主に動画のキャプチャに使用するデバイスでは Video for Windows ドライバが引き続き使用される。現在、このようなデバイスに対するオペレーティング システム サポートを提供する Video for Windows Version 1.1e が、Windows 98 に付属している。ただし、主に TV の視聴とビデオ会議に使用するキャプチャ デバイスに対しては、WDM ビデオ キャプチャ アーキテクチャによって最適なサポートが提供される。

DirectShow は、Video for Windows アプリケーションに対する下位互換性を備えており、しかも Video for Windows の不備を解決する。WDM ビデオ キャプチャの目的は、USB 会議カメラ、1394 DV デバイス、デスクトップ カメラ、TV 視聴、複数ビデオ ストリーム、および VPE キャプチャに対する追加サポートを提供することである。このサポートはカーネルベースのストリーミングによって提供される。

WDM ベースのストリーミングでは、カーネル接続を提供して DirectShow の非カーネル ストリーミングを拡張している。ストリーミング サービスは、WDM ストリーム クラス ドライバおよびほかのプロセス間システム ソフトウェア コンポーネントによって処理される。WDM ストリーム クラス ドライバは、ミニドライバの呼び出しも行う。ミニドライバは、デバイス固有のコントロールをサポートするために独立系ハードウェア ベンダー (IHV) によって提供されるハードウェア固有のダイナミック リンク ライブラリ (DLL) である。ミニドライバとマイクロソフト提供の WDM ストリーム クラス ドライバは、連携して動作し、遅延時間が最も少ないストリーミングを実行するために必要な低レベルのサービスを提供する。DirectShow は、アプリケーションに固有の上位レベルの機能を提供する。ストリーム クラスは、標準およびカスタムのデータ型を処理する統一ストリーミング モデルをサポートし、ユーザー モードへの移行が不要なカーネル ドライバ間でのデータ転送をサポートしているため、使用すると高い効率が得られるモードである。

以前の DirectShow フィルタは、圧縮解除やレンダリングなどを実行するとき、必要に応じてカーネルとのデータ転送を行っていた。ところが、そのようにユーザー モードからカーネル モードにデータ ストリームが移行するたびに、移行自体に加えて、パラメータの検証とセキュリティの検証、場合によってはデータのコピーに時間が費やされていた。

カーネル ストリーミングによって、ユーザー モードとカーネル モード間のストリームの移行が減少する。ストリームの一部または全体をカーネル モードで生成し、消費できる。ストリームをカーネル モードで処理する場合、DirectShow のフィルタは、ストリームを送信するためのコントロール メカニズムを公開するだけである。そのため、何度も繰り返されるモード移行によるオーバーヘッドを大幅に削減できる。

カーネル ストリームは、アプリケーションに応じた適切な時点でフィルタ グラフにデータを渡すことができる。次の図は、ユーザー モードへの移行を示している。

カーネル ストリーム

ビデオ キャプチャの実行時、ストリーム クラスは、書き込みまたはレンダリングするための圧縮されていないビデオ データをビデオ キャプチャ フィルタに渡す。また、カーネル ストリーミングは複数のストリームをサポートするため、ストリームに含まれるタイムコードやクローズ キャプションなどのほかのタイプのデータを同時に渡すことが可能である。

WDM ビデオ キャプチャ アーキテクチャ

次の図は、WDM キャプチャ アーキテクチャの 3 つの基本コンポーネントを示している。

WDM キャプチャ アーキテクチャ

WDM キャプチャ アーキテクチャは DirectShow とスムーズに統合できるように設計されているため、WDM キャプチャ フィルタを使用して DirectShow で簡単にキャプチャ グラフを構築できる。WDM キャプチャ フィルタは DirectShow からストリーミング クラスに制御メッセージを送信する。Windows 98 デバイス ドライバ キット (DDK) に含まれる Ksproxy.ax、Kstune.ax、および Ksxbar.ax フィルタを使用すると、ユニバーサル シリアル バス (USB) 会議カメラ、1394 DV デバイス、TV 視聴、デスクトップ カメラのデータなどの WDM ストリーミング データをストリーム クラスによって制御し、DirectShow キャプチャ グラフに送信することができる。次の図は、これらのコンポーネントがどのように基本アーキテクチャに統合されているかを示している。

WDM キャプチャ アーキテクチャのコンポーネント

この図では、Ksproxy.ax、Kstune.ax、Ksxbar.ax、およびその他の DirectShow フィルタが、ストリーム クラスと直接通信する。Microsoft WDM ストリーム クラスは、CSA への参加を通して、カーネル モード コンポーネント間またはカーネル モード ドライバとユーザー モード コンポーネント間で、高い帯域幅でタイム スタンプ付きの遅延時間重視データ ストリームを転送する。CSA を通して、ストリーム クラスと DirectShow の組み合わせは次の点において効率的に動作する。すなわち、メディア タイプを共有すること、類似したストリーミングの状態 (停止、ポーズ、実行) を持つこと、ピンおよび接続に関して同じ概念を共有することである。そのため、ストリーム クラスからフィルタ グラフのフィルタへ、データの移行が簡単に行える。

Ksproxy.ax、Kstune.ax、および Ksxbar.ax フィルタには、それぞれをサポートするミニドライバ (または 3 つすべてをサポートするミニドライバ) が必要である。ビデオ キャプチャ ミニドライバは、ストリーム クラスのクライアントであり、ビデオ イメージと関連データのストリームを生成するハードウェア デバイスを制御する。このミニドライバには次の機能がある。

ストリーム クラス ビデオ キャプチャ ドライバは、複数の圧縮および非圧縮ビデオ、タイムコード、クローズ キャプション、未処理の VBI データとデコードした VBI データ、およびカスタム データ フォーマットのストリームを複数同時にサポートできる。ドライバは、ほかのデータ タイプと同時に生成できるデータ タイプごとに新しいストリームを作成する必要がある。ストリーム クラスは各ストリームを独立した WDM-CSA ピンとして公開する。各ストリームを別の WDM-CSA カーネル フィルタに接続するか、ユーザー モードに移行させ、DirectShow ユーザー モード フィルタの出力ピンに送ることができる。各ストリーム (またはピン) は、さまざまなフォーマットをサポートできる。たとえば、単一のピンが RGB16、RGB24、YVU9、および JPEG デジタル ビデオをサポートできる。ミニドライバの詳細については、Windows 98 DDK を参照すること。

フィルタ グラフの構成

DirectShow フィルタと CSA の結び付きによって、DirectShow のフィルタは、カーネル モードのストリーム クラス ドライバからデータを操作する強力で比較的安全な方法となっている。DirectShow は柔軟なため、さまざまなフィルタ構成が可能である。次の図は、ビデオのプレビューとディスクへのキャプチャを同時に行うユーザー モード DirectShow フィルタの構成例を示している。

ユーザー モード DirectShow フィルタの構成

この図では、受信 TV 信号がチューナー フィルタを使用してチューニングされ、クロスバー フィルタを使用してルーティングされる。フィルタ グラフは、ディスクに保存するさまざまなストリームのデータをビデオまたはオーディオ キャプチャ フィルタに渡す。これには、オーディオ ストリーム、ビデオ ストリーム、および SMPTE タイムコードやクローズ キャプション データなど、さまざまなストリームのその他の付加データが含まれる。

WDM のキャプチャ インターフェイスとフィルタ

カーネル ストリーミング フィルタによって公開される WDM キャプチャ インターフェイスは、IAMTVTunerIAMCrossbarIAMAnalogVideoDecoderIAMVideoProcAmp、および IAMCameraControl である。

WDM 用の Windows 98 ビデオ キャプチャ フィルタには、Ksproxy.ax、Kstune.ax、Ksxbar.ax などがある。これらのフィルタの詳細については、Windows 98 DDK を参照すること。