Мне необходимо осуществлять переключение между различными источниками данных в графе без его остановки. Данные берутся из файла и с 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. Вот так вот...
Может кто с этим делом сталкивался? Подскажите пожалуйста
! Немогу ничего больше придумать...
Разьве что писать самому умный сурсе фильтр (который будет переключаться между файлами), но времени не хватит... Надо уже вот-вот релиз сдавать
...