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