注册文件类型


Contents

匹配协议
匹配文件扩展名
匹配Check Bytes
加载Source Filter
本文介绍Filter Graph Manager 如何根据给定的文件名定位source filter,你可以使用这个机制去注册你自己的文件类型.一旦注册成功,那么无论何时调用IGraphBuilder::RenderFile 或 IGraphBuilder::AddSourceFilter,directshow都会自动找到正确的source filter。要根据文件名定位source filter,Filter Graph Manager按顺序做下面几件事情:

匹配协议
匹配文件扩展名
匹配文件内部的字节模式,叫做check bytes
匹配协议
协议名字(比如ftp或http)注册在HKEY_CLASSES_ROOT键下,结构如下:

HKEY_CLASSES_ROOT
   
        Source Filter =
        Extensions
            <.ext1> =
            <.ext2> =

如果文件名包含冒号(:),Filter Graph Manager尝试使用冒号以前的部分做为协议名。比如文件名"myprot://myfile.ext",就先找一个叫myprot的键,如果存在并且有一个叫Extensions的子键,那么在那个子键里面找匹配文件扩展名的条目,这个键值必须是string形式的guid,比如"{00000000-0000-0000-0000-000000000000}". 如果Filter Graph Manager在Extensions子键里面什么都没找到,他就找一个叫Source Filter的子键,也必须是string形式的guid。如果找到了guid,把他当作source filter的CLSID,并尝试加载该filter。如果匹配不到,那么使用File Source (URL)filter,这个filter直接把文件名当做一个URL。

这个算法中有两个例外:
为了排除驱动器字符,单字符的字符串不会被当做协议如果这个字符串是"file:"或者"file://",不会被当作协议
匹配文件扩展名
如果文件名中没有协议的话,查找有这个键的条目:HKEY_CLASSES_ROOTMedia TypeExtensions.ext(.ext是扩展名),如果存在,值Source Filter包含source filter的string形式的CLSID,这个键也可以拥有Media Type和Subtype值,分别指定major type和subtype的GUIDs。

匹配Check Bytes
也有一些文件类型可以靠指定位偏移处的特定位模式来识别。Filter Graph Manager在注册表中查找如下形式的键:
HKEY_CLASSES_ROOTMediaType{major type}{subtype}
其中major type和subtype就是定义该字节流的media type的GUIDs,每个键包括一个或多个定义了check bytes的子键,通常命名为1、2等等。另外还包括一个叫Source Filter的子键指定source filter的string形式的CLSID。check-byte子键是一些字符串包含一个或多个数字块:
offset,cb,mask,val
为了匹配该文件,Filter Graph Manager从第offset个字节开始读取cb个字节,然后和mask进行与操作,其结果再和val比较。mask和val的值是以16进制形式给出,A blank entry for mask is treated as a string of 1s of length cb,如果offset是负值则表示从文件末尾开始算。文件要匹配所有子键中的所有块才算是匹配了这个键。

比如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}"

第一个键对应major type MEDIATYPE_Stream,下面这个子键对应subtype MEDIATYPE_Midi,CLSID_AsyncReader子键的值就是CLSID_AsyncReader了,即 File Source (Async) filter的CLSID。每一个条目有多个块,所有块都必须匹配,看下面这个例子,前4个字节必须是0xAB, 0xCD, 0x12, 0x34,后4个字节必须是0xAB, 0xAB, 0x00, 0xAB:

0, 4, , ABCD1234,  -4, 4, , ABAB00AB

当然,单个media type下面也可以有多个条目,匹配任何一个就行了,这个方案可以允许一组可选的masks,必须.wav文件的RIFF头是可选的。

加载Source Filter
假设Filter Graph Manager已经为该文件找到了source filter,就会把他添加到graph中,在其中查询 IFileSourceFilter接口,并调用IFileSourceFilter::Load,并将文件名和从注册表中获得的media type作为参数传进去。如果Filter Graph Manager找不到的话,则默认加载Async File Source filter,并将media type设置成MEDIATYPE_Stream, MEDIASUBTYPE_None。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值