Microsoft DirectX 8.0 |
ここでは、Microsoft® DirectShow® のフィルタ グラフを構成するコンポーネントの概要について説明する。独自のカスタム DirectShow フィルタを作成する開発者と、アプリケーションで DirectShow を使用するときに見えないところで何が起きているのかを知りたいと考えている DirectShow アプリケーション開発者を対象にしている。ただし、アプリケーションでは通常 DirectShow フィルタ グラフの内部動作を取り扱う必要はない。多くの場合、フィルタの追加、ピンの接続、同期化ソースの設定などの詳細は、フィルタ グラフ マネージャとフィルタおよびピン自身が自動的に処理する。 フィルタ開発者向けの注 : DirectShow で独自のカスタム変換またはカスタム エフェクトを使用する場合、ネイティブの DirectShow フィルタを記述する必要はない。変換を実行する DirectX Media Object (DMO) を記述し、DMO ラッパー フィルタを通してフィルタ グラフで使用できる。このため、フィルタ接続と同期化のメカニズムのすべての詳細から完全に解放される。
メディア ファイルまたはストリームをなんらかの方法で再生、記録、キャプチャ、ブロードキャスト、または処理する場合は、1 つ以上のフィルタがフィルタ グラフと呼ばれる構成に接続される。グラフを構築する処理は、アプリケーションで手動によって、またはグラフ ビルダまたはフィルタ グラフ マネージャによって自動的に行うことができる。いずれの場合も、プロセスは通常ソース フィルタから始まり、常に 2 つの主要な係数に基づいている。1 つは、フィルタが入力として予測しているストリームの数とストリームのメディア タイプ、もう 1 つは、フィルタが出力するストリームの数とストリームのメディア タイプである。次の図は、圧縮されたビデオが格納されている AVI ファイルを再生する簡単なフィルタ グラフを示している。
グラフ内の矢印は、データが流れる方向を示す。このソース フィルタは非同期ファイル ソースである。このフィルタは、ファイルからバイト ストリームを読み取り、ビデオ圧縮スキームを含む AVI (Audio-Video Interleaved) フォーマットを認識する AVI スプリッタ フィルタに渡す。AVI スプリッタは、データを解析してタイム スタンプ付きのメディア サンプルにし、ビデオ サンプルをダウンストリームの AVI デコンプレッサに渡す。ビデオの場合、各サンプルに 1 個のビデオ フレームが含まれる。AVI デコンプレッサは正しい CODEC を見つけてサンプルを圧縮解除し、圧縮解除したビデオ フレームをビデオ レンダリング フィルタに渡す。ビデオ レンダリング フィルタがコンピュータ画面にビデオを表示する。オーディオ サンプルは圧縮されていないため、AVI スプリッタはデフォルト DirectSound デバイスに直接接続できる。
フィルタは DirectShow を構成する基本要素である。DirectShow はマルチメディア データの処理を個々のステップに分割し、フィルタは 1 つ (または場合によっては複数) の処理ステップを表す。これによって、アプリケーションがフィルタを "組み合わせて"、多種多様なクラスのハードウェア デバイスおよびソフトウェア デバイスを使用しているさまざまなメディア フォーマットに対して、さまざまな操作を実行することが可能になる。たとえば、非同期ファイル ソース フィルタはディスクからファイルを読み取り、TV チューナー フィルタは TV キャプチャ カード上のチャンネルを変更し、MPEG-2 スプリッタ フィルタは MPEG ストリームのオーディオおよびビデオ データをデコードできるように解析する。これらのフィルタは、それぞれ内部的には非常に固有な動作を実行するが、アプリケーション側から見ると、ある標準的な特徴を備えた DirectShow フィルタにすぎない。その特徴とは、IBaseFilter インターフェイスのサポートと、ほかの 1 つ以上の DirectShow フィルタへの接続を表す 1 つ以上の入力ピン、出力ピン、またはその両方のサポートである。
すべての DirectShow フィルタは 3 つのカテゴリに分かれる。ソース フィルタ、変換フィルタ、およびレンダリング フィルタの 3 つである。
変換フィルタは、未処理のデータまたは部分的に処理されたデータを受け取り、処理してから渡す。変換フィルタには多くの種類があり、少数の例をあげるだけでも、未処理のバイト ストリームをサンプルとフレームに分割するパーサー、コンプレッサとデコンプレッサ、フォーマット コンバータなどがある。DirectShow には多くの一般的な CODEC が含まれている。上に示した図では、AVI スプリッタと AVI デコンプレッサは両方とも変換フィルタである。DirectShow に提供されていない変換フィルタとして、MPEG-2 デコーダがある。MPEG-2 デコーダはサードパーティからハードウェアまたはソフトウェアに実装されて提供されている。
レンダリング フィルタは通常完全に処理されたデータを受け取り、システムのモニタやスピーカ、あるいは外部デバイスを通して再生する。ディスクまたはその他の永続的な記憶装置にデータを保存する "ファイル ライタ" フィルタも、レンダリング フィルタのカテゴリに属する。上の図に示したように、DirectShow に付属しているビデオ レンダリング フィルタは DirectDraw を使用してビデオを表示し、デフォルトのオーディオ レンダリング フィルタは DirectSound を使用してオーディオを再生する。
DirectShow にはさまざまなメディア フォーマットの再生、変換、およびキャプチャ用のフィルタが用意されており、Windows 9x および Windows 2000 に付属している。開発者は、カスタムまたは標準のデータ フォーマットを処理するための独自のカスタム フィルタを構築することもできる。DirectX 8 では、DirectShow を使用すると、開発者は DirectX Media Object (DMO) を記述し、DMO ラッパー フィルタにすべての同期化およびピン接続の詳細を処理させることによって、"フィルタ" 開発を簡略化できる。DMO はフィルタよりも開発とテストが簡単で、DirectShow フィルタ グラフ アーキテクチャに依存しない。一度記述した DMO は、DirectShow アプリケーションかどうかにかかわらず、必要な場合はいつでも再利用できる。
前の図に示したように、フィルタ グラフ内のマルチメディア データは、ソース フィルタからゼロ個以上の中間フィルタを経由してダウンストリームに移動し、最後にレンダリング フィルタに到達する。ピンは、フィルタ間のデータ転送において低レベルの詳細を処理する。ピンは、IPin COM インターフェイスをサポートし、方向 (入力または出力) を持ち、グラフ内の特定のフィルタに関連付けられた COM オブジェクトである。ピンは別のフィルタとの接続ポイントを表す。アップストリーム フィルタの出力ピンは、ダウンストリームにある次のフィルタの入力ピンに接続する。ピンはサポートできるメディア タイプを認識し、2 つのフィルタが最初に接続するときにメディア タイプを調整する。メディア タイプを設定した後、ピンは、フィルタ グラフの実行開始後にデータを転送する方法の詳細を設定する。
ローカル ファイル、キャプチャ カードまたはその他のソースから未処理のバイト ストリームがグラフに入力された後、バイト ストリームをメディア サンプルと呼ばれる意味のある単位に解析する必要がある。ソース フィルタが解析を実行する場合もあれば、別個の解析フィルタが解析を実行する場合もある。DirectShow では、メディア サンプルは IMediaSample2 を実装する COM オブジェクトにラッピングされている。実際のマルチメディア データに加えて、オブジェクトには特定のメディア タイプおよび同期化のタイムを含む情報が含まれている。ビデオ データを含む 1 個のメディア サンプル オブジェクトには、ビデオ フレーム 1 個分のデータが格納される。オーディオの場合、1 個のメディア サンプル オブジェクトに複数のオーディオ サンプルのデータが格納される。いずれの場合も、データがグラフ内をフィルタから次のフィルタへダウンストリーム方向に移動するとき、データはメディア サンプル オブジェクトのフォーマットである。
2 つのフィルタが接続するとき、アップストリーム フィルタからダウンストリーム フィルタにメディア サンプル オブジェクトを転送する方法の詳細が、2 つのフィルタのピンで一致しなければならない。"接続する" とは、使用するサンプルのサイズ、場所および数を決定することを意味する。サンプルのサイズはメディアのタイプとフォーマットによって異なり、バッファの場所は、メイン メモリか、またはビデオ キャプチャ カードなどのハードウェア デバイスになる。サンプルの作成と管理はアロケータによって処理される。アロケータは、通常はそれ自身がダウンストリーム フィルタの入力ピンによって作成される COM オブジェクトである。
アロケータの作成、および接続時に入力ピンと出力ピンが実行する調整の詳細については、「DirectShow フィルタの開発」を参照すること。特定のビデオ キャプチャのシナリオでは、割り当てるバッファのサイズをアプリケーションで指定する必要がある。そのためのインターフェイスが提供されている。ほとんどの場合、バッファ割り当ての詳細はアプリケーションに対して完全に透過的である。ただし、フィルタ グラフ内のデータの "移動" は必ずしもコピー操作を伴わない。接続プロセスでは、スループットを最大化するために、ピンは可能な限りアップストリーム バッファを "再利用" する。