두 필터 연결
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 항목에서는 DirectShow 필터를 연결하기 위한 몇 가지 도우미 함수를 보여 줍니다.
두 필터를 연결하려면 업스트림 필터에서 연결되지 않은 출력 핀과 다운스트림 필터에 연결되지 않은 입력 핀을 찾아야 합니다.
두 핀에 대한 포인터가 이미 있는 경우 IGraphBuilder::Connect 메서드를 호출하여 연결합니다. 핀이 서로 직접 연결할 수 없는 경우 IGraphBuilder::Connect 메서드는 추가 필터를 삽입하여 연결을 완료할 수 있습니다. 자세한 내용은 Intelligent Connect를 참조하세요.
필터에 대한 포인터가 있지만 핀은 없는 경우 IBaseFilter::EnumPins 메서드를 사용하여 핀을 찾아야 합니다. ( 핀 열거 참조) 이 항목의 도우미 함수는 이 기술을 보여 줍니다.
필터에 고정 출력
다음 함수는 출력 핀에 대한 포인터와 필터에 대한 포인터라는 두 개의 매개 변수를 사용합니다. 함수는 출력 핀을 필터에서 사용 가능한 첫 번째 입력 핀에 연결합니다.
// Connect output pin to filter.
HRESULT ConnectFilters(
IGraphBuilder *pGraph, // Filter Graph Manager.
IPin *pOut, // Output pin on the upstream filter.
IBaseFilter *pDest) // Downstream filter.
{
IPin *pIn = NULL;
// Find an input pin on the downstream filter.
HRESULT hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
if (SUCCEEDED(hr))
{
// Try to connect them.
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
}
return hr;
}
이 함수는 다음을 수행합니다.
- 함수를
FindUnconnectedPin
호출하여 연결되지 않은 입력 핀을 가져옵니다. 이 함수는 필터에서 연결되지 않은 핀 찾기 항목에 나와 있습니다. - IGraphBuilder::Connect를 호출하여 두 핀을 연결합니다.
입력 핀으로 필터링
다음 함수는 필터에 대한 포인터와 입력 핀에 대한 포인터를 사용합니다. 필터에서 사용 가능한 첫 번째 출력 핀에 입력 핀을 연결합니다.
// Connect filter to input pin.
HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IPin *pIn)
{
IPin *pOut = NULL;
// Find an output pin on the upstream filter.
HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
// Try to connect them.
hr = pGraph->Connect(pOut, pIn);
pOut->Release();
}
return hr;
}
필터로 필터링
세 번째 함수는 업스트림 필터에 대한 포인터와 다운스트림 필터에 대한 포인터를 사용하여 두 필터를 연결하려고 시도합니다.
// Connect filter to filter
HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest)
{
IPin *pOut = NULL;
// Find an output pin on the first filter.
HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
hr = ConnectFilters(pGraph, pOut, pDest);
pOut->Release();
}
return hr;
}
관련 항목