DirectShow DirectShow 의 사용법 DirectShow 의 기본 태스크 그래프 생성의 일반적 기법 2 개의 필터의 접속 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
다음의 함수는, 특정의 필터의 출력 핀을 다른 필터로 최초로 이용할 수 있는 입력 핀에 접속한다.
HRESULT ConnectFilters(
IGraphBuilder *pGraph, // 필터 그래프 매니저.
IPin *pOut, // 업 스트림 필터의 출력 핀.
IBaseFilter *pDest) // 다운 스트림 필터.
{
if ((pGraph == NULL) || (pOut == NULL) || (pDest == NULL))
{
return E_POINTER;
}
#ifdef debug
PIN_DIRECTION PinDir;
pOut->QueryDirection(&PinDir);
_ASSERTE(PinDir == PINDIR_OUTPUT);
#endif
// 다운 스트림 필터의 입력 핀을 검색한다.
IPin *pIn = 0;
HRESULT hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
if (FAILED(hr))
{
return hr;
}
// 접속을 시험한다.
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
return hr;
}
다운 스트림 필터로 이용 가능한 입력 핀을 얻어온다 모아 두어 이 함수에서는 GetUnconnectedPin 함수를 호출한다 (GetUnconnectedPin 함수에 대해서는, 「필터의 미접속 핀의 검색」을 참조). 다운 스트림 필터에 미접속의 입력 핀이 있는 경우, 함수는 IGraphBuilder::Connect 를 호출해 2 개의 핀을 접속한다. 핀 끼리를 직접 접속할 수 없는 경우, 접속을 완성시키기 (위해)때문에,Connect 메서드는 2 개의 핀의 사이에 필터를 더하는 일이 있다.
다음 예는 같은 함수를 overload 한 버전이다. 2 번째의 파라미터는 핀은 아니고, 필터의 포인터가 되어 있다. 함수는 최초의 필터를 2 번째의 필터에 접속한다.
HRESULT ConnectFilters(
IGraphBuilder *pGraph,
IBaseFilter *pSrc,
IBaseFilter *pDest)
{
if ((pGraph == NULL) || (pSrc == NULL) || (pDest == NULL))
{
return E_POINTER;
}
// 최초의 필터의 출력 핀을 검색한다.
IPin *pOut = 0;
HRESULT hr = GetUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
if (FAILED(hr))
{
return hr;
}
hr = ConnectFilters(pGraph, pOut, pDest);
pOut->Release();
return hr;
}
다음 예는 이 함수를 사용해 AVI Mux 필터를파일 라이터 필터에 접속한다. 또, 이 예에서는 AddFilterByCLSID 함수도 사용한다 (AddFilterByCLSID 함수에 대해서는, 「CLSID 에 의한 필터의 추가」를 참조).
IBaseFilter *pMux, *pWrite;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux);
if (SUCCEEDED(hr))
{
hr = AddFilterByCLSID(pGraph, CLSID_FileWriter, L"File Writer", &pWrite);
if (SUCCEEDED(hr))
{
hr = ConnectFilters(pGraph, pMux, pWrite);
/* IFileSinkFilter 를 사용해 파일명을 설정한다 (생략). */
pWrite->Release();
}
pMux->Release();
}
참조