主时钟

微型驱动程序可以将流同步到其他微型驱动程序创建的时钟;多个流可以同步到一个时钟。 如果引脚使用或生成此类 主时钟,微型驱动程序应支持 KSPROPERTY_STREAM_MASTERCLOCK。 客户端还可以使用此属性来设置引脚的主时钟。 执行呈现和捕获操作的引脚经常使用主时钟。 微型驱动程序负责在终止时释放时钟引用。

主时钟的接口是支持方法、属性和事件的文件对象。

针对文件对象的所有查询仅在PASSIVE_LEVEL可用。 但是,通过 DISPATCH_LEVEL 提供的直接函数调用指针也支持时钟位置查询,只要文件对象有效,该指针就有效。 此直接调用必须作为上下文参数传递给时钟的文件对象。

文件句柄是通过筛选器引脚实例上的创建请求获取的,就像通过IRP_MJ_CREATE创建引脚一样。 请求会导致创建文件句柄,就像创建引脚的文件句柄一样,其中包含其自己的上下文信息。 然后,此文件句柄将传递回调用方,并可用于设置内核模式筛选器的主时钟。 在为筛选器分配图形的主时钟时,引脚实例可以查询父文件对象以确定它是否拥有主时钟。

当为筛选器提供此主时钟的文件句柄时,该筛选器随后可用于查询属性。 如果主时钟基于内核模式筛选器,它必须支持一个接口来查询主时钟内核模式部分的文件句柄。 如果接口不受支持,则假定时钟基于用户模式,并且内核模式筛选器无法同步到它。

请求主时钟句柄的 DirectShow 代理筛选器随后将其传递给其基础内核模式筛选器文件句柄。 内核模式筛选器引用基础文件对象。 如果筛选器已具有主时钟,它将取消引用文件对象并使用新句柄。 为此,筛选器必须处于 “停止”状态

主时钟对象上的物理时间通常基于硬件。 如果显示主时钟的筛选器没有物理时钟,则流时间会根据所呈现数据的时间戳进行。 在这种情况下,时间戳可能会因缺少数据而停止。

主时钟后面的物理时间可能是远程的,在这种情况下,本地代理负责提供准确的读数。 例如,代理负责补偿 1394 连接中的延迟,或平均跨网络延迟。 此外,如果其他某个内核筛选器是同一 1394 总线上第二个设备的代理,则这两个设备可能会协商一种与主时钟交互的专用方法。 在这种情况下,设备必须使用专用接口来确定时钟类型,以便验证兼容性。