在筛选器上查找未连接的固定
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
本主题介绍如何在筛选器上查找未连接的引脚。 连接筛选器时,查找未连接的引脚非常有用。
在典型的 DirectShow 图形生成方案中,需要与特定引脚方向(输入或输出)匹配的未连接引脚。 例如,连接两个筛选器时,将输出引脚从一个筛选器连接到另一个筛选器的输入引脚。 在连接两个引脚之前,两个引脚都必须未连接。
首先,我们需要一个函数来测试引脚是否连接到另一个引脚。 此函数调用 IPin::ConnectedTo 方法来测试引脚是否已连接到另一个引脚。
// Query whether a pin is connected to another pin.
//
// Note: This function does not return a pointer to the connected pin.
HRESULT IsPinConnected(IPin *pPin, BOOL *pResult)
{
IPin *pTmp = NULL;
HRESULT hr = pPin->ConnectedTo(&pTmp);
if (SUCCEEDED(hr))
{
*pResult = TRUE;
}
else if (hr == VFW_E_NOT_CONNECTED)
{
// The pin is not connected. This is not an error for our purposes.
*pResult = FALSE;
hr = S_OK;
}
SafeRelease(&pTmp);
return hr;
}
注意
此示例使用 SafeRelease 函数释放接口指针。
接下来,我们需要一个函数,用于测试引脚是否与指定的引脚方向匹配。 此函数调用 IPin::QueryDirection 方法以获取引脚方向。
// Query whether a pin has a specified direction (input / output)
HRESULT IsPinDirection(IPin *pPin, PIN_DIRECTION dir, BOOL *pResult)
{
PIN_DIRECTION pinDir;
HRESULT hr = pPin->QueryDirection(&pinDir);
if (SUCCEEDED(hr))
{
*pResult = (pinDir == dir);
}
return hr;
}
下一个函数按条件(引脚方向和连接状态)匹配引脚。
// Match a pin by pin direction and connection state.
HRESULT MatchPin(IPin *pPin, PIN_DIRECTION direction, BOOL bShouldBeConnected, BOOL *pResult)
{
assert(pResult != NULL);
BOOL bMatch = FALSE;
BOOL bIsConnected = FALSE;
HRESULT hr = IsPinConnected(pPin, &bIsConnected);
if (SUCCEEDED(hr))
{
if (bIsConnected == bShouldBeConnected)
{
hr = IsPinDirection(pPin, direction, &bMatch);
}
}
if (SUCCEEDED(hr))
{
*pResult = bMatch;
}
return hr;
}
最后,以下函数使用 IEnumPins 接口循环访问筛选器上的引脚。 调用方指定所需的引脚方向。 对于每个引脚,函数调用 MatchPin
来测试引脚是否匹配。 如果方向匹配且引脚未连接,该函数将返回指向 ppPin 参数中匹配引脚的指针。
// Return the first unconnected input pin or output pin.
HRESULT FindUnconnectedPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{
IEnumPins *pEnum = NULL;
IPin *pPin = NULL;
BOOL bFound = FALSE;
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
goto done;
}
while (S_OK == pEnum->Next(1, &pPin, NULL))
{
hr = MatchPin(pPin, PinDir, FALSE, &bFound);
if (FAILED(hr))
{
goto done;
}
if (bFound)
{
*ppPin = pPin;
(*ppPin)->AddRef();
break;
}
SafeRelease(&pPin);
}
if (!bFound)
{
hr = VFW_E_NOT_FOUND;
}
done:
SafeRelease(&pPin);
SafeRelease(&pEnum);
return hr;
}
有关如何使用此函数的示例,请参阅 连接两个筛选器。
相关主题