【问题标题】:Does returning VFW_S_CANT_CUE from IMediaFilter::GetState have any negative consequences从 IMediaFilter::GetState 返回 VFW_S_CANT_CUE 是否有任何负面影响
【发布时间】:2015-04-30 15:01:59
【问题描述】:

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

Delivering Samples

返回 VFW_S_CANT_CUE 有什么缺点吗?如果图中的 mux 或 demux 过滤器返回 VFW_S_CANT_CUE,从暂停状态恢复流式传输是否可能会表现不佳或失去同步?

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

【问题讨论】:

    标签: directshow


    【解决方案1】:

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

    我能想到的唯一缺点是完成Pause 调用后,您无法确定视频渲染器呈现的是有效帧而不是黑度。我想您所看到的VFW_S_CANT_CUE 背后的不清楚的原因是开发人员试图避免他在调试期间偶然发现的死锁。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        • 1970-01-01
        • 2023-02-23
        • 1970-01-01
        • 2014-07-17
        • 1970-01-01
        相关资源
        最近更新 更多