前导和尾随边缘流指针
默认情况下,每个 AVStream 队列都包含一个 前导边缘 流指针。 当新帧到达队列时,前导边缘指向它们。 具体而言,前导边缘最初指向到达队列的第一帧,在微型驱动程序移动队列之前不会移动。 AVStream 创建前导边缘,该边缘随后在队列的生存期内存在。 微型驱动程序可以使用 Microsoft 提供的函数操作前导边缘。
当新帧到达队列时,AVStream 将前导边缘设置为指向此帧,前提是前导边缘尚未指向帧。
若要获取指向前导流指针的指针,微型驱动程序调用 KsPinGetLeadingEdgeStreamPointer。
微型驱动程序负责在除下表汇总的两种情况外的所有情况下都提升领先优势。
场景 | AVStream 的行为 |
---|---|
帧到达之前为空的队列。 |
AVStream 将前导边缘设置为指向此帧。 |
前导边缘指向框架。 取消与此帧对应的 IRP。 |
AVStream 领先优势。 前边缘现在指向较新的框架。 |
有关推进 流指针 的详细信息,请参阅流指针简介。
指定尾随边缘流指针
微型驱动程序可以指定队列具有尾随边缘流指针。 尾边通常表示微型驱动程序感兴趣的最旧帧。 若要指定尾边,请在相关KSPIN_DESCRIPTOR_EX结构的 Flags 成员中设置 KSPIN_FLAG_DISTINCT_TRAILING_EDGE标志 。 然后调用 KsPinGetTrailingEdgeStreamPointer 以获取指向尾随边缘流指针的指针。
当尾边前进时,它之前指向的帧上的引用计数将下降到零,帧完成。 如果帧是其 IRP 中包含的最后一个帧,则接收器引脚会向调用方完成 IRP;源引脚将 IRP 发送到它所连接的引脚。
维护框架窗口
由于 流指针简介中所述的帧引用计数规则,前导边缘和尾部之间的帧将保留在队列中,直到它被取消,即使该帧不是由流指针引用的。 因此,微型驱动程序可以使用前导和尾随边缘指针来维护多个连续帧的工作窗口。 例如,窗口中的帧可能正在等待处理或填充。
在下图中,最旧的帧位于底部。 新帧到达顶部。 每个帧中的数字是该帧的引用计数。 当流指针向前移动时,它们在此关系图中向上移动。
最左侧的队列显示微型驱动程序如何使用尾随边缘创建一组工作帧。 尽管没有流指针引用这些帧,但前导边缘和尾边之间的每个帧都有一个引用计数。
中间队列是 克隆流指针的一个示例。 驱动程序已重复克隆并提升领先优势,如 AVStream DMA 服务中的固定过程步骤中所述。
最右侧的队列显示微型驱动程序如何使用流指针克隆来维护尾随边缘后面的帧的引用计数。