尽管它是QueryPinInfo返回的ID,但无法通过名称/ ID在DirectShow过滤器中找到引脚

时间:2011-11-11 18:20:32

标签: delphi filter directshow dspack

在开发DirectShow应用程序时,我遇到了一个奇怪的问题。我正在使用带有DSPACK DirectShow组件库的Delphi 6。当我尝试使用TPinInfo.achName属性(_PinInfo)在过滤器中找到引脚时,其中一个IBaseFilter实例似乎无法识别它所拥有的引脚。 (注意,在这种情况下,由TSampleGrabber组件创建的IBaseFilter表现出这种奇怪的行为)。

以下代码示例中封装的事件序列如下:

  1. 在IBaseFilter实例中找到第一个可用的输入引脚。在下面的代码中,这是传递给testPinInfo()的引脚。
  2. 在返回的引脚上执行QueryPinInfo()以获取该信息。返回的信息将引脚的achName显示为“输入”。
  3. 尝试使用IBaseFilter.findPin()在同一个IBaseFilter实例中找到名为“Input”的引脚。
  4. 返回NIL,表示找不到该名称的引脚。在我看来,这是一个非常奇怪的条件(错误)。
  5. 有谁知道这种情况会导致什么样的情况?我不认为这是一个内存损坏问题,因为当我在调试器中检查它们时,所涉及的数据结构看起来很好。是否有可能某些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;
    

3 个答案:

答案 0 :(得分:1)

不要使用FindPin,你总是有更好的方法来做到这一点。使用感兴趣的介质类型查找所需方向的未连接引脚。如果您专门查找预览/捕获引脚,您始终可以选择使用IKsPropertySet接口明确识别所需的引脚。

答案 1 :(得分:1)

我遇到了类似的问题所以我制作了自己的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;
}

答案 2 :(得分:0)

对于FindPin,您需要相应的Id,请检查QueryId()。对于输入,它通常是" In"。