DirectShow DirectShow 의 사용법 DirectShow 의 기본 태스크 장치와 필터의 열거 필터 맵퍼의 사용법   [목차열람] [주소복사] [슬롯비우기]
필터 맵퍼의 사용법
 
Microsoft DirectX 9.0

필터 맵퍼의 사용법

필터 맵퍼는, 다양한 검색 조건에 근거해 필터를 열거하는 COM 개체이다. 필터 맵퍼는 System Device Enumerator (정도)만큼 효율적은 아니기 때문에, 특정의 카테고리의 필터가 필요한 경우는, System Device Enumerator 를 사용하는 쪽이 좋다. 그러나, 특정의 미디어 타입의 편성을 지원 하지만, 뚜렷한 카테고리에는 들어가지 않는 필터를 찾아내는 경우는, 필터 맵퍼를 사용할 필요가 있다. (그 예가, 렌더링 필터나 디코더 필터이다. )

필터 맵퍼는 IFilterMapper2 인터페이스를 공개한다. 필터를 검색하려면 ,IFilterMapper2::EnumMatchingFilters 메서드를 호출한다. 이 메서드는, 검색 조건을 정의하는 파라미터를 몇개인가 받아, 조건에 일치하는 필터의 열거자를 돌려준다. 이 열거자는 IEnumMoniker 인터페이스를 지원 해, 일치하는 각각의 필터에 일의의 모니카를 준다.

다음 예는 디지털 비디오 (DV) 입력을 받아, 1 개 이상의 출력 핀을 가지는 임의의 미디어 타입의 필터를 열거하고 있다. (DV 비디오 디코더 필터가 이 조건에 합치한다. )

IFilterMapper2 *pMapper = NULL;
IEnumMoniker *pEnum = NULL;

hr = CoCreateInstance(CLSID_FilterMapper2, 
    NULL, CLSCTX_INPROC, IID_IFilterMapper2, 
    (void **) &pMapper);

if (FAILED(hr))
{
    // 간결하게 하기 위한(해), 에러 처리는 생략 했다.
}

GUID arrayInTypes[2];
arrayInTypes[0] = MEDIATYPE_Video;
arrayInTypes[1] = MEDIASUBTYPE_dvsd;

hr = pMapper->EnumMatchingFilters(
        &pEnum,
        0,                  // 예약이 끝난 상태.
        TRUE,               // 완전 일치를 사용해?
        MERIT_DO_NOT_USE+1, // 최소 메리트.
        TRUE,               // 최저 1 개의 입력 핀?
        1,                  // 입력용 메이저 타입/서브 타입의 대의 수.
        arrayInTypes,       // 입력용 메이저 타입/서브 타입의 대의 배열.
        NULL,               // 입력 미디어.
        NULL,               // 입력 핀 카테고리.
        FALSE,              // 렌더러가 아니면 안돼?
        TRUE,               // 최저 1 개의 출력 핀?
        0,                  // 출력용 메이저 타입/서브 타입의 대의 수.
        NULL,               // 출력용 메이저 타입/서브 타입의 대의 배열.
        NULL,               // 출력 미디어.
        NULL);              // 출력 핀 카테고리.

// 모니카를 열거한다.
IMoniker *pMoniker;
ULONG cFetched;
while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
    IPropertyBag *pPropBag = NULL;
    hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, 
       (void **) &pPropBag);

    if (SUCCEEDED(hr))
    {
        // 필터의 프렌들리명을 얻어오려면, 다음의 처리를 실시한다.
        VARIANT varName;
        VariantInit(&varName);
        hr = pPropBag->Read(L"FriendlyName", &varName, 0);
        if (SUCCEEDED(hr))
        {
            // 하등의 방법으로 UI 에 이름을 표시한다.
        }
        VariantClear(&varName);

        // 필터의 인스턴스를 생성 하려면 , 다음의 처리를 실시한다.
        IBaseFilter *pFilter;
        hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**) &pFilter);
        // 여기서 그래프에 필터를 추가한다. 다음에 잊지 않고 pFilter 를 릴리즈 하는 것.
    
        // 클린 업.
        pPropBag->Release();
    }
    pMoniker->Release();
}

// 클린 업.
pMapper->Release();
pEnum->Release();

EnumMatchingFilters 메서드에는, 위에의예에 코멘트를 붙인 것처럼 상당한 수의 파라미터가 있다. 이 예로 중요한 것은 다음의 파라미터이다.

↑TOP