我们的代码转换/ DSP项目正在使用多程序MPEG2-TS流作为输入。
DirectShow图的转码分支端点是 GDCL Mpeg4Mux 过滤器的一个实例。
基本流 可能会即时更改PID值 (我不知道其原因,但确实如此)。
为了响应这些动态变化,我们正在解析MPEG-2多路分配器的PSI输出,并指示多路分配器即时重新映射输出引脚的PID值。 无论何时发生这种情况,解复用器都会在下游子图上触发BeginFlush()
调用。
现在,这是MuxInput::BeginFlush()
和MuxInput::EndFlush()
方法的实现(MuxInput
是Mpeg4Mux
过滤器的输入引脚类):
STDMETHODIMP
MuxInput::BeginFlush()
{
#if defined(ALAXINFODIRECTSHOWSPY_AVAILABLE)
if(m_pMediaSampleTrace)
m_pMediaSampleTrace->RegisterComment((IBaseFilter*) m_pFilter, (USHORT*) Name(), (USHORT*) L"Begin Flush", 0);
#endif // defined(ALAXINFODIRECTSHOWSPY_AVAILABLE)
// ensure no more data accepted, and queued
// data is discarded, so no threads are blocking
if (m_pTrack)
{
m_pTrack->Stop(true);
}
return S_OK;
}
STDMETHODIMP
MuxInput::EndFlush()
{
#if defined(ALAXINFODIRECTSHOWSPY_AVAILABLE)
if(m_pMediaSampleTrace)
m_pMediaSampleTrace->RegisterComment((IBaseFilter*) m_pFilter, (USHORT*) Name(), (USHORT*) L"End Flush", 0);
#endif // defined(ALAXINFODIRECTSHOWSPY_AVAILABLE)
// we don't re-enable writing -- we support only
// one contiguous sequence in a file.
return S_OK;
}
如您所见,刷新是一次性操作,因为EndFlush()
不支持在轨道上恢复输出写操作。
不幸的是,一旦重新映射了PID,复用器将默默拒绝任何进一步的输入。调试显示它正在拒绝样本,因为它处于“已停止”内部状态。
现在,我可能可以增强Muxer接口,以便提供一种通知方法,该通知方法通知过滤器即将到来的PID,它应该忽略下一个刷新调用,,但是我担心我可能会产生死锁,因为媒体样本可以由过滤器保存,并且冲洗操作应该释放所有锁定并释放所有保留的样本。
此外,对于多路分配器正在重置其内部状态并强制进行下游冲洗的情况,我应该如何应对?