过滤器在未被搜索的图形中接收BeginFlush和EndFlush是否正常?

时间:2014-10-27 17:38:35

标签: directshow

我正在开发一种不支持搜索的自定义多路复用过滤器 - 因为它不是设计用于也不需要。

当我将它连接到Main Concept / Rovi MP4多路分解器和Main Concept广播MP4 / AVC解码器的下游时,我的过滤器在调用IBaseFilter :: Pause之后但在第一个样本传送之前接收到对BeginFlush,EndFlush,NewSegment的调用。不调用SetPositions。我已经将BeginFlush缩小到了mp4 demux过滤器。

这是正确的DirectShow行为吗?我理解BeginFlush / EndFlush在搜索中扮演的角色,但在流媒体开始时是否安全或允许它们调用它们?在寻求操作的上下文之外的Microsoft文档中,我没有看到太多对BeginFlush / EndFlush的引用。在调用IMediaControl :: Run时看到对BeginFlush的调用(参见下面的调用堆栈),而不是主机程序通过调用SetPositions(或类似的)来寻找图形的结果。

丢弃在第一个样本之前到达的BeginFlush / EndFlush请求是否是合理的过滤器解决方法?据推测,有许多过滤器不支持搜索,因此不支持BeginFlush / EndFlush。

 quartz.dll!CFilterGraph::Pause()  + 0x109 bytes    
 quartz.dll!CFGControl::Cue()  + 0x1b bytes    
 quartz.dll!CFGControl::CueThenRun()  + 0x12 bytes    
 quartz.dll!CFGControl::CImplMediaControl::StepRun()  + 0x59 bytes    
 quartz.dll!CFGControl::CImplMediaControl::Run()  + 0x2d bytes    

1 个答案:

答案 0 :(得分:1)

也许"纠正"这里不是正确的词,它是一种合法行为吗?我觉得是这样的。解复用器在开始流式传输之前刷新,为什么不呢。可能会发生这种情况,具体是它们如何处理搜索,即在从清洁点发送之前它们是冲洗的,即使在初始发送时它们也会这样做。

法拉盛不仅仅是寻求能力的一部分。它是一个过滤器应该支持和实现的核心功能,那么为什么不在收到请求时才刷新?或者只是忽略你什么都没有冲洗?我会说,如果它产生了一种问题,那么多路复用器可能会以错误的方式执行其他操作,因为刷新请求不是看起来破坏的东西。我认为将它放在流媒体中间是合法的,让我们说一下,无论出于何种原因,源或解码器决定在下游传输数据。