Фильтр GDCL Mp4mux BeginFlush () - это однократная операция. Могу ли я обойти это ограничение? - PullRequest
2 голосов
/ 14 мая 2019

Наш проект транскодирования / DSP использует многопрограммные потоки MPEG2-TS в качестве входных данных.

Конечная точка ветви транскодирования нашего графа DirectShow является экземпляром фильтра GDCL Mpeg4Mux .

Элементарные потоки могут изменять значения PID на лету (причина этого не известна, но это происходит).

Чтобы отреагировать на эти динамические изменения, мы анализируем выходные данные PSI демультиплексора MPEG-2 и инструктируем демультиплексор переназначать значения 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 и что он должен игнорировать следующий вызов сброса, , но я боюсь, что могу создать тупик , поскольку образцы носителя могут удерживаться фильтром, а операция очистки должна освобождать любые блокировки и освобождать любые удержанные образцы.

Кроме того, как я должен реагировать на случай, когда демультиплексор сбрасывает свое внутреннее состояние и вызывает сброс в нисходящем потоке?

...