다음을 통해 공유


필터에서 연결되지 않은 핀 찾기

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 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