Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: DirectShow: Переключение между файлами и 1394 без остановки графа  (Прочитано 5299 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Anakonda
Гость
« : 21-12-2005 15:17 » 

Мне необходимо осуществлять переключение между различными источниками данных в графе без его остановки. Данные берутся из файла и с 1394 (Microoft DV Camera and VCR), и выводятся на второй 1394. Проблема в том, что если я останавливаю граф а затем снова запускаю, то на выходе 1394 на секунду появляется чёрный экран.

Чтобы избавиться от необходимости остановки, я решил разбить граф на два. В первом данные читаются из файла/с 1394. В конце цепочки его фильтров я ставлю свой самодельный - MemRenderer (унаследован от CBaseRenderer), который записывает данные в память. Во втором графе первым стоит MemSource (унаследован от CSource), который данные из памяти читает и даёт их дальше. Тогда для смены источника данных можно останавливать только первый. Но при проигрывании (осебенно если данные идут с 1394) иногда происходят пропуски кадров (притормаживания?) хотя, в принципе, загрузка проца не слишком большая. Я их тестил по отдельности - MemRenderer заставлял рисовать данные на ДЦ'шник, MemSource - копировать картинку десктопа в поток, и вроде они работали нормально. Поэтому дело видимо в несинхронности их работы (опять же непонятно почему, по идее MediaTime задан правильно...)

Пробовал кидать данные не просто в память, а в очередь. Т.е. MemRenderer пишет первые N кадров, потом запускается Второй граф, MemSource начинает читать их по одному кадру. Но скоро MemSource догоняет MemRenderer. И тогда я не знаю что делать Ждать - начинаются тормоза, или пропускать кадр?...

Пробовал и жёстко связать их между собой. Чтобы не мешал код CBaseRenderer наследую не от него, а от CBaseFilter и при получении данных рендерером жду WaitForSingleObject когда сурсе их прочитает. А сурсе ждёт через WaitForSingleObject когда рендерер запишет что-нибудь. Работает идеально, но нагрузка под 80%... Причём если в выходном графе выдаю на VideoRenderer (в окошко), то куда меньше, а на Microoft DV Camera and VCR - такая большая. Почему?...

Ещё реализовывал такой вариант: когда данные приходят в MemRenderer он напрямую вызывает один метод MemSource и передаёт ему медиа семпл. Всё работает, но до переключения. Если остановить первый граф, в котором данные читаются (Stop), то потом второй граф уже не хочет никаких данных принимать. Причём это относится только к 1394, с тем же VideoRenderer всё нормально. И если делать не Stop а Pause то всё OK. Я думаю что дело в том, что при прямом вызове рендерер и сурсе работают в одном потоке и при остановки по Stop первого графа этот поток гибнет, что очень не нравиться Microoft DV Camera and VCR. Вот так вот...


Может кто с этим делом сталкивался? Подскажите пожалуйста   Так больше нельзя...! Немогу ничего больше придумать...

Разьве что писать самому умный сурсе фильтр (который будет переключаться между файлами), но времени не хватит... Надо уже вот-вот релиз сдавать   Вот такой я вот...
« Последнее редактирование: 12-12-2007 15:49 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines