1

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

事件序列,封装在下面的代码示例中是这样的:

  1. 在 IBaseFilter 实例中找到第一个可用的输入引脚。在下面的代码中,这是传递给 testPinInfo() 的引脚。
  2. 对返回的 pin 执行 QueryPinInfo() 以获取该信息。返回的信息将引脚的 achName 显示为“输入”。
  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;
4

3 回答 3

1

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

于 2011-11-14T09:15:17.147 回答
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;
}
于 2013-08-22T23:25:21.730 回答
0

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

于 2016-02-08T10:37:47.823 回答