Как должен вести себя фильтр синтаксического анализатора в службах редактирования DirectShow? - PullRequest
1 голос
/ 21 мая 2011

мы создали пользовательский push-фильтр исходного кода / анализатора, который, как ожидается, будет работать в хронологическом порядке

.

Теперь все отлично, за исключением того, что фильтр не останавливаетсядоставить образцы, когда текущий

срез достиг своего конца.Рендеринг останавливается, но нисходящий фильтр продолжает потреблять

выборок.Фильтр доставляет образцы, пока не достигнет EOF.Это приводит к высокой загрузке процессора, поэтому приложение

просто непригодно для использования.

После долгих исследований я не смог найти подходящий механизм, который мог бы информировать мой фильтр

что обрезание закончено, поэтому фильтр необходимо остановить:

  • Функция Deliver на подключенных выводах декодера всегда возвращает S_OK, то есть подключенный декодер

такжене знают, что IMediaSamples отбрасываются в нисходящем направлении

  • в графе фильтра нет очистки

  • используется интерфейс IMediaSeeking :: SetPositions, но используется только интерфейсСтартовые позиции установлены -

    , наш всегда инструктируется воспроизводить до конца файла.

    Я ожидаю, что при использовании IAMTimelineSrc :: SetMediaTimes (Start, Stop) из приложения

    , это также установит время остановки, но этого не происходит.

  • Я также пытался манипулировать временной шкалой XTL, добавляя атрибуты «mstop» ко всему клипу в

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

С точки зрения фильтров выходные буферы всегда доступны (поскольку IMediaSamples отбрасываются в нисходящем направлении),

, поэтому фильтр заполняет выборки настолько быстро, насколько это возможно.пока исходный файл не будет завершен.

Есть ли какой-нибудь способ, которым фильтр может определить, когда остановиться, или мы можем сделать что-нибудь со стороны приложения?

Большое спасибо

Tilo

Ответы [ 3 ]

0 голосов
/ 25 мая 2011

Я не очень знаком с DES, но я пробовал свои демультиплексорные фильтры в DES, и время остановки было установлено правильно, когда для клипа был тег "stop =".

Возможно, ваш демакс не правильно реализует IMediaSeeking. Вы выставляете IMediaSeeking через контакты?

0 голосов
/ 24 июля 2013

Недавно у меня была возможность поработать с DES и пользовательским принудительным исходным фильтром.

Из моего опыта;

  • DES на самом деле возвращает код ошибки в вызов Receive (), которыйв свою очередь возвращается Deliver () источника, когда обрезка достигает конца.
  • Я столкнулся с подобной ситуацией, когда источник не получает его и продолжает работать до конца потока.
  • Проблема, которую я обнаружил (после огромного количества специальных испытаний), заключается в том, что источник должен вызывать метод DeliverNewSegment () при каждом перезапуске после поиска.Кажется, DES принимает входящие сэмплы только после этого уведомления.Похоже, DES получает сэмплы как S_OK даже без этого уведомления, но он просто выбрасывает.
  • Я не вижу, что DES устанавливает время окончания с помощью IMediaSeeking :: SetPositions.

Надеюсь, это поможет, хотя этот вопрос был очень старым, и я полагаю, что Тило больше не заботится об этом ...

0 голосов
/ 23 мая 2011

Вы можете попробовать добавить пользовательский интерфейс в свой фильтр и вызвать метод извне из вашего клиентского приложения. См. этот вопрос SO , чтобы узнать больше подробностей об этом подходе. При реализации этого метода вы должны быть осторожны с безопасностью потоков, и действительно возможно, что есть более точный способ обнаружения того, что захват должен быть остановлен.

...