1

DirectShow アプリケーションの開発中に奇妙な問題が発生しました。DSPACK DirectShow コンポーネント ライブラリで Delphi 6 を使用しています。IBaseFilter インスタンスの 1 つは、TPinInfo.achName プロパティ (_PinInfo) を使用してフィルター内のピンを見つけようとすると、所有するピンを認識しないようです。(この場合、この奇妙な動作を示しているのは、TSampleGrabber コンポーネントによって作成された IBaseFilter であることに注意してください)。

以下のコードサンプルにカプセル化された一連のイベントは次のとおりです。

  1. IBaseFilter インスタンスで最初に使用可能な入力ピンを見つけます。以下のコードでは、これは testPinInfo() に渡されるピンです。
  2. 返されたピンで QueryPinInfo() を実行して、その情報を取得します。返された情報は、ピンの achName を「入力」として示しています。
  3. IBaseFilter.findPin() を使用して、まったく同じ IBaseFilter インスタンスで「入力」という名前のピンを検索してみてください。
  4. その名前のピンが見つからなかったことを示す NIL を返します。私の意見では、これは本当に奇妙な状態 (エラー) です。

このシナリオを引き起こす可能性のある条件を知っている人はいますか? 関連するデータ構造は、デバッガーで調べると問題ないように見えるため、メモリ破損の問題ではないと思います。一部の IBaseFilter 実装が FindPin() メソッドの適切な実装を怠っている可能性はありますか?

以下にコードを示します。

procedure testPinInfo(intfInputPin: IPin);
var
    intfTestPin: IPin;
    pinInfo_input: TPinInfo;
begin
    intfTestPin := nil;

    // Get the pin information.
    ZeroMemory(@pinInfo_input, SizeOf(pinInfo_input));
    intfInputPin.QueryPinInfo(pinInfo_input);

    // Now immediately turn around and try to find the pin in the filter that
    //  owns it, using the name found in pinInfo_input
    pinInfo_input.pFilter.FindPin(pinInfo_input.achName, intfTestPin);

   // >>> intfTestPin is NIL (unassigned).  This is an error.
end;
4

3 に答える 3

1

を使用しないFindPinでください。常により良い方法があります。対象のメディア タイプで目的の方向の接続されていないピンを探します。特にプレビュー/キャプチャ ピンを探す場合は、IKsPropertySetインターフェイスを使用して必要なピンを明確に識別するオプションが常にあります。

于 2011-11-14T09:15:17.147 に答える
0

FindPin の場合、対応する ID が必要です。QueryId() を確認してください。入力の場合、通常は「In」です。

于 2016-02-08T10:37:47.823 に答える