プラグインディストリビューター
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
プラグイン ディストリビューター (PID) は、フィルター グラフ マネージャーの機能を拡張する方法です。 プラグイン ディストリビューターは、フィルター グラフ マネージャーが実行時に集計する COM オブジェクトです。 アプリケーションは、フィルター グラフ マネージャーを使用して PID へのアクセスを取得します。
フィルター グラフ マネージャーは、サポートされていないインターフェイスに対してクエリを実行すると、レジストリで次の形式のキーを検索します。
HKEY_CLASSES_ROOT\Interface\IID\Distributor
IID
は、インターフェイス識別子を含む文字列です。 レジストリ エントリが存在する場合、エントリの値によって、インターフェイスをサポートする PID のクラス識別子 (CLSID) が定義されます。 フィルター グラフ マネージャーは PID を集計し、インターフェイス ポインターを返します。これにより、PID の外部 IUnknown として機能します。 アプリケーションがインターフェイスでメソッドを呼び出すとき、実際には PID でメソッドを呼び出しています。 ただし、PID の存在はアプリケーションに対して透過的です。
ディストリビューターという用語は、PID がフィルター グラフ マネージャー上のインターフェイスに対して外側の IUnknown ポインターに対してクエリを実行できるという事実に由来します。 IFilterGraph::EnumFilters メソッドを呼び出すことで、PID はグラフ内のフィルターを列挙し、メソッド呼び出しをそれらのフィルターに分散させることができます。 このようにして、PID は、アプリケーションがフィルターでメソッドを呼び出す単一の制御ポイントとして機能できます。
フィルター グラフ マネージャーは、PID を集計すると、 IDistributorNotify インターフェイスの PID に対してクエリを実行します。 PID がこのインターフェイスをサポートしている場合、フィルター グラフ マネージャーはそれを使用して、グラフの変更について PID に通知します。
- フィルター グラフは、実行状態、一時停止状態、停止状態を切り替えると、 IDistributorNotify::Run、 IDistributorNotify::P ause、または IDistributorNotify::Stop を呼び出します。
- 参照クロックが設定されている場合、フィルター グラフ マネージャーは IDistributorNotify::SetSyncSource を呼び出します。
- フィルターが追加または削除されるか、ピン接続が変更されると、フィルター グラフ マネージャーは IDistributorNotify::NotifyGraphChange を呼び出します。
カスタム PID を実装するには、集計をサポートする COM オブジェクトを作成します。 フィルター グラフ マネージャーでまだサポートされていないインターフェイスをサポートする必要があります。 必要に応じて、 IDistributorNotify インターフェイスをサポートできます。
PID がフィルター グラフ マネージャーからインターフェイス ポインターを取得すると、すぐに解放されます。 そうしないと、循環参照カウントが作成され、フィルター グラフ マネージャーが破棄されない可能性があります。 フィルター グラフ マネージャーは PID の有効期間を制御するため、フィルター グラフ マネージャーに参照カウントを保持する必要はありません。
PID はフィルター グラフ マネージャーによる集計専用に設計されているため、PID のコンストラクター メソッドでこれを適用できます。 外側の IUnknown ポインターが NULL であるかどうかを確認し、その場合はエラー コードVFW_E_NEED_OWNERを返します。 (「エラー コードと成功コード」を参照してください)。また、他のオブジェクトが PID を集計するのを防ぐために、IGraphBuilder インターフェイスの外側の IUnknown ポインターに対してクエリを実行できます。 オブジェクトが IGraphBuilder を公開していない場合は、エラー コードを返します。