Find an Unconnected Pin on a Filter
2018-03-26 15:35
459 查看
在典型的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;
} 接下来,我们需要一个测试引脚是否与指定引脚方向匹配的函数。 该函数调用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;
}
首先,我们需要一个测试引脚是否连接到另一个引脚的函数。 该函数调用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;
} 接下来,我们需要一个测试引脚是否与指定引脚方向匹配的函数。 该函数调用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;
}
相关文章推荐
- 9. 13. 6. Stack基本用法 To find out if an element is on the stack: the search() method
- [Ramda] Filter an Array Based on Multiple Predicates with Ramda's allPass Function
- HOW TO: Find the Problem Exception Stack When You Receive an UnhandledExceptionFilter Call in the St
- An Experimental Survey on Correlation Filter-based Tracking
- An Experimental Survey on Correlation Filter-based Tracking
- 基于相关滤波跟踪原理 from An Experimental Survey on Correlation Filter-based Tracking
- HOW TO: Find the Problem Exception Stack When You Receive an UnhandledExceptionFilter Call in the St
- How to Find Blocking Session for Mutex Wait Event cursor: pin S wait on X
- [ios] where to find your iphone app on your mac during debuging
- Algorithm to find square root of an algorithm
- An internal error occurred during: "Launching spring on Tomcat 6.x".
- 虚拟机virtualbox:Could not find an open hard disk with UUID {36844126-9e88-4686-9858-2d1a0568f53c}.
- 关于对jQuery中find、filter、children的理解
- An Introduction to SELinux on CentOS 7 – Part 1: Basic Concepts
- leetcode编程记录15 #442 Find All Duplicates in an Array
- Error (169008): Can't turn on open-drain option for differential I/O pin
- IE8与Visual Studio“打架” (Error: An add-on for this website failed to run.)
- How to Build Android Applications Based on FFmpeg by An Example
- 处理cursor: pin S wait on X等待事件
- 查找IFileSourceFilter上的Pin 分类: DirectX 2014-10-27 18:19 433人阅读 评论(0) 收藏