IMFStreamSink::ProcessSample не вызывается пользовательским приемником мультимедиа

Я написал собственный медиа-приемник (для управления платой аппаратного видеовыхода). Это работало, как и ожидалось, большую часть года. Все перестало работать, когда я перекомпилировал сток. Я заметил, что библиотеки и dll Media Foundation были обновлены за несколько недель до перекомпиляции. MFTrace показывает, что в топологии ожидаемые блоки соединены в ожидаемой топологии. MediaTypes также являются правильными. При запуске Presentation Clock я отправляю событие MEStreamSinkStarted, за которым следует событие MEStreamSinkRequestSample. Оба события считываются, но ProcessSample никогда не вызывается. Видеофайл воспроизводится; аудиопоток обрабатывается нормально. Я могу успешно воспроизвести видеофайл на EVR через TopoEdit. То, что проблема возникла после перекомпиляции, а не после обновления Windows, предполагает (мне) какое-то изменение интерфейса - возможно, теперь требуется ранее необязательная функция - но я не нашел никаких ссылок на изменение. У меня почти закончились идеи.

Вот функция, которая ставит образец запроса в очередь:

HRESULT BmDstream::OnStarted(void)
{

    OutputDebugString(_T("BmDstream::OnStarted()"));
    FAIL_RETURN(QueueEvent(MEStreamSinkStarted, GUID_NULL, S_OK, NULL));
    OutputDebugString(_T("BmDstream  -- Requesting sample"));
    FAIL_RETURN(QueueEvent(MEStreamSinkRequestSample, GUID_NULL, S_OK, NULL));

    return (S_OK);
}
'''

person Bob Bales    schedule 14.05.2021    source источник


Ответы (1)


Моя вина (как всегда). Заодно пересобрал сток, сделал еще одно изменение, о котором тоже подозревал, но 3 раза проверил, бага не нашел. Я непреднамеренно создал экземпляр источника дважды. Один экземпляр использовался для аудио, другой — для видео. По-видимому, источник видео никогда не запускался. Ничего общего со стоком, обновлениями Windows или чем-то еще, кроме меня. Аааа!

person Bob Bales    schedule 15.05.2021