AVStream 微型驱动程序可以使用 AVStream 类驱动程序功能将数据流拆分为多个副本,因为流通过给定的引脚。 如果驱动程序需要复制输入流来生成两个相同的输出流,则此拆分过程非常有用。
为此,请在引脚的 KSPIN_DESCRIPTOR_EX 结构的 Flags 成员中设置 KSPIN_FLAG_SPLITTER 。 在引脚上设置此标志时,该引脚充当自动拆分器。 AVStream 会自动复制拆分流所需的所有数据。
在 DirectX8.0 之后的版本中,KSPIN_FLAG_SPLITTER 标志适用于 以筛选器为中心 和 以引脚为中心 的滤镜上的引脚。 以前的版本仅支持以筛选器为中心的筛选器上的引脚的此标志。
下图显示了输入引脚将流拆分为两个输出引脚的筛选器的配置。 此输出引脚的下游筛选器 会原地更改数据。
帧到达输入引脚后会被放入输入队列中。 微型驱动程序仅与原始引脚的输入队列和输出队列交互。 AVStream 会自动将数据从第一个引脚的队列复制到第二个引脚的队列。
为简单起见,此图不显示向输出引脚提供帧的方式。 例如,若要向输出引脚提供帧,可能存在与每个队列关联的请求者和分配器,并属于此管道部分。 或者,帧可能来自下游筛选器。
在 KSFILTER_DISPATCH 结构中,微型驱动程序指定指向供应商提供的 AVStrMiniFilterProcess 回调例程的指针。 此回调例程是微型驱动程序接收一个指向 KSPROCESSPIN_INDEXENTRY 结构的指针,该结构包含下面描述的 KSPROCESSPIN 结构数组的位置。
此图显示了微型驱动程序如何区分进程引脚列表中的两个输出引脚:
在此关系图中,DB 引用 KSPROCESSPIN 结构的 DelegateBranch 成员,CS 引用 CopySource 成员。 输入引脚和第一个输出引脚的 DelegateBranch 和 CopySource 成员均为 NULL。 这表示微型驱动程序负责处理这些引脚上的帧。
第二个输出引脚却具有一个CopySource,它指向第一个输出引脚。 这表示第二个输出引脚位于与第一个输出引脚分开的管道中,AVStream 会自动将放置在第一个输出引脚队列中的任何数据复制到第二个输出引脚的队列中。
当两个输出引脚内置到同一管道中时,可能会出现更复杂的拆分器情况。 例如,只要下游筛选器不更改从这些引脚发送的数据,微型驱动程序就可以在同一管道中包含两个基于拆分器的输出引脚。 由于数据未修改,因此输出引脚被视为只读;这两个下游筛选器都接收相同的缓冲区。
此外,某些自动附加到拆分器引脚的下游筛选器可能会更改数据,而另一些筛选器则不会更改数据。
在这种情况下,筛选器布局可能类似于下图,它描绘了包含拆分输出引脚三个实例的筛选器:
A 和 B 被分配到同一个管道,因为下游过滤器不会改变数据;A 和 B 的下游过滤器接收到相同的缓冲区指针。
微型驱动程序仅与输入队列和单个输出队列交互。 AVStream 自动从 A/B 队列和 C 队列复制。 它还会创建一个拆分器对象,该对象通过引脚 A 和引脚 B 发送相同的数据帧(请注意流标头不同)。
KSPROCESSPIN 结构的数组如下所示:
微型驱动程序在正常情况下必须与之交互的唯一引脚是引脚A。
为了简化上述关系图,从关系图中省略了请求者和分配器。 关系图旨在仅演示帧拆分过程。