次の方法で共有


DirectShow のピン情報のキャッシュ

アプリケーションでは、DirectShow IFilterMapper2 インターフェイスを使用して、特定の条件を満たすフィルターを自動的に検索できます。 このアプリケーションは、IFilterMapper2 が返す提案されたフィルターの一覧を使用して、テレビ信号を受信してレンダリングするフィルターを含むフィルター グラフを自動的に作成できます。 指定された条件を満たすフィルターをすばやく検索するために、 IFilterMapper2 は、以前にキャッシュに入力されたフィルターとそのピンに関する情報を使用します。 次の段落の説明では、このキャッシュをピン データ キャッシュと呼びます。

ピン データ キャッシュに含まれる情報には、フィルターで公開できる各ピンのメディアとメディアの種類の一覧が含まれます。 IFilterMapper2 は、このキャッシュ情報を使用して、可能なフィルターが既にグラフ内にあるフィルターのピンに接続できるかどうかを判断します。 この決定を行う場合、フィルターのインスタンスを作成して、メディアまたはメディアの種類が一致しないためにフィルターへの接続が禁止されていることを判断するだけのオーバーヘッドがなくなります。 フィルターのピン データ キャッシュが最新でない場合、フィルター グラフ内の接続の候補としてフィルターが誤って削除される可能性があります。

DirectShow で使用されるピン データ キャッシュが最新でないと BDA ミニドライバーが判断するたびに、ミニドライバーの BDA コンポーネントの BDA フィルター インスタンスのピン情報がフィルター グラフで正確に公開されるように、そのミニドライバーはピン データ キャッシュを更新する必要があります。 BDA ミニドライバーは、次のシナリオで説明するように DirectShow のピン データ キャッシュを更新します。

  • ミニドライバーがユーザー モードで DirectShow フィルターとして BDA フィルターを表示する方法に応じて、ミニドライバーが最初に BDA フィルター インスタンスを作成するときに、BDA ミニドライバーが DirectShow のピン データ キャッシュを更新する必要がある場合と必要ない場合があります。 BDA ミニドライバーの情報 (INF) ファイルは、ミニドライバーが DirectShow フィルターとして BDA フィルターを表示するために使用するメカニズムを指定します。

    通常、BDA ミニドライバーは、カーネル ストリーミング (KS) プロキシ モジュール (Ksproxy.ax) を使用して、BDA フィルターを DirectShow フィルターとして表示します。 KS プロキシは、これらのフィルターのインスタンスが最初に作成されるたびに、DirectShow のピン データ キャッシュを自動的に更新して、BDA フィルターのピン情報を公開します。 そのため、KS プロキシを使用する BDA ミニドライバーは、フィルターのインスタンスを最初に作成するときに DirectShow のピン データ キャッシュを更新する操作を実行する必要はありません。 KS プロキシを介して BDA フィルターがユーザー モードに公開されている場合、キャッシュされた情報には、フィルターの作成ディスパッチ ルーチンが返された直後にフィルター インスタンスに存在するピン ファクトリのメディアとメディアの種類が自動的に含まれます。

    一部の BDA ミニドライバーは、DirectShow フィルターとして BDA フィルターを提示するために KS プロキシを使用しません。 たとえば、アナログテレビ信号を受信または処理する BDA フィルターを実装する BDA レシーバー ミニドライバーは、KSTVTune.ax モジュールまたは KSXBar.ax モジュールを使用して、これらの BDA フィルターを DirectShow フィルターとして表示します。 これらのモジュールでは、DirectShow のピン データ キャッシュを更新するために標準の KS プロキシ インターフェイス メソッドを使用しないため、これらの種類の BDA フィルターの BDA ミニドライバーは、これらのミニドライバーが最初にフィルターのインスタンスを作成するときに DirectShow のピン データ キャッシュを更新する必要があります。 これらのフィルターのインスタンスが作成されたときに DirectShow のピン データ キャッシュが更新されるようにするために、BDA ミニドライバーは、フィルターの作成ディスパッチ ルーチンの実装内で BdaInitFilter 関数を呼び出した直後に BdaFilterFactoryUpdateCacheData 関数を呼び出します。 この呼び出しでは、ミニドライバーは、フィルター上のすべての初期ピンを更新するピン情報を渡します。

  • ピンは、フィルターの作成ディスパッチ ルーチンが完了した後、BDA フィルターで動的に作成できます。 BDA フィルターの最初に作成されたインスタンスが、BDA フィルターのテンプレート トポロジ (BDA_FILTER_TEMPLATE) に一覧表示されているすべてのピンのインスタンスを公開しない場合、BDA ミニドライバーは BdaFilterFactoryUpdateCacheData を呼び出して、フィルターのテンプレート トポロジに一覧表示されているすべてのピンに関する情報を強制的に取得する必要があります。

注: DirectShow のピン データ キャッシュを更新すると、レジストリに触れて変更されるため、大幅なオーバーヘッドが発生します。 さらに、DirectShow のピン データ キャッシュを更新すると、DirectShow がフィルター グラフを自動的に作成するために必要な時間に影響します。 そのため、BDA ミニドライバーは、DirectShow が使用するピン データ キャッシュが最新でないと判断した場合にのみ、すべての可能なピンに対して BdaFilterFactoryUpdateCacheData を呼び出す必要があります。

可能であれば、ドライバー、ファームウェア、またはハードウェアの更新が発生するたびに、BDA ミニドライバーが BdaFilterFactoryUpdateCacheData を呼び出す必要があります。