冲洗
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
当筛选器图正在运行时,任意数量的数据可以在关系图中移动。 其中一些可能处于队列中,等待传递。 有时,筛选器图需要尽快删除此挂起的数据,并将其替换为新数据。 例如,在 seek 命令之后,源筛选器从源中的新位置生成样本。 为了最大程度地减少延迟,下游筛选器应放弃在 seek 命令之前创建的任何样本。 放弃样本的过程称为 刷新。 它使图形在事件改变正常数据流时具有更高的响应能力。
拉取模型的处理方式与推送模型略有不同。 本文首先介绍推送模型;然后描述拉取模型的差异。
刷新分两个阶段进行。
- 首先,源筛选器在下游筛选器的输入引脚上调用 IPin::BeginFlush 。 下游筛选器开始拒绝来自上游的样本。 它还放弃它持有的任何样本,并将 BeginFlush 调用下游发送到下一个筛选器。
- 当源筛选器准备好发送新数据时,它会在输入引脚上调用 IPin::EndFlush 。 这会向下游筛选器发出信号,指示它可以接收新样本。 下游筛选器将 EndFlush 调用发送到下一个筛选器。
在 BeginFlush 方法中,输入引脚执行以下操作:
- 在下游输入引脚上调用 BeginFlush 。
- 拒绝流式传输数据的任何进一步调用,包括 Receive 和 EndOfStream。
- 取消阻止任何上游筛选器,这些筛选器正在等待筛选器分配器中的样本。 一些筛选器为此取消其分配器。
- 退出阻止流式处理的任何等待。 例如,暂停时呈现器筛选器会阻止。 在等待在正确的流时间呈现样本时,它们也会阻止。 筛选器必须取消阻止,以便传送和拒绝排队上游的示例。 此步骤可确保所有上游筛选器最终取消阻止。
在 EndFlush 方法中,输入引脚执行以下操作:
- 等待所有排队的样本被丢弃。
- 释放任何缓冲的数据。 此步骤有时可以在 BeginFlush 方法中执行。 但是, BeginFlush 与流式处理线程不同步。 筛选器不得在对 BeginFlush 的调用和 对 EndFlush 的调用之间再处理或缓冲任何数据。
- 清除任何挂起的EC_COMPLETE通知。
- 调用 EndFlush 下游。
此时,筛选器可以再次接受示例。 保证所有样本都比刷新更新。
在拉取模型中,分析器筛选器启动刷新,而不是源筛选器。 它不仅在下游筛选器上调用 IPin::BeginFlush 和 IPin::EndFlush,还会在源筛选器的输出引脚上调用 IAsyncReader::BeginFlush 和 IAsyncReader::EndFlush。 如果源筛选器具有挂起的读取请求,它将放弃这些请求。