AVStream 拆分器

当流通过给定引脚时,AVStream 微型驱动程序可以使用 AVStream 类驱动程序功能将数据流拆分为多个副本。 如果驱动程序需要复制输入流以生成两个相同的输出流,则此拆分过程非常有用。

为此,请在固定KSPIN_DESCRIPTOR_EX结构的 Flags 成员中设置 KSPIN_FLAG_SPLITTER 。 在引脚上设置此标志时,引脚将充当自动拆分器。 AVStream 自动复制拆分流所需的所有数据。

在 DirectX8.0 之后的版本中,KSPIN_FLAG_SPLITTER标志适用于 以筛选器为中心的 筛选器和 以引脚为中心的 筛选器上的引脚。 以前的版本仅对以筛选器为中心的筛选器上的固定支持此标志。

下图显示了筛选器的配置,其中输入引脚将流拆分为两个输出引脚。 此输出引脚的下游筛选器 会就地更改数据。

说明具有拆分器输出引脚 的 avstream 筛选器的示意图。

帧到达输入引脚并放置在输入队列中。 微型驱动程序仅与原始引脚的输入队列和输出队列交互。 AVStream 自动将数据从第一个引脚的队列复制到第二个引脚的队列。

为简单起见,此图不显示如何将帧提供给输出引脚。 例如,若要向输出引脚提供帧,可以有一个请求者和一个与每个队列关联的分配器,并属于此管道部分。 或者,帧可能来自下游筛选器。

KSFILTER_DISPATCH 结构中,微型驱动程序指定指向供应商提供的 AVStrMiniFilterProcess 回调例程的指针。 此回调例程是微型驱动程序接收指向包含下面描述的 KSPROCESSPIN 结构数组的KSPROCESSPIN_INDEXENTRY结构的指针的位置。

此图显示了微型驱动程序如何区分进程引脚列表中的两个输出引脚:

两个拆分引脚的进程引脚表的示意图。

在此图中,DB 引用 KSPROCESSPIN 结构的 DelegateBranch 成员,CS 引用 CopySource 成员。 输入引脚和第一个输出引脚的 DelegateBranchCopySource 成员均为 NULL。 这表示微型驱动程序负责处理这些图钉上的帧。

但是,第二个输出引脚具有指向第一个输出引脚的 CopySource 。 这表示第二个输出引脚位于与第一个输出引脚不同的管道中,AVStream 会自动将放置在第一个输出引脚队列中的任何数据复制到第二个输出引脚的队列中。

当两个输出引脚内置到同一管道中时,可能会出现更复杂的拆分器情况。 例如,只要下游筛选器不更改从这些引脚发送的数据,微型驱动程序就可以在同一管道中包含两个基于拆分器的输出引脚。 由于未修改数据,因此输出引脚被视为只读;两个下游筛选器接收相同的缓冲区。

此外,某些自动附加到拆分器引脚的下游筛选器可能会更改数据,而其他筛选器则不会更改数据。

在这种情况下,筛选器布局可能类似于下图,该图描绘了包含拆分输出引脚的三个实例的筛选器:

说明具有三个拆分输出引脚 的 avstream 筛选器的示意图。

引脚 A 和 B 分配给同一管道,因为下游筛选器不会更改数据;A 和 B 下游的筛选器接收相同的缓冲区指针。

微型驱动程序仅与输入队列和单个输出队列交互。 AVStream 自动从 A/B 队列和 C 队列复制。 它还创建一个拆分器对象,该拆分器对象通过引脚 A 和引脚 B 发送相同的数据帧 (请注意,流标头) 不同。

KSPROCESSPIN 结构的数组如下所示:

三个拆分输出引脚的进程引脚表的示意图。

在正常情况下,微型驱动程序必须与之交互的唯一引脚是引脚 A。

为了简化上述关系图,从关系图中省略了请求者和分配器。 这些关系图旨在仅演示帧拆分过程。