Конференция "Media" » Как в DirectShow правильно остановить PushSourceFilter? [WinXP]
 
  • Neyro © (26.02.15 09:29) [0]
    Прошу помощи, сам уже мозг сломал...
    И так DSPack: есть у меня свой PushSourceFilter на основе TBCSource.

    TPushSoundSourceFilter = class(TBCSource)

    создаю экземпляр, соединяю с RenderFilter, запускаю - все работает. А вот когда пытаюсь остановить, то при остановке основного потока PushSoundSourceFilter, вызывается бесконечная процедура ожидания некого события.

    function TBCAMEvent.Wait(Timeout: Cardinal): boolean;
    begin
     result := (WaitForSingleObject(FEvent, Timeout) = WAIT_OBJECT_0);
    end;

    Где поток останавливается и на этом все... Подскажите, кто знает какого сообщения и от кого ожидает фильтр?
    Чисто логически я предполагаю, что он ждет сообщения от рендера о том, что рендер завершил работу с входящим буфером и его уже можно очищать, но что нужно вызвать у рендера, чтобы он сгенерировал такое сообщение вышестоящему PushSoundSourceFilter я не знаю...
    Голову сломал уже(((
  • Neyro © (11.03.15 17:05) [1]
    Немного разобрался (для прототипов классов DSPack).
    Если хотим самостоятельно останавить цепочку фильтров, без использования графа фильтров, то делать надо так:
    1. С начала ставим рендер фильтр на паузу. Это позволяет остановить поток передачи MediaSample между фильтрами. Сам рендер посылает сообщение по вышестоящей цепочке об остановке потока.
    2. PushSoundSourceFilter.stop
    Это разрушает поток PushSoundSourceFilter, чтобы он не зациклился в ожидании подтверждения доставки от рендера.
    3. Рендер.stop
    После чего и цепочку и фильтры можно уничтожать.
  • Neyro © (27.03.15 11:31) [2]
    Так же зависание потока обработки сообщений фильтра (в бесконечном ожидании) может случится, если вы используете рискованный вывод лога в VCL компонент из процедуры обработки фрэймов (основного потока фильтра):
    function TBCPushPinWave.FillBuffer(Sample: IMediaSample): HResult;
    begin
    ...
    MemoLog.Lines.Add(inttostr(FFrameNumber));
    Edit1.Text := inttostr(FFrameNumber);
    и т.д.

    end;

    При работе фильтра все выводится корректно, но вот при остановке и уничтожении фильтра тут нужна дополнительная синхронизация или полный отказ от вывода из потока фильтра на экран через VCL.
 
Конференция "Media" » Как в DirectShow правильно остановить PushSourceFilter? [WinXP]
Есть новые Нет новых   [118459   +12][b:0][p:0]