从IMediaFilter :: GetState返回VFW_S_CANT_CUE会产生任何负面后果

时间:2015-04-30 15:01:59

标签: directshow

此MSDN页面描述了某些过滤器是否需要在暂停状态下从GetState()返回VFW_S_CANT_CUE,如果过滤器在暂停时无法传送的可能性。这一切似乎都很清楚。看来如果对某个特定内容有任何疑问,那么最好返回VFW_S_CANT_CUE以确保Pause()不会挂起。

Delivering Samples

虽然返回VFW_S_CANT_CUE有什么缺点吗?如果图中的多路复用器或多路分解过滤器返回VFW_S_CANT_CUE,是否从暂停状态恢复流可能性能不佳或失去同步?

我已经继承了多个过滤器的源代码,这些过滤器有时会因为我不清楚的原因而返回VFW_S_CANT_CUE(例如,如果没有传送输出样本,则仅返回VFW_S_CANT_CUE)。我想知道总是返回VFW_S_CANT_CUE是否有任何风险。

2 个答案:

答案 0 :(得分:0)

返回VFW_S_CANT_CUE在停止/暂停转换期间禁用与渲染器的同步:过滤器图形管理器不等待渲染器报告它们已准备就绪,这在视频渲染器的情况下意味着它接收到横幅框架并呈现它(我想发送EC_PAUSED通知)。禁用同步意味着IMediaControl::Pause立即返回并且不等待横幅框架,实际来源可能更喜欢做什么。

我能想到的唯一缺点是,完成Pause调用后,您无法确定视频渲染器是否显示有效帧而不是黑度。我认为你所看到的VFW_S_CANT_CUE背后的不明原因是开发人员试图避免他在调试过程中偶然发现的死锁。

答案 1 :(得分:0)

如果过滤器以VFW_S_CANT_CUE方法(即 LiveSource )返回GetState(),则Pause()方法将不等待样本排队。因此,流时间在启动过滤器图表时开始。 否则,过滤器图表将等待,直到几个样本已排队。而且只有在流时间之后才会启动(因为调用了Pause()Run()方法之后)