DirectShow DirectShow 의 사용법 DirectShow 의 기본 태스크 그래프 생성의 일반적 기법 2 개의 필터의 접속   [목차열람] [주소복사] [슬롯비우기]
2 개의 필터의 접속
 
Microsoft DirectX 9.0

2 개의 필터의 접속

다음의 함수는, 특정의 필터의 출력 핀을 다른 필터로 최초로 이용할 수 있는 입력 핀에 접속한다.

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();
}

참조

↑TOP