|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.04.2017, 14:37 | #1 |
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
SampleGrabberCallback глючит
Здравствуйте.
Использую sampleGrabberCallback для вывода изображения на форму. Код:
1) через какое-то время изображение на форме перестаёт обновляться. В окне IVideoWindow видео продолжает нормально идти. Если потаскать окно, то канва снова начинает обновляться. Иногда выдаёт ошибку canvas does not allow drawing. 2) Иногда при закытии окна, процесс остаётся висеть. Последний раз редактировалось BLACK_RAIN; 19.04.2017 в 14:41. |
19.04.2017, 21:59 | #2 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Мои мысли на этот счёт. Может кто-то более умный что-то другое подскажет или посоветует.
1) Цитата:
2) Цитата:
StretchDraw - очень медленная операция. У меня на весь экран в режиме энерго сбережения она тратит 150 мс. Это 6٫6 кадров/секунду. Варианты решения: - Уменьшить скорость захвата/воспроизведения. - Делать пропуски, не каждый кадр выводить. - Совсем отказаться от StretchDraw. - Задействовать GPU для вывода. Достаточно использовать рендер по умолчанию он уже оптимизирован под это дело. - Использовать более быструю библиотеку для масштабирования. Сильно много не выиграешь, но уложиться в приемлемый результат возможно. Я бы сделал так в BufferCB мы все данные кладём в накопитель(буфер). Это позволит контейнеру не простаивать. А в параллельном потоке, уже извлекаем данные и решаем выводить или пропускать кадр.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
20.04.2017, 10:05 | #3 |
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
ну я вообще-то на WinAPI пишу. А форму использую только для предварительных тестов.
Сейчас написал вот так: Код:
Но тогда программа начинает жрать память. И через какое-то время выдаётся ошибка Out of memory. Если всё так плохо, зачем тогда вообще был создан Callback? Ведь система, как вы говорите, не успевает выполнять код. |
20.04.2017, 13:50 | #4 |
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
заметил, что когда водишь мышью по форме, картинка начинает заметно тормозить, а процесс жрет памяти еще больше.
Что это значит? |
20.04.2017, 17:58 | #5 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Виндоус это
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
20.04.2017, 18:21 | #6 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Вот такой он кривой дирек-х.
Виндоус это не система реального времени. ОС в любое время может остановить ваш код. И начать исполнять другую задачу, другой процесс или поток. Паузы такие могут быть редкими, но длинными до 250 мс. Что-бы обработать все кадоы и не потерять их. Конвейр накапливает кадры. А потом их отдаёт в ускоренном режиме. Это позволяет не терять кадры, но исполнение идёт неровномерно. Но что будет если ваш код будет исполняться дольше чем 1/fps видео? В таком случае у вас в конвейре будут накапливаться кадры. Быстрее чем обрабатываться. Рано или позно произойдёт переполнение очередии. Что-бы этого не происходило конвейр начинает выкидывать кадры. Но в данном случае у вас задержки через чур большие больше и алгоритм майкрософта даёт сбой. Вам надо самим прореживать кадры. Что-бы другая часть конвейра смогла работать ваш фильтр навремя исключается из работы. Ну как на время? Таймер завязан на событи и сообщения. Чем чаще вы возите мышкой тем чаще срабатывает таймер. Таймеры в ОС не выполняются паралельно. Они все асинхронные. Как и callback тоже асинхронные. Асинхронный код проще программировать чем паролельный. Но в случае с DirectX я бы сказал это архитектурный прассчёт. Из-за чего все эти заплатки и родялись. В справки на любой callback сказано, что этот код должен выполняться максимально быстро и не использовать блокировки для синхронизации. Майкрософт вполне могла сделать всё по нормальному но не сделала. Можно было бы все эти недачёты устранить даже в рамках текущий не столь удачной архитектуры. В принципе оно решено. Когда вы вывод делаете не сами, а через рендер по умолчанию. Но только следует соблюдать правила для колбека озвученные выше.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
20.04.2017, 19:10 | #7 |
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Как то тоже делал вывод изображения callback вот мой код работает вроде норм
Код:
чтобы работал этот CallBack нужно сделать так при инициализации pVideoGrabber.setCallback(Self, 0); Может чем нибудь и поможет этот код интересная дискуссия здесь http://programmersforum.ru/showthread.php?t=106352 начало от поста#6 Последний раз редактировалось Aliens_wolfs; 21.04.2017 в 10:19. |
21.04.2017, 08:31 | #8 | ||
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
Цитата:
Цитата:
И как это мне поможет? |
||
21.04.2017, 09:13 | #9 | ||
Форумчанин
Регистрация: 16.12.2009
Сообщений: 902
|
Цитата:
Можно и без pVideoWindow.put_Owner(pnl1.Handle) ; но если удобно можете оставить как есть, все равно работает два ресурса, это окно просто скрыто Что бы не использовать лишнее нужно правильно описать NullRenderer и в том примере на что я ссылку дал он есть в функции play Цитата:
Последний раз редактировалось Aliens_wolfs; 21.04.2017 в 10:18. |
||
21.04.2017, 09:32 | #10 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx https://msdn.microsoft.com/en-us/win...nous-rendering https://blogs.msdn.microsoft.com/old...23-00/?p=12773
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Wi Fi глючит | nikox12 | Компьютерное железо | 5 | 03.05.2014 20:26 |
Глючит изображение | Problem | Общие вопросы Delphi | 9 | 22.08.2011 07:31 |
глючит комп | voldemen | Компьютерное железо | 1 | 15.05.2010 13:37 |
глючит Oracle | Dawystrik | SQL, базы данных | 11 | 13.09.2009 19:19 |
Глючит Excel | ---FISHER--- | Общие вопросы Delphi | 34 | 09.08.2009 20:30 |