在筛选器上查找未连接的固定

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 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;
}

有关如何使用此函数的示例,请参阅 连接两个筛选器

枚举引脚

常规Graph-Building技术

ICaptureGraphBuilder2::FindPin