GDCL Mp4mux过滤器BeginFlush()是一次操作。我可以解决这个限制吗?

时间:2019-05-14 04:53:50

标签: c++ mp4 directshow

我们的代码转换/ DSP项目正在使用多程序MPEG2-TS流作为输入。

DirectShow图的转码分支端点是 GDCL Mpeg4Mux 过滤器的一个实例。

基本流 可能会即时更改PID值 (我不知道其原因,但确实如此)。

为了响应这些动态变化,我们正在解析MPEG-2多路分配器的PSI输出,并指示多路分配器即时重新映射输出引脚的PID值。 无论何时发生这种情况,解复用器都会在下游子图上触发BeginFlush()调用。

现在,这是MuxInput::BeginFlush()MuxInput::EndFlush()方法的实现(MuxInputMpeg4Mux过滤器的输入引脚类):

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,它应该忽略下一个刷新调用,,但是我担心我可能会产生死锁,因为媒体样本可以由过滤器保存,并且冲洗操作应该释放所有锁定并释放所有保留的样本。

此外,对于多路分配器正在重置其内部状态并强制进行下游冲洗的情况,我应该如何应对?

0 个答案:

没有答案