реклама на сайте
подробности

 
 
> Синхронизация с монитором/видеокартой при выводе изображения под Виндой
Dr.Alex
сообщение May 14 2015, 18:10
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Если тупо выводить 25 кадров в секунду по таймеру (или по мере поступления этих кадров из источника), то возникает известный артефакт (небольшой, но всё-таки).
Если момент отрисовки виндой нового кадра придётся на момент, когда видеокарта решит выплюнуть очередной кадр на монитор, то получится что часть кадра моего видео будет содержать прошлый кадр, а часть новый. При быстрых движениях в сюжете это бывает заметно.
Можно ли как-то синхронизироваться?
Конечно, если через директшоу работать, то там всё это решено, ну а если сам выводишь?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Guest_TSerg_*
сообщение May 14 2015, 18:20
Сообщение #2





Guests






Cмотря через что выводить. Обычно buffered помогает.
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение May 14 2015, 18:27
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(TSerg @ May 14 2015, 21:20) *
Cмотря через что выводить. Обычно buffered помогает.

Проясните что имеется в виду.

У меня всё тупо::
простой диалог на MFC, в функции OnPaint() вышвыриваем кадр функцией BitBlt().
Go to the top of the page
 
+Quote Post
slanted
сообщение May 17 2015, 11:00
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 140
Регистрация: 2-01-08
Пользователь №: 33 768



Цитата(Dr.Alex @ May 14 2015, 22:27) *
простой диалог на MFC, в функции OnPaint() вышвыриваем кадр функцией BitBlt().


В любой относительно современной винде (Vista и выше) весь gdi рисуется через т.н. compositor. Все что вы рисуете из программы, не попадает напрямую в фреймбуфер, а сначала в виде команд или битмапов подается на вход compositor'а, который уже сводит итоговую картинку (с двойной буферизацией или без — это зависит от множества факторов), стараясь при этом избегать фликера. В сухом остатке здесь то, что отрисовкой вы по факту управлять не можете, и между подачей команды BitBlt и появлением соответствующих пикселов на экране проходит некий слабопредсказуемый промежуток времени.

Если вам нужен полный контроль, то выводите графику через DirectX или более низкоуровневые API (Mantle, DX12 и у nvidia что-то еще было).

Да, еще. BitBlt сколь я себе помню — медленный. StretchDiBits был побыстрее, но я такой графикой развлекался последний раз еще в институте (>15 лет назад), так что могу и путать.

Сообщение отредактировал slanted - May 17 2015, 11:03
Go to the top of the page
 
+Quote Post
Dr.Alex
сообщение May 17 2015, 18:43
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 386
Регистрация: 5-04-05
Из: моська, RF
Пользователь №: 3 863



Цитата(slanted @ May 17 2015, 14:00) *
Все что вы рисуете из программы, не попадает напрямую в фреймбуфер, а сначала в виде команд или битмапов подается на вход compositor'а, который уже сводит итоговую картинку (с двойной буферизацией или без — это зависит от множества факторов)

Верно ли я понял что начиная с висты моей проблемки вообще не должно быть? (Я на Server 2003 x64 работаю)
Чё-то не верится. Хотя это конечно хорошо.

Цитата(slanted @ May 17 2015, 14:00) *
Если вам нужен полный контроль, то выводите графику через DirectX

Так вот знать бы, как это делать.
Тупо составить граф фильтров я не могу, так как видео нестандартного формата.
То есть либо писать свой фильтр (чего я пока не умею, да и не хочу),
либо есть такая идея - нельзя ли не писать свой фильтр а кормить Renderer прямо из приложения?
Либо может быть ещё какие-то возможности есть, а то например всякие там медиаплеер классик и VLC ведь как-то работают, не строя граф фильтров..

Цитата(slanted @ May 17 2015, 14:00) *
Да, еще. BitBlt сколь я себе помню — медленный. StretchDiBits был побыстрее

Вот со скоростью проблем не вижу, загрузка при выводе 1080p25 крошечная (а ещё ведь декодирование),
но вашу функцию попробую.

UPD: по поводу StretchDiBits:
оказалось что одно другому не мешает, у меня вместо неё SetDIBits, которая делает из буфера HBITMAP,
потом HBITMAP привязывается к CDC, который затем всё равно нужно выводить в DC функцией BitBlt или StretchBlt.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 00:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016