登録されていないDirectShowフィルタを適切に(ソースコードを持って)作成するにはどうしたらいいですか?

Delphi 6 ProとDSPACK DirectShowコンポーネントライブラリを使用してプッシュソースフィルタを作成しました。フィルタを私的に使用したいので、DLLのAXファイルを作成しません。代わりにフィルターを直接作成したいと考えています。私はこの上にいくつかのスレッドを見つけましたが、それらのどちらも、フィルタのコンストラクタを使ってプライベートフィルタを構築する方法を示していません:

constructor Create(ObjName: string; Unk: IUnKnown; out hr: HRESULT);
constructor CreateFromFactory(Factory: TBCClassFactory; const Controller: IUnknown); override;

ここでは、登録されていないDirectShowフィルタまたはプライベートなDirectShowフィルタのテーマで見つかったいくつかのスレッドを示します。

http://www.gdcl.co.uk/2011/June/UnregisteredFilters htm

http://www.progdigy.com/forums/viewtopic.php?p=12304&sid=df52f07f5b00d7ebfac12cb9b9bd9b54

どのようにしてDirectShowプッシュソースフィルタをEXEに挿入しますか?

フィルタのソースコードは、私のDelphiプロジェクトに直接追加されています。しかし、主なアプリケーションから直接フィルタを作成するときにどのコンストラクタを使うべきか、そしてコンストラクタのパラメータを渡すべきものはわかりません。誰かが何をすべきか教えてくれますか?

また、最初のスレッドで上記のようにFilterオブジェクトの参照カウントをインクリメントする必要がありますか?その後、アプリケーションの終了時にRelease()を呼び出します。もしそうなら、これを行う最善の方法は何ですか?または、アプリケーションの終了時にフィルタで「無料」を呼び出すことはできますか?

最後に、プライベートフィルタを使用する前にCoInitialized()とCoUninitialize()を呼び出す必要がありますか?

UPDATE: Tracing through the classes and the class hierarchy constructor chain for TBCSource, the base class for DSPACK derived filters, it appears that the ObjName parameter is the Filter name and the Unk parameter is the object that owns the filter. My current guess is that the correct way to create the Filter directly from source would be, given a TBCSource derived class named TPushSourceFilter that is arbitrarily given the filter name 'My Push Source Filter', for example purposes:

TPushSourceFilter.Create('My Push Source Filter', nil, hr);

最初のコンストラクタパラメータは、フィルタを登録するために使用されるフィルタ名です。つまり、DirectShowフィルタをGraphEdtのようなツールで表示するときに表示されるフィルタ名です。私は、TBCUnknownという名前の祖先クラスの所有者データフィールド(FOwner)に解決するため、2番目のパラメータはNILである必要があります。 所有者オブジェクトの場合は、Filterオブジェクトに直接クエリを適用するのではなく、NIL以外の場合は、基本クラスによって処理されたQueryInterface()デリゲートの状況。私はこの建設方法に進み、それが機能するかどうかを見ていきます。

2

1 答え

必要なのは、オブジェクト TPushSourceFilter.Create のインスタンスで、このインスタンスから IBaseFilter インタフェースを取得するだけです。そこから、 CoCreateInstance で作成したフィルタと同じようにグラフに追加してから、ピンなどを接続します。

1
追加された