DirectShow DirectShow 의 사용법 DirectShow 필터의 개발 커스텀 파일 타입의 등록 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
여기에서는, 필터 그래프 매니저가 파일명을 지정해 어떻게 소스 필터를 찾아낼까에 임해서 설명한다. 이 기구를 사용해, 독자적인 커스텀 파일 타입을 등록할 수 있다. 파일 타입이 등록되면 애플리케이션이 IGraphBuilder::RenderFile 또는 IGraphBuilder::AddSourceFilter 를 호출할 때마다, DirectShow 는 올바른 소스 필터를 자동적으로 로드한다.
특정의 파일명으로부터 소스 필터를 찾아내기 (위해)때문에, 필터 그래프 매니저는 다음의 처리를 순서에 실시한다.
프로토콜
ftp,http 등의 프로토콜명은, 다음과 같은 구조를 가지는 HKEY_CLASSES_ROOT 키아래에 등록되어 있다.
HKEY_CLASSES_ROOT
<protocol>
Source Filter = <Source filter CLSID>
Extensions
<.ext1> = <Source filter CLSID>
<.ext2> = <Source filter CLSID>
파일명에 구두점 (':')이 있는 경우, 필터 그래프 매니저는 ':'의 전의 부분을 프로토콜명으로서 사용하려고 한다. 예를 들어, 이름이 "myprot://myfile.ext" 인 경우,myprot 라는 이름의 레지스트리 키를 검색한다. 이 키가 존재해,Extensions 라는 이름의 서브 키가 포함되어 있는 경우, 필터 그래프 매니저는 그 서브 키내에서 파일 확장자(extension)에 일치하는 엔트리를 검색한다. 키의 값은 캐릭터 라인 형식의 GUID 가 아니면 안된다. 예를 들어,"{00000000-0000-0000-0000-000000000000}" 이다. 필터 그래프 매니저가 Extensions 서브 키내에서 아무것도 찾아낼 수 없는 경우는,Source Filter 라는 이름의 서브 키를 검색한다. 이 값도 캐릭터 라인 형식의 GUID 가 아니면 안된다.
필터 그래프 매니저가 일치하는 GUID 를 찾아냈을 경우는, 이 값을 소스 필터의 CLSID 로서 사용해, 필터의 로드를 시도한다. 일치하는 값이 발견되지 않는 경우는,파일 소스 (URL) 필터를 사용한다. 이 필터는 파일명을 URL 로서 취급한다.
이 알고리즘에는 2 개의 예외가 있다.
파일 확장자(extension)
파일명에 프로토콜이 없는 경우, 필터 그래프 매니저는 레지스트리로 키 HKEY_CLASSES_ROOT\Media Type\Extensions\. ext\ 를 가지는 엔트리를 찾는다. . ext 는 파일 확장자(extension)이다. 이 키가 있는 경우, 값 Source Filter 에는 소스 필터의 CLSID 가 캐릭터 라인 형식에서 들어가 있다. 키는, 메이저 타입과 서브 타입의 GUID 를 나타내는 Media Type 및 Subtype 의 값이 들어가 있는 일도 있다.
체크 바이트
일부의 파일 타입은, 파일내의 특정의 바이트 오프셋(offset)로 생기는 비트의 특정 패턴에 의해 식별할 수 있다. 필터 그래프 매니저는 레지스트리로 다음의 형식을 가지는 키를 찾는다.
HKEY_CLASSES_ROOT\MediaType\{major type}\{subtype}
여기서 major type 와 subtype 는, 바이트 스트림의 미디어 타입을 정의하는 GUID 이다. 각 키는,1,2 ... (와)과 같이 이름이 붙은 1 개 이상의 서브 키가 있다. 이 값은 체크 바이트를 정의한다. 또,Source Filter 라는 이름의 서브 키가 있어, 소스 필터의 CLSID 를 캐릭터 라인 형식에서 지정한다. 체크 바이트 서브 키는, 다음과 같은 4 개의 값의 조가 1 개 이상 들어간 캐릭터 라인이다.
offset,cb,mask,val
일치하는 파일을 찾기 (위해)때문에, 필터 그래프 매니저는 바이트 번호 offset 로부터의 cb 바이트를 읽어낸다. 다음에,mask 의 값에 대해서 비트마다 AND 를 실행한다. 결과가 val 에 동일한 경우, 파일은 그 4 개의 값의 조의 값에 일치한다. 값 mask 와 val 는 16 진수로 나타난다. mask 엔트리가 비어있는 경우, 길이 cb 의 1 의 캐릭터 라인으로서 다루어진다. offset 가 부의 값인 경우는, 파일의 최후로부터의 오프셋(offset)를 나타낸다. 키에 일치시키기 위해서(때문에)는, 파일은 모든 서브 키에 있는 모든 4 개의 값의 조에 일치할 필요가 있다.
예를 들어, 레지스트리로 HKCR\Media Type 아래에 다음의 키가 있으면 상정한다.
{e436eb83-524f-11ce-9f53-0020af0ba770}
{7364696D-0000-0010-8000-00AA00389B71}
0 "0,4, , 52494646,8,4, , 524D4944"
1 "0,4, , 4D546864"
Source Filter "{E436EBB5-524F-11CE-9F53-0020AF0BA770}"
최초의 키는 메이저 타입 MEDIATYPE_Stream 에 대응한다. 그 아래의 서브 키는 서브 타입 MEDIATYPE_Midi 에 대응한다. Source Filter 서브 키의 값은,파일 소스 (비동기) 필터의 CLSID 를 나타내는 CLSID_AsyncReader 이다.
각 엔트리는 복수의 4 개의 값의 조를 가질 수 있다. 그것들 모든 것이 일치할 필요가 있다. 다음의 예에서는, 파일의 최초의 4 바이트는 0 xAB, 0 xCD, 0 x12, 0x34 가 아니면 안된다. 또, 파일의 마지막 4 바이트는 0 xAB, 0 xAB, 0 x00, 0xAB 가 아니면 안된다.
0, 4, , ABCD1234, -4, 4, , ABAB00AB
또, 1 개의 미디어 타입아래에 복수의 엔트리가 나타나는 일도 있다. 그 경우, 어느쪽이든 1 개에 일치하면 충분하다. 이 방식으로는, 대체 마스크세트를 사용할 수 있다. 예를 들어, RIFF 헤더가 있거나 않거나 한다 . wav 파일이다.
주 : 이 방식은 Microsoft® Win32® 의 GetClassFile 함수로 사용되는 것과 유사하다.
소스 필터의 로드
필터 그래프 매니저가 파일에 일치하는 소스 필터를 찾아냈다고 상정 하면, 그래프에 그 필터를 추가해, 필터에 IFileSourceFilter 인터페이스를 문의해IFileSourceFilter::Load 를 호출한다. Load 메서드의 인수는, 레지스트리로부터 결정할 수 있던 것처럼, 파일명과 미디어 타입이다.
필터 그래프 매니저가 레지스트리로 아무것도 찾아낼 수 없는 경우, 디폴트로 비동기 파일 소스 필터를 사용한다. 그 경우, 미디어 타입을 MEDIATYPE_Stream, MEDIASUBTYPE_None 로 설정한다.