2011-11-11 11 views
1

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

  1. IBaseFilterインスタンス内の最初の利用可能な入力ピンを検索:

    以下のサンプルコードでカプセル化されたイベントのシーケンスは、このです。以下のコードでは、これはtestPinInfo()に渡されるピンです。

  2. 返されたピンに対してQueryPinInfo()を実行して、その情報を取得します。返された情報は、ピンのachNameを 'Input'として示しています。
  3. IBaseFilter.findPin()を使用して、非常に同じIBaseFilterインスタンスで 'Input'というピンを検索してみてください。
  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; 

答えて

1

FindPinを使用しないでください、あなたは常にそれを行うためのより良い方法を持っています。関心のあるメディアタイプで、希望する方向の未接続ピンを探します。プレビュー/キャプチャピンを特に探す場合は、必要なピンを明確に識別するために、いつもIKsPropertySetインターフェイスを使用するオプションがあります。

1

私はそう、私はFindPinの私自身のバージョン作らこれに類似した問題があった: - )(QUERYIDをチェックし、あなたが対応するIDが必要ですFindPinするため

HRESULT GraphControl::FindPinByName(IBaseFilter* pFilter,LPCWSTR pName,IPin** ppPin) 
{ 
    HRESULT hr = E_FAIL; 
    IEnumPins* pEnum = NULL; 
    IPin* pPin = NULL; 
    DWORD pFetched = 0; 
    PIN_INFO pinInfo = {0}; 

    // Create a pin enumerator 
    if(FAILED(pFilter->EnumPins(&pEnum))) 
     return E_FAIL; 


    // Get the first instance 
    hr = pEnum->Next(1,&pPin,&pFetched); 

    while(hr == S_OK) 
    { 
    pPin->QueryPinInfo(&pinInfo); 
    // Compare the names 
    if (wcscmp(pName,pinInfo.achName) == 0) 
    { 
     // pin names match so use this one and exit 
     *ppPin = pPin; 
     break; 
    } 
    SAFE_RELEASE(pinInfo.pFilter); 
    SAFE_RELEASE(pPin); 

    hr = pEnum->Next(1,&pPin,&pFetched); 
    } 

    SAFE_RELEASE(pinInfo.pFilter); 
    SAFE_RELEASE(pEnum); 

    // if the pPin address is null we didnt find a pin with the wanted name 
    if(&*pPin == NULL) 
     hr = VFW_E_NOT_FOUND; 

    return hr; 
} 
0

を。入力の場合、通常は「入力」です。

関連する問題