DirectShow DirectShow 의 사용법 DirectShow 필터의 개발 커스텀 파일 타입의 등록   [목차열람] [주소복사] [슬롯비우기]
커스텀 파일 타입의 등록
 
Microsoft DirectX 9.0

커스텀 파일 타입의 등록

여기에서는, 필터 그래프 매니저가 파일명을 지정해 어떻게 소스 필터를 찾아낼까에 임해서 설명한다. 이 기구를 사용해, 독자적인 커스텀 파일 타입을 등록할 수 있다. 파일 타입이 등록되면 애플리케이션이 IGraphBuilder::RenderFile 또는 IGraphBuilder::AddSourceFilter 를 호출할 때마다, DirectShow 는 올바른 소스 필터를 자동적으로 로드한다.

특정의 파일명으로부터 소스 필터를 찾아내기 (위해)때문에, 필터 그래프 매니저는 다음의 처리를 순서에 실시한다.

  1. 같은 프로토콜을 찾는다 (존재하는 경우).
  2. 같은 파일 확장자(extension)를 찾는다.
  3. "체크 바이트" 로 불리는 파일내의 바이트의 같은 패턴을 찾는다.

프로토콜

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 TypeSubtype 의 값이 들어가 있는 일도 있다.

체크 바이트

일부의 파일 타입은, 파일내의 특정의 바이트 오프셋(offset)로 생기는 비트의 특정 패턴에 의해 식별할 수 있다. 필터 그래프 매니저는 레지스트리로 다음의 형식을 가지는 키를 찾는다.

HKEY_CLASSES_ROOT\MediaType\{major type}\{subtype}

여기서 major typesubtype 는, 바이트 스트림의 미디어 타입을 정의하는 GUID 이다. 각 키는,1,2 ... (와)과 같이 이름이 붙은 1 개 이상의 서브 키가 있다. 이 값은 체크 바이트를 정의한다. 또,Source Filter 라는 이름의 서브 키가 있어, 소스 필터의 CLSID 를 캐릭터 라인 형식에서 지정한다. 체크 바이트 서브 키는, 다음과 같은 4 개의 값의 조가 1 개 이상 들어간 캐릭터 라인이다.

offset,cb,mask,val

일치하는 파일을 찾기 (위해)때문에, 필터 그래프 매니저는 바이트 번호 offset 로부터의 cb 바이트를 읽어낸다. 다음에,mask 의 값에 대해서 비트마다 AND 를 실행한다. 결과가 val 에 동일한 경우, 파일은 그 4 개의 값의 조의 값에 일치한다. 값 maskval 는 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 로 설정한다.

↑TOP