Есть несколько декодеров, работающих в разных потоках. Они декодируют видео с разной частотой кадров и вообще никак друг с другом не синхронизированы. Могут запускаться и останавливаться.
Нужно всё это дело рендерить в реальном времени в подобие видеостены - прямоугольной сетки, где в каждой ячейке свой видеопоток.
Как у меня сделано сейчас. Декодер хранит последний декодированный кадр. По таймеру поток, отвечающий за обновление экрана, собирает последние кадры от всех декодеров, через glTexSubImage2D
обновляет OpenGL текстуры и рендерит их на экран. Чтобы потоки не конфликтовали, чтение и запись последнего декодированного кадра прикрыты мьютексом.
Текущая версия работает, но хочу попросить совета. Есть ли какие-нибудь мысли по оптимизации этого дела и вообще как правильно такое делать? Наверное, это похоже на работу композитора. Есть независимые источники, которые предоставляют готовые данные и их нужно свести воедино и отобразить на экране.
У меня здесь получается только один OpenGL контекст. Слышал что-то про многопоточный рендер. Применим ли он здесь?
OpenGL рендерится в окно Qt приложения через QOpenGLWindow. Версия OpenGL строго не старше 3.1. Нужна кроссплатформенность: топик и оффтопик, т.е. без платформозависимых фич типа dma-buf. Видеокарты в основном интел и нвидия.