Visual c++ 如何在具有多个输入引脚的DirectShow筛选器中正确支持刷新
对于具有单个输入管脚和一个或多个输出管脚的滤波器,给出了和的建议实现 对于具有多个输入引脚的过滤器,应如何安全地扩展此功能?是应该为每个输入管脚调用DeliverBeginFlush和DeliverEndFlush,还是为接收BeginFlush/EndFlush的第一个或最后一个输入管脚调用DeliverBeginFlush?输入引脚之间的精确操作顺序重要吗?是否允许一个输入引脚同时完成BeginFlush和EndFlush,并在其他引脚接收BeginFlush和/或EndFlush之前接收新样本?在这种情况下还有其他考虑因素或问题吗 目前,我的带有多个输入管脚的过滤器有时在EndFlush完成后从上游接收过时的排队样本,我正在尝试诊断错误是在我的过滤器中还是在更上游。输入引脚将样本排队等待另一个生成输出样本的线程,因此我确实利用m_hSomeEventThatReceiveNeedsToWaitOn技术来解除对执行输出处理的线程的阻塞Visual c++ 如何在具有多个输入引脚的DirectShow筛选器中正确支持刷新,visual-c++,directshow,Visual C++,Directshow,对于具有单个输入管脚和一个或多个输出管脚的滤波器,给出了和的建议实现 对于具有多个输入引脚的过滤器,应如何安全地扩展此功能?是应该为每个输入管脚调用DeliverBeginFlush和DeliverEndFlush,还是为接收BeginFlush/EndFlush的第一个或最后一个输入管脚调用DeliverBeginFlush?输入引脚之间的精确操作顺序重要吗?是否允许一个输入引脚同时完成BeginFlush和EndFlush,并在其他引脚接收BeginFlush和/或EndFlush之前接收新
HRESULT CMyInputPin::BeginFlush()
{
CAutoLock lock_it(m_pLock);
// First, make sure the Receive method will fail from now on.
HRESULT hr = CBaseInputPin::BeginFlush();
// Force downstream filters to release samples. If our Receive method
// is blocked in GetBuffer or Deliver, this will unblock it.
for (each output pin)
{
hr = pOutputPin->DeliverBeginFlush();
}
// Unblock our Receive method if it is waiting on an event.
SetEvent(m_hSomeEventThatReceiveNeedsToWaitOn);
// At this point, the Receive method can't be blocked. Make sure
// it finishes, by taking the streaming lock. (Not necessary if this
// is the last step.)
{
CAutoLock lock_2(&m_csReceive);
/* Now it's safe to do anything that would crash or hang
if Receive were executing. */
}
return hr;
}
HRESULT CMyInputPin::EndFlush()
{
CAutoLock lock_it(m_pLock);
for (each output pin)
hr = pOutputPin->DeliverEndFlush();
return CBaseInputPin::EndFlush();
}
在我的代码中,我只是默默地为我收到的每一个代码向下游发送一个刷新。它似乎没有问题
HRESULT JoinFilterInputPin::BeginFlush()
{
JoinFilter* filter = (JoinFilter*)m_pFilter;
CAutoLock lock(m_pLock);
CBaseInputPin::BeginFlush();
filter->output->DeliverBeginFlush();
return S_OK;
}
HRESULT JoinFilterInputPin::EndFlush()
{
JoinFilter* filter = (JoinFilter*)m_pFilter;
CAutoLock lock(m_pLock);
filter->output->DeliverEndFlush();
return CBaseInputPin::EndFlush();
}
我想说的是,如果您在
EndFlush
之后收到延迟的样本,并且它们应该已经被刷新了,那么上游就有问题了。谢谢,Roman。那也是我的直觉。我觉得有点不自信,因为做同样工作的第三方混合过滤器很少复制错误。也许他们正在做一些清理样本数据的工作,以移除散乱的样本。感谢Ansis,知道做简单的事情是有用的(至少在你的情况下)。