Наш проект транскодирования / 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 и что он должен игнорировать следующий вызов сброса, , но я боюсь, что могу создать тупик , поскольку образцы носителя могут удерживаться фильтром, а операция очистки должна освобождать любые блокировки и освобождать любые удержанные образцы.
Кроме того, как я должен реагировать на случай, когда демультиплексор сбрасывает свое внутреннее состояние и вызывает сброс в нисходящем потоке?