はじめに
Media Foundationのメディア・パイプラインの「About Topology」の勝手訳をベースに補足を入れてみた。でもやっぱりわかりにくいので自分の言葉で書き直すつもり。
トポロジーについて
トポロジーはメディアパイプライン中でどのようにデータが流れるのかを表現するオブジェクトである。 アプリケーションはソースからシンクまでの経路を記述することによってトポロジーを作成する。 アプリケーションはメディアセッションにトポロジーを渡す。メディアセッションはトポロジーを使い、データの流れを制御する。パイプライン中でデータ処理をするオブジェクトはノードと呼ぶ。
あるノードから別のノードへの流れは接続によって表現される。次のノードタイプが定義されている。
- ソースノード:メディアソース上のメディアストリームを表す。
- 変換ノード:メディア・ファンデーション・トランスフォーム(MFT)を表す。
- 出力ノード:メディアシンク上のストリームシンクを表す。
- 分岐ノード:ストリームの分岐を表す。分岐ノードはパイプラインオブジェクトのノードの原則の例外である。他のノードタイプと異なり、ティーノードはデータの流れを単純に示すだけである。
トポロジーとして機能するためには少なくとも1つのソースノードと出力ノードが直接あるいは1つ以上の変換ノードを通して接続されていなければならない。例えば、次の図は簡単な1つのストリームだけのトポロジーを表している。
ファイルを再生するために、デコーダの変換ノードと音声ストリームもしくはビデオストリームを表す出力ノードがある。 ファイルへのエンコードのためにエンコーダーを表す変換ノードがあり、ASFファイルシンクのような保存シンクを表す出力ノードもある。
もし2つのノードが接続された時、データを作成する側は上流ノードと呼ばれる。そしてデータを受信するノードを下流ノードと呼ばれる。例えば前の図ではソースノードがトランスフォームノードにおける上流である。
接続されたノードのペアの中で、上流上の接続点は出力と呼ばれる。下流上の接続点は入力と呼ばれる。次の図は、接続ポイントを伴うノードの組を表していて、ノード間のデータの流れを表している。接続点はトポロジー上は分離独立したオブジェクトとしては表されない。接続点はノードのインデックス値によって特定する。
ソースノードは入力をもつことはできない。よってソースノードが上流となるノードはない。同様に出力ノードは出力を持つことは出来ない。そして出力ノードが下流となるようなノードも存在しない。ソースノードから出力ノードへのノードの繋がりはブランチ(枝)と呼ばれる。 最初の図はシングルブランチを伴うトポロジーを表している。一般的にはストリームごとに1つのブランチとなっている。 1つのオーディオストリームと1つのビデオストリームを含むファイルを再生するためには、2つのブランチを含むトポロジーが必要である。次の図は2ブランチのトポロジーの一例である。
部分トポロジー
完全もしくは十分なトポロジーは必要なパイプライン・オブジェクト用のノードを含んでいる。しかし、アプリケーションはいつも完全なトポロジーを作る必要はない。代わりに一つ以上の変換ノードを省略した部分トポロジーを作成する。
メディアセッションはトポロジー・ローダーと呼ばれるオブジェクトを使用して、トポロジーを完全化する。トポロジー・ローダーは部分トポロジーから完全なトポロジーにするのに必要な変換ノードを挿入する。この変換プロセスをトポロジーの解決と呼んでいる。
例えば、エンコードされたオーディオ・ストリームを演奏するためには、トポロジーはソースと出力ノードの間にデコーダが必要である。アプリケーションはデコーダーなしに直接ソースノードと出力ノードを接続し部分トポロジーを作成する。トポロジーローダーはストリーム・フォーマットを調べ、正しいデコーダーを選択し、トポロジー中に変換ノードを挿入する。
次の図はアプリケーションによって作成された部分トポロジーである。
次の図は上図の部分トポロジーをトポロジー・ローダーで解決後の完全なトポロジーである。この例ではトポロジーにはデコーダーノードが挿入されている。
次の図はmp3ファイルと出力ノードの部分トポロジーである。
これをトポロジー・ローダーによって解決し、完全なトポロジーにしたのが下の図である。この例ではデコーダーとリサンプラーの変換ノードが挿入されている。
現在のバージョンでは、トポロジー・ローダーは再生のみに対応している。ファイルのエンコードやその他のシナリオではアプリケーションは完全なトポロジーを作成しなければならない。
アプリケーションはトポロジー・ローダーを作成し、直接使用することができる。例えば、部分トポロジーを解決するトポロジー・ローダーを使いメディア・セッションに渡す前に完全なトポロジーに修正することができる。トポロジー・ローダーを作成するためには、MFCreateTopoLoader関数を呼び出す。