インテリジェント接続

インテリジェント接続は、フィルタ グラフ マネージャがフィルタ グラフを作成するために使うメカニズムである。インテリジェント接続は、フィルタを選択し、フィルタをフィルタ グラフに追加するためのいくつかの関連するアルゴリズムで構成されている。アプリケーション プログラミングでは、インテリジェント接続の詳細を知っている必要はほとんどない。特定のフィルタ グラフを作成する際に問題が発生し、問題を解決する必要がある場合や、独自のフィルタを作成して自動グラフ作成で利用できるようにしたい場合は、このセクションを参照すること。

インテリジェント接続では、次のような IGraphBuilder メソッドが使われる。

Render メソッドはグラフのサブセクションを作成する。接続されていない出力ピンから始めて、ダウンストリーム方向に処理し、必要に応じて新しいフィルタを追加する。最初のフィルタは既にグラフに含まれていなければならない。各手順で、Render メソッドは前のフィルタに接続できるフィルタを検索する。接続するフィルタが複数の出力ピンを持つ場合、ストリームは分岐できる。各ストリームがレンダラを持った時点で検索は終了する。Render メソッドは、処理に行き詰まると、最初に戻って別のフィルタのセットを使う。

各出力ピンを接続するために、Render メソッドは次の処理を行う。

  1. ピンが IStreamBuilder インターフェイスをサポートしている場合、フィルタ グラフ マネージャは処理全体をピンの IStreamBuilder::Render メソッドに委任する。このインターフェイスを公開することによって、ピンはレンダラまでのグラフの残りの部分を作成する処理を引き受ける。ただし、このインターフェイスをサポートするピンはほとんどない。
  2. フィルタ グラフ マネージャは、メモリ内にキャッシュされたフィルタがある場合は、そのフィルタを使う。インテリジェント接続処理を通じて、フィルタ グラフ マネージャはその処理の前の手順で使われたフィルタをキャッシュしている場合がある。「動的グラフ作成」も参照すること。
  3. フィルタ グラフ内に未接続の入力ピンを持つフィルタが含まれている場合、フィルタ グラフ マネージャは次にそのフィルタを試す。Render を呼び出す前に特定のフィルタをグラフに追加して、Render メソッドで特定のフィルタを使うよう強制できる。
  4. 最後に、フィルタ グラフ マネージャは IFilterMapper2::EnumMatchingFilters メソッドを使ってレジストリを検索する。フィルタ グラフ マネージャは、出力ピンの優先するメディア タイプと、レジストリに登録されているメディア タイプを照合する。

各フィルタは、他のフィルタと相対的にフィルタの優先順位を示す数値である "メリット" と共に登録されている。EnumMatchingFilters メソッドは、メリット値の順に、最低メリット値である MERIT_DO_NOT_USE + 1 のフィルタまでを返す。このメソッドは、MERIT_DO_NOT_USE 以下のメリット値のフィルタを無視する。フィルタは、GUID で定義されたカテゴリ別にグループ化されている。カテゴリ自体にもメリット値があり、EnumMatchingFilters メソッドは、カテゴリ内のフィルタのメリット値が高い場合でも、メリット値が MERIT_DO_NOT_USE 以下のカテゴリを無視する。

要約すると、Render メソッドは次の順序でフィルタを試す。

  1. IStreamBuilder を使う。
  2. キャッシュされたフィルタを試す。
  3. グラフ内のフィルタを試す。
  4. レジストリ内のフィルタを検索する。

AddSourceFilter メソッドは、指定されたファイルをレンダリングできるソース フィルタを追加する。まず、レジストリ内を検索し、プロトコル (http:// など)、ファイル拡張子、または定義済みの "チェック バイト" を照合する。チェック バイトは、ファイル内の特定のオフセットにあり、特定のパターンと一致するバイトである。詳細については、「カスタム ファイル タイプの登録」を参照すること。このメソッドは、適切なソース フィルタを見つけると、そのフィルタのインスタンスを作成し、それをグラフに追加して、ファイル名を指定してフィルタの IFileSourceFilter::Load メソッドを呼び出す。

RenderFile メソッドは、ファイル名からデフォルトの再生グラフを作成する。内部的には、このメソッドは AddSourceFilter を使って適切なソース フィルタを探し、Render を使ってグラフの残りを作成する。

Connect メソッドが出力ピンを入力ピンに接続する。このメソッドは、Render メソッドで説明したアルゴリズムのバリエーションを使って、必要に応じて中間フィルタを追加する。

  1. 中間フィルタを使わずに、フィルタ間を直接接続しようとする。
  2. キャッシュされたフィルタを試す。
  3. グラフ内のフィルタを試す。
  4. レジストリ内のフィルタを検索する。

参照