Media Foundation (7) - トポロジーについて

公開:2013-02-26 21:16
更新:2020-02-15 04:37
カテゴリ:media foundation,audio,c++,windows,windows api

はじめに

Media Foundationのメディア・パイプラインの「About Topology」の勝手訳をベースに補足を入れてみた。でもやっぱりわかりにくいので自分の言葉で書き直すつもり。

トポロジーについて

トポロジーはメディアパイプライン中でどのようにデータが流れるのかを表現するオブジェクトである。 アプリケーションはソースからシンクまでの経路を記述することによってトポロジーを作成する。 アプリケーションはメディアセッションにトポロジーを渡す。メディアセッションはトポロジーを使い、データの流れを制御する。パイプライン中でデータ処理をするオブジェクトはノードと呼ぶ。

あるノードから別のノードへの流れは接続によって表現される。次のノードタイプが定義されている。

  • ソースノード:メディアソース上のメディアストリームを表す。
  • 変換ノード:メディア・ファンデーション・トランスフォーム(MFT)を表す。
  • 出力ノード:メディアシンク上のストリームシンクを表す。
  • 分岐ノード:ストリームの分岐を表す。分岐ノードはパイプラインオブジェクトのノードの原則の例外である。他のノードタイプと異なり、ティーノードはデータの流れを単純に示すだけである。

トポロジーとして機能するためには少なくとも1つのソースノードと出力ノードが直接あるいは1つ以上の変換ノードを通して接続されていなければならない。例えば、次の図は簡単な1つのストリームだけのトポロジーを表している。

ファイルを再生するために、デコーダの変換ノードと音声ストリームもしくはビデオストリームを表す出力ノードがある。 ファイルへのエンコードのためにエンコーダーを表す変換ノードがあり、ASFファイルシンクのような保存シンクを表す出力ノードもある。

もし2つのノードが接続された時、データを作成する側は上流ノードと呼ばれる。そしてデータを受信するノードを下流ノードと呼ばれる。例えば前の図ではソースノードがトランスフォームノードにおける上流である。

接続されたノードのペアの中で、上流上の接続点は出力と呼ばれる。下流上の接続点は入力と呼ばれる。次の図は、接続ポイントを伴うノードの組を表していて、ノード間のデータの流れを表している。接続点はトポロジー上は分離独立したオブジェクトとしては表されない。接続点はノードのインデックス値によって特定する。

ソースノードは入力をもつことはできない。よってソースノードが上流となるノードはない。同様に出力ノードは出力を持つことは出来ない。そして出力ノードが下流となるようなノードも存在しない。ソースノードから出力ノードへのノードの繋がりはブランチ(枝)と呼ばれる。 最初の図はシングルブランチを伴うトポロジーを表している。一般的にはストリームごとに1つのブランチとなっている。 1つのオーディオストリームと1つのビデオストリームを含むファイルを再生するためには、2つのブランチを含むトポロジーが必要である。次の図は2ブランチのトポロジーの一例である。

部分トポロジー

完全もしくは十分なトポロジーは必要なパイプライン・オブジェクト用のノードを含んでいる。しかし、アプリケーションはいつも完全なトポロジーを作る必要はない。代わりに一つ以上の変換ノードを省略した部分トポロジーを作成する。

メディアセッションはトポロジー・ローダーと呼ばれるオブジェクトを使用して、トポロジーを完全化する。トポロジー・ローダーは部分トポロジーから完全なトポロジーにするのに必要な変換ノードを挿入する。この変換プロセスをトポロジーの解決と呼んでいる。

例えば、エンコードされたオーディオ・ストリームを演奏するためには、トポロジーはソースと出力ノードの間にデコーダが必要である。アプリケーションはデコーダーなしに直接ソースノードと出力ノードを接続し部分トポロジーを作成する。トポロジーローダーはストリーム・フォーマットを調べ、正しいデコーダーを選択し、トポロジー中に変換ノードを挿入する。

次の図はアプリケーションによって作成された部分トポロジーである。

次の図は上図の部分トポロジーをトポロジー・ローダーで解決後の完全なトポロジーである。この例ではトポロジーにはデコーダーノードが挿入されている。

次の図はmp3ファイルと出力ノードの部分トポロジーである。

これをトポロジー・ローダーによって解決し、完全なトポロジーにしたのが下の図である。この例ではデコーダーとリサンプラーの変換ノードが挿入されている。

現在のバージョンでは、トポロジー・ローダーは再生のみに対応している。ファイルのエンコードやその他のシナリオではアプリケーションは完全なトポロジーを作成しなければならない。

アプリケーションはトポロジー・ローダーを作成し、直接使用することができる。例えば、部分トポロジーを解決するトポロジー・ローダーを使いメディア・セッションに渡す前に完全なトポロジーに修正することができる。トポロジー・ローダーを作成するためには、MFCreateTopoLoader関数を呼び出す。