1

DSPACK コンポーネント ライブラリを使用して Delphi 6 で記述された DirectShow Transform フィルタがあります。新しい接続が試行されるたびに新しい入力ピンを作成する単純なオーディオ ミキサーです。メディア形式が設定されると、その入力ピンまたは単一の出力ピンへのすべての接続がそのメディア形式に準拠するように強制されるため、単純と言います。フィルター チェーンを手動で構築し、すべてのピン接続を自分で明示的に行います。望ましくない動作 (私の場合) を誤ってトリガーする方法がない限り、「インテリジェント レンダリング」呼び出しは使用しません。

注: キャプチャ フィルターは、アプリケーションの外部にある標準の DirectShow フィルターです。プッシュ ソース オーディオ フィルタと単純なオーディオ ミキサー フィルタは、プライベートで未登録のフィルタとして使用されており、アプリケーションの内部にあります。

ミキサーに複数の入力接続を作成しようとしたときにのみ発生する奇妙な問題が発生します。これは実際にそれらを受け入れます。現在、キャプチャ フィルタとカスタム プッシュ ソース オーディオ フィルタの両方をミキサー フィルタに接続しようとしています。それをしようとすると、2 番目のアップストリーム フィルター接続が失敗します。Capture Filter を最初に接続するか、Push Source オーディオ フィルターを最初に接続するかに関係なく、2 番目のアップストリーム フィルター接続は常に失敗します。

私が実行した最初のテストは、Capture Filter だけをミキサーに接続することでした。それはうまくいきました。

私が実行した 2 番目のテストは、Push Source オーディオ フィルターのみをミキサーに接続することでした。それはうまくいきました。

しかし、両方を実行しようとするとすぐに、「中間フィルターの組み合わせが見つかりませんでした」というエラーが表示されます。グラフ ビルダーからフィルタにヒットするメディア ネゴシエーション コールを数時間掘り下げたところ、問題が見つかりました。何らかの理由で、フィルタ グラフが古い「Indeo (R) Audio Software」コーデックをチェーンに引きずり込んでいます。

私がこれを発見したのは、コーデックがほぼすべての点 (メジャー タイプ、サブ タイプ、フォーマット タイプ、ウェーブ フォーマット パラメータ) でフィルターに一致するメディア フォーマットを持っていたにもかかわらず、pbFormat データの最後に余分な 2 バイトがあったためです。メンバーであり、それは対等に失敗するのに十分でしたテストは、各メディア タイプの cbFormat 値を比較することによって、ソースとターゲットの pbFormat 領域を比較するためです。Indeo コーデックの cbFormat 値は 20 ですが、フィルターの cbFormat 値は 18 です。これは _tWAVEFORMATEX データ構造のサイズです。20 バイト領域の最初の 18 バイトは、ミキサー フィルタがサポートするメディア タイプの pbFormat 領域と正確に等しいため、Indeo pbFormat の奇妙なサイズはある意味では良いことです。その異常がなければ、私は古代のコーデックがドラッグインされていることを知りませんでした.エクスプロイトと脆弱性が知られているので、それがまったくドラッグインされていることに驚いています. 最も紛らわしいのは、これが入力ピンの 1 つではなく、ミキサー フィルターの出力ピンで発生していることです。ピン接続を構築するときに、ダウンストリーム接続をまだ 1 つも作成していません。

キャプチャ フィルターとプッシュ ソース フィルターの両方の受信フィルターのメディア形式が同一であり、一致するため中間フィルターをまったく必要としないにもかかわらず、DirectShow がそのコーデックをドラッグしようとしている理由を誰か教えてください。ミキサー フィルタの入力ピンが正確にサポートするフォーマットは? この問題を解決するにはどうすればよいですか?

また、成功した上記の単一フィルター取り付けテストでも、私のミキサー出力ピンはメディア形式について引き続きクエリを受けていることに気付きました。前述したように、ピン接続を構築するこの時点で、ミキサー フィルターの出力ピンに何も接続していないのはなぜですか?

--------------------------- 更新: 1 -------------------- --------

IGraphBuilder.Connect() の代わりに IFilterGraph.ConnectDirect() を使用すると、「インテリジェント接続」の動作を完全に回避できることがわかりました。DirectConnect() に切り替えたところ、ミキサー フィルターの入力ピンが「既に接続されている」状態に戻っていることがわかりました。それが原因で、グラフ ビルダーが Indeo コーデック フィルターを引きずっている可能性があります。この新しい診断情報が得られたので、問題を修正し、この記事を結果で更新します。

4

1 に答える 1