DirectShow フィルタについて

DirectShow ではモジュール化されたアーキテクチャを使っており、各段階の処理はフィルタと呼ばれる COM オブジェクトによって行われる。DirectShow はアプリケーションで使える標準フィルタを提供しており、また開発者は独自のカスタム フィルタを作成して DirectShow の機能を拡張することもできる。例として、ここでは AVI ビデオ ファイルを再生するために必要な手順と、各手順を実行するフィルタを示す。

  • ファイルからバイト ストリームとして未処理のデータを読み取る (ファイル ソース フィルタ)
  • AVI ヘッダーを調べて、バイト ストリームを解析して独立したビデオ フレームとオーディオ サンプルに分割する (AVI スプリッタ フィルタ)
  • ビデオ フレームをデコードする (圧縮フォーマットに応じたさまざまなデコーダ フィルタ)
  • ビデオ フレームを描画する (ビデオ レンダラ フィルタ)
  • オーディオ サンプルをサウンド カードに送信する (デフォルト DirectSound デバイス フィルタ)

これらのフィルタを次の図に示す。

圧縮ビデオで AVI ファイルを再生するフィルタ グラフ

この図に示されているように、各フィルタは 1 つまたは複数の他のフィルタに接続されている。この接続ポイントも、"ピン" と呼ばれる COM オブジェクトである。フィルタは、ピンを使って、データをあるフィルタから次のフィルタに移動させる。図の中の矢印は、データが流れる方向を示す。DirectShow では、接続されたフィルタの集合は "フィルタ グラフ" と呼ばれる。

フィルタには、実行・停止・ポーズという 3 つの状態がある。フィルタが実行中の場合、フィルタはメディア データを処理する。フィルタが停止している場合、データの処理を停止する。ポーズ状態は実行前にデータの頭出しをするために使う。この概念の詳細については、「フィルタ グラフのデータ フロー」を参照すること。非常に例外的な場合を除いて、状態の変化はフィルタ グラフ全体で調整される。つまり、グラフ内のすべてのフィルタは同時に状態が切り替わる。したがって、フィルタ グラフ全体にも実行・停止・ポーズの状態があると言われる。

フィルタはいくつかの大きなカテゴリに分類できる。

  • "ソース" フィルタはグラフにデータを導入する。データのソースとしては、ファイル、ネットワーク、カメラなどがある。各ソース フィルタは異なるタイプのデータ ソースを処理する。
  • "変換" フィルタは、入力ストリームを受け取り、データを処理して、出力ストリームを作成する。変換フィルタの例としては、エンコーダやデコーダがある。
  • "レンダリング" フィルタはチェーンの最後に存在する。このフィルタはデータを受け取り、ユーザーに対して提示する。たとえば、ビデオ レンダラはビデオ フレームをディスプレイ上に描画する。オーディオ レンダラはオーディオ データをサウンド カードに送信する。ファイル ライタ フィルタはデータをファイルに書き込む。
  • "スプリッタ" フィルタは、通常、入力ストリームを解析しながら、入力ストリームを複数の出力に分割する。たとえば、AVI スプリッタはバイト ストリームを解析し、独立したビデオ ストリームとオーディオ ストリームに分割する。
  • "Mux" フィルタは、複数の入力を受け取り、単一のストリームに合成する。たとえば、AVI Mux は AVI スプリッタとは逆の処理を実行する。オーディオ ストリームとビデオ ストリームを受け取り、AVI フォーマットのバイト ストリームを生成する。

これらのカテゴリの区別は絶対的なものではない。たとえば、ASF リーダー フィルタはソース フィルタとスプリッタ フィルタの両方の機能を持つ。

すべての DirectShow フィルタは IBaseFilter インターフェイスを公開し、すべてのピンは IPin インターフェイスを公開する。また、DirectShow ではより具体的な機能をサポートするために、この他にも多くのインターフェイスを定義している。

参照