在开发DirectShow应用程序时,我遇到了一个奇怪的问题。我正在使用带有DSPACK DirectShow组件库的Delphi 6。当我尝试使用TPinInfo.achName属性(_PinInfo)在过滤器中找到引脚时,其中一个IBaseFilter实例似乎无法识别它所拥有的引脚。 (注意,在这种情况下,由TSampleGrabber组件创建的IBaseFilter表现出这种奇怪的行为)。
以下代码示例中封装的事件序列如下:
有谁知道这种情况会导致什么样的情况?我不认为这是一个内存损坏问题,因为当我在调试器中检查它们时,所涉及的数据结构看起来很好。是否有可能某些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;
答案 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"。