AVStream 管道和线路

管道是共享公共分配器的一组 AVStream 筛选器。

下图显示了由三个 AVStream 筛选器组成的管道:源筛选器、 就地 转换筛选器和呈现器筛选器。

说明使用所有 avstream 筛选器的管道的示意图。

在此示例中, KSProxy (未显示) 选择了由图中的 Alloc 块表示的分配器。

AVStream 创建与源筛选器关联的内部请求程序对象。 在图中,请求者显示为 Req。微型驱动程序在 的 AllocatorFraming 成员 中指定KSPIN_DESCRIPTOR_EX 要分配给帧的内存类型和连续内存量。 因此,请求者从分配器获取帧并将其传递给线路中的下一个组件。

来自源筛选器的数据流入由另一个 AVStream 驱动程序实现的转换筛选器。

最后,数据流入由第三个 AVStream 筛选器实现的呈现器筛选器。

由于此图中的所有引脚都是 AVStream 引脚,因此 AVStream 使用自己的内部传输接口,而不是通过 IoCallDriver 发送 IRP,从而减少延迟并提高性能。

具体而言,例如,当应用程序导致图形转换为 KSSTATE_ACQUIRE (时,当用户单击“在 GraphEdit) 中播放 ”时,AVStream 将直接连接筛选器队列,如上所示。

因此,向下游发送的帧会返回到请求者,在呈现完成时可以回收这些帧。 此 AVStream 数据路径是一条 线路

考虑下图中所示的第二个示例,其中转换筛选器不是 AVStream 筛选器,但仍是内核模式筛选器。

说明使用非 avstream 内核模式转换筛选器的管道的示意图。

与第一个示例一样,此示例包含三个筛选器:AVStream 源、KS 转换 (这可能是直接使用 KS 的驱动程序,也可以是流类) 下的微型驱动程序,以及 AVStream 呈现器。

如第一张图示所示,引脚首先相互连接。 但是,当筛选器图转换为 KSSTATE_ACQUIRE时,内核流式处理 1.0 筛选器不支持 AVStream 传输接口。 因此,AVStream 不会绕过引脚;相反,它必须使用 I/O 在筛选器之间移动数据。

具体而言,当帧离开源筛选器的队列时,AVStream 会调用 IoCallDriver。 在此调用中, Irp 参数包含要从源的输出引脚传递到转换筛选器的帧。

当呈现器输入引脚收到 IRP 时,引脚会将 IRP 置于队列中。 当呈现器驱动程序完成帧时,它会将帧返回到呈现器输入引脚,如第二个示例中所示。

AVStream 现在调用 IoCompleteRequest 以返回帧上游。 源筛选器的输出引脚接收完成通知。 然后,微型驱动程序的 引脚进程回调 例程可以调用 KsStreamPointerUnlock 并将帧移回请求方以回收到线路中。

考虑最后一个示例,其中帧源处于用户模式。 (或者,最终帧目标可能处于用户模式。)

在下图中,内核模式 非就地 转换筛选器从用户模式 DirectShow 筛选器接收帧,并将转换后的帧发送到内核模式 AVStream 呈现器:

说明从用户模式源接收并发送到 avstream 呈现器帧的示意图。

当帧从用户模式到达时,AVStream 引脚对象将其置于输入管道部分的队列中。

非就地转换筛选器在内核模式下分配转换后的帧,然后使用第二个管道作为这些帧的线路。 由于呈现器是 AVStream 筛选器,因此 AVStream 会绕过引脚并使用 AVStream 传输接口将帧直接放置在呈现筛选器的队列中。

微型驱动程序可以通过调用 KsPinSubmitFrame 或 KsPinSubmitFrameMdl帧注入到线路中。 如果微型驱动程序使用此方法,AVStream 请求程序将接收帧作为这些调用的结果,而不是从内核模式分配器接收帧。