Microsoft DirectX 8.0

フィルタの接続

ここでは、Microsoft® DirectShow® でフィルタがどのように接続されるかについて説明する。このトピックはフィルタの開発者を対象としている。DirectShow アプリケーションを作成している場合、このトピックの詳細説明は必ずしも重要ではない。

ここでは、以下の項目について説明する。

ピン接続

フィルタは IPin インターフェイスを介してピンで接続される。出力ピンは入力ピンに接続する。各ピン接続にはメディア タイプがあり、AM_MEDIA_TYPE 構造体に記述される。

アプリケーションは、フィルタ グラフ マネージャでメソッドを呼び出すことで、フィルタに接続する。フィルタやピン自体にメソッドを呼び出すことはしない。アプリケーションは、IFilterGraph::ConnectDirect メソッドや IGraphBuilder::Connect メソッドを呼び出すことで接続するフィルタを直接指定できる。また、IGraphBuilder::RenderFile などのグラフ構築メソッドのいずれかを使って、間接的にフィルタに接続することもできる。

正常に接続するために、両方のフィルタがフィルタ グラフ内になければならない。アプリケーションは、IFilterGraph::AddFilter メソッドを呼び出すことで、フィルタをフィルタ グラフに追加できる。フィルタ グラフ マネージャも、フィルタを作成してフィルタ グラフに追加できる。どちらの場合も、フィルタ グラフ マネージャはフィルタの IBaseFilter::JoinFilterGraph メソッドを呼び出してフィルタに通知する。

大まかな接続プロセスは次のようになる。

  1. フィルタ グラフ マネージャが出力ピンに対して IPin::Connect を呼び出し、入力ピンへのポインタを渡す。
  2. 出力ピンが接続を受け入れる場合、入力ピンに対して IPin::ReceiveConnection を呼び出す。
  3. 入力ピンも接続を受け入れる場合、接続が成功し、ピンが接続される。

一部のピンは、フィルタがアクティブである間でも接続解除や再接続が可能である。このような再接続は動的再接続と呼ばれる。詳細については、「動的グラフ作成」を参照すること。ただし、多くのフィルタは動的再接続をサポートしていない。

フィルタは通常、ダウンストリーム順に接続される。つまりフィルタの出力ピンの前に入力ピンが接続される。フィルタは常にこの順での接続をサポートする必要がある。一部のフィルタは逆順の接続もサポートしている。つまり、出力ピンが先で、その後に入力ピンが接続される。たとえば、MUX フィルタの入力ピンを接続する前に、MUX フィルタの出力ピンをフィルタ ライタ フィルタに接続することができる。

メディア タイプの調整

フィルタ グラフ マネージャが IPin::Connect メソッドを呼び出すときに、次のオプションでメディア タイプを指定する。

ピンが実際に接続すると、接続は常に完全なメディア タイプを持つ。フィルタ グラフ マネージャがメディア タイプを指定する目的は、起こりうる接続タイプを限定することである。

調整プロセス中に、出力ピンは入力ピンの IPin::ReceiveConnection メソッドを呼び出すことで、メディア タイプを提示する。入力ピンは、提示されたタイプの受け入れまたは拒否を選択できる。入力ピンがタイプを受け入れるまでこのプロセスが繰り返される。出力ピンがあらゆるタイプを提示し尽くして、すべて拒否された場合、接続は失敗する。

提示するメディア タイプを出力ピンがどのように選択するかは、実装により異なる。DirectShow 基底クラスでは、出力ピンが入力ピンに対して IPin::EnumMediaTypes を呼び出す。このメソッドは、入力ピンの優先メディア タイプを列挙する列挙子を返す。これに失敗すると、出力ピンは出力ピン側の優先タイプを列挙する。

アロケータの調整

2 つのピンが接続すると、メディア データを交換するためのしくみが必要となる。このしくみは転送と呼ばれる。通常、DirectShow アーキテクチャは転送に関して中立的である。2 つのフィルタは、両者がサポートする任意の転送方法で接続することに合意できる。

最も一般的な転送は、ローカル メモリ転送である。この転送では、メディア データはメイン メモリに保持される。アロケータと呼ばれるオブジェクトが、メモリ バッファの割り当てを担当する。アロケータは、IMemAllocator インターフェイスをサポートする(詳細については、「フィルタ グラフのデータ フロー」を参照すること)。入力ピンは、IMemInputPin インターフェイスを公開することで、メイン メモリ転送をサポートする。出力ピンは、接続プロセス中にこのインターフェイスを問い合わせる。

両方のピンが同じアロケータを共有する。ピンが接続すると、どちらのピンがアロケータを提供するかを次の手順で調整する。

  1. 出力ピンが IMemInputPin::GetAllocatorRequirements を呼び出す (省略可能)。このメソッドは、メモリ配置など、入力ピンのバッファ要件を取得する。通常、出力ピンは、十分な理由がない限り入力ピンの要求を受け入れることになる。
  2. 出力ピンが IMemInputPin::GetAllocator を呼び出す (省略可能)。このメソッドは、入力ピンからアロケータを要求する。入力ピンはアロケータを提供するか、提供できない場合はエラー コードを返す。
  3. 出力ピンがアロケータを選択する。入力ピンから提供されたアロケータを使用するか、または出力ピン自体がアロケータを提供する。出力ピンが IMemInputPin::NotifyAllocator を呼び出して、入力ピンに選択結果を通知する。

このプロセスで必須なのはステップ 3 のみであることに注意すること。

フィルタがダウンストリーム入力ピンからのアロケータを選択する場合、フィルタはその入力ピンにサンプルを提供するためにのみ、アロケータを使用する必要がある。このアロケータは、ほかのピンにサンプルを提供するために使用することはできない。

ピンの再接続

ピン接続中に、フィルタはほかのピンの接続を解除したり、再接続したりしなければならないことがある。たとえば次のような場合である。

再接続するには、フィルタはフィルタ グラフ マネージャに対して IFilterGraph::Reconnect または IFilterGraph2::ReconnectEx を呼び出す。フィルタ グラフ マネージャは非同期にピンの接続解除と再接続を行う。メディア タイプを指定するので、ReconnectEx メソッドを使うことが望ましい。メディア タイプを指定しない場合、再接続を始めるフィルタが、目的のメディア タイプを内部に格納する必要がある。

フィルタは、再接続が成功することが確実でない限り、再接続を試行してはならない。再接続に失敗すると、ピンは接続が解除されたままになり、グラフ エラーの原因となる。フィルタが新しいメディア タイプで再接続する場合は、既知の有効なメディア タイプを指定しなければならない。不明な場合は、IPin::QueryAccept メソッドを呼び出す。

また、フィルタは、同じスレッド上の IPin::Connect メソッドの中から再接続を要求する必要がある。あるスレッドに IPin::Connect メソッドが返されているにもかかわらず、別のスレッドから再接続要求が行われると、フィルタ グラフ マネージャは、再接続を行う前にグラフを実行する可能性があり、グラフ エラーの原因となる。