状态转换
为了确保资源分配有序,只允许可能的内核流状态转换的子集。 下表列出了允许的转换以及 Stream 类微型驱动程序在此类转换期间通常执行的任务。
切换 | 说明 |
---|---|
停止以暂停 |
分配资源。 到 KSSTATE_PAUSE 转换完成后,读取 SRB 将排队。 |
暂停以运行 |
开始流式处理。 |
运行 以暂停 |
停止流式处理。 未完成的读取 SRB 保留在微型驱动程序维护的队列中。 |
暂停以停止 |
解除分配资源并完成所有未完成的读取 SRB。 尚未填充图像的 SRB 在 KSSTREAM_HEADER 结构的 DataUsed 成员中以零长度完成。 |
注意:在返回到KSSTATE_STOP状态之前,转换可以在KSSTATE_PAUSE和KSSTATE_RUN状态之间循环多次。 视频捕获微型驱动程序应预期转换,例如:
KSSTATE_STOP ->KSSTATE_ACQUIRE ->KSSTATE_PAUSE ->KSSTATE_RUN ->KSSTATE_PAUSE ->KSSTATE_RUN ->KSSTATE_PAUSE -> KSSTATE_STOP
当流处于 KSSTATE_STOP 状态时,微型驱动程序必须立即完成所有未完成的数据读取 SRB。
由于用户模式应用程序在流式处理时可能会意外结束,因此所有 Stream 类微型驱动程序必须随时接受并处理来自 Stream 类接口 的SRB_CLOSE_STREAM 请求。 在 Stream 类接口将SRB_CLOSE_STREAM发送到微型驱动程序之前,它会通过微型驱动程序的 HwCancelPacket 例程取消所有未完成的缓冲区。 请注意,在应用程序终止之前,无法将流状态设置为 KSSTATE_STOP 。
从 KSSTATE_PAUSE 到 KSSTATE_RUN 或 KSSTATE_RUN 到 KSSTATE_PAUSE 的转换时,不要更新 KS_FRAME_INFO、KS_VBI_FRAME_INFO 或KSPROPERTY_DROPPEDFRAMES_CURRENT_S 的 PictureNumber 或 DropCount 成员。 有关详细信息,请参阅 捕获视频。