缓存 DirectShow 的引脚信息

应用程序可以使用 DirectShow IFilterMapper2 接口自动搜索满足特定条件的筛选器。 此应用程序可以使用 IFilterMapper2 返回的建议筛选器列表来自动生成包含接收和呈现电视信号的筛选器的筛选器图。 为了快速查找满足指定条件的筛选器, IFilterMapper2 使用有关筛选器的信息以及以前输入到缓存中的固定。 以下段落中的讨论将此缓存称为 固定数据缓存

引脚数据缓存中包含的信息包括筛选器可以公开的每个引脚的媒体和媒体类型的列表。 IFilterMapper2 使用此缓存信息来确定可能的筛选器是否可以连接到图中已存在的筛选器上的引脚。 进行此确定可以消除创建筛选器实例的开销,仅确定由于介质或媒体类型不匹配而阻止连接到筛选器。 如果筛选器的固定数据缓存不是最新的,则筛选器可能会被错误地排除为筛选器图中的连接候选项。

每当 BDA 微型驱动程序确定 DirectShow 使用的引脚数据缓存不是最新的时,该微型驱动程序必须更新引脚数据缓存,以便微型驱动程序 BDA 组件的 BDA 筛选器实例的引脚信息在筛选器图中准确公开。 BDA 微型驱动程序更新 DirectShow 的固定数据缓存,如以下方案所述:

  • 当微型驱动程序最初创建 BDA 筛选器实例时,根据该微型驱动程序在用户模式下将 BDA 筛选器作为 DirectShow 筛选器提供的方式,可能需要或不需要 BDA 微型驱动程序来更新 DirectShow 的引脚数据缓存。 BDA 微型驱动程序的信息 (INF) 文件指定微型驱动程序用于将其 BDA 筛选器显示为 DirectShow 筛选器的机制。

    BDA 微型驱动程序通常使用 内核流式处理 (KS) 代理模块 (Ksproxy.ax) 将其 BDA 筛选器显示为 DirectShow 筛选器。 KS 代理自动更新 DirectShow 的固定数据缓存,以在最初创建这些筛选器的实例时公开 BDA 筛选器的引脚信息。 因此,使用 KS 代理的 BDA 微型驱动程序在最初创建筛选器实例时,不需要执行任何操作来更新 DirectShow 的引脚数据缓存。 如果 BDA 筛选器通过 KS 代理向用户模式公开,则在筛选器的创建调度例程返回后,缓存的信息会自动包括筛选器实例上存在的引脚工厂的媒体和媒体类型。

    某些 BDA 微型驱动程序不使用 KS 代理将其 BDA 筛选器显示为 DirectShow 筛选器。 例如,实现 BDA 筛选器以接收或处理模拟电视信号的 BDA 接收器微型驱动程序使用 KSTVTune.axKSXBar.ax 模块将这些 BDA 筛选器呈现为 DirectShow 筛选器。 由于这些模块不使用标准 KS 代理接口方法来更新 DirectShow 的引脚数据缓存,因此,当这些微型驱动程序最初创建筛选器实例时,这些类型 BDA 筛选器的 BDA 微型驱动程序必须更新 DirectShow 的引脚数据缓存。 为了确保在创建这些筛选器的实例时更新 DirectShow 的引脚数据缓存,BDA 微型驱动程序在筛选器的 create dispatch 例程的实现中调用 BdaInitFilter 函数后立即调用 BdaFilterFactoryUpdateCacheData 函数。 在此调用中,微型驱动程序传递固定信息以更新筛选器上的所有初始固定。

  • 筛选器的创建调度例程完成后,可以在 BDA 筛选器上动态创建引脚。 如果最初创建的 BDA 筛选器实例未公开 BDA 筛选器的模板拓扑中列出的所有引脚的实例 (BDA_FILTER_TEMPLATE) ,则 BDA 微型驱动程序必须调用 BdaFilterFactoryUpdateCacheData ,以强制有关筛选器模板拓扑中列出的所有引脚的信息。

注意 更新 DirectShow 的固定数据缓存会产生重大开销,因为它涉及并修改注册表。 此外,更新 DirectShow 的固定数据缓存会影响 DirectShow 自动生成筛选器图所需的时间。 因此,仅当 BDA 微型驱动程序确定 DirectShow 使用的固定数据缓存不是最新时,才应为所有可能的引脚调用 BdaFilterFactoryUpdateCacheData

如果可能,每当发生驱动程序、固件或硬件更新时,BDA 微型驱动程序都应调用 BdaFilterFactoryUpdateCacheData