次の方法で共有


ピンの再接続

ピンの接続中、フィルタは次のように他のピンの 1 つを接続解除したり、再接続したりできる。

  1. フィルタは他のフィルタのピンの IPin::QueryAccept を呼び出し、新しいメディア タイプを指定する。
  2. QueryAccept が S_OK を返すと、フィルタは IFilterGraph2::ReconnectEx を呼び出し、ピンを再接続する。

次に、フィルタがピンの再接続を必要とする場合の例を示す。

  • ティー フィルタ。"ティー フィルタ" は、ストリームのデータを変更せずに、入力ストリームを複数の出力に分割する。ティー フィルタは一定範囲のメディア タイプを受け入れ可能だが、タイプはすべてのピン接続間で一致する必要がある。したがって、入力ピンが接続すると、フィルタは出力ピンで既存の接続の再調整が必要になることがある。また、その逆の処理が必要になることがある。例については、「InfTee フィルタ サンプル」を参照すること。
  • 変換インプレイス フィルタ。変換インプレイス フィルタは、データを異なる出力バッファにコピーする代わりに、元のバッファ内の入力データを変更する。変換インプレイス フィルタはアップストリームとダウンストリームの両方の接続に同じアロケータを使う必要がある。接続する最初のピン (入力ピンまたは出力ピン) は通常どおりアロケータを調整する。しかし、他のピンが接続すると、最初のアロケータは受け入れられないことがある。その場合、2 番目のピンは異なるアロケータを選択し、最初のピンは新しいアロケータを使って再接続する。実装例については、CTransInPlaceFilter クラスを参照すること。

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