Как мне отрендерить «Видео» в Qt / X11 на встроенном устройстве - PullRequest
3 голосов
/ 25 октября 2011

В настоящее время я пытаюсь написать приложение, которое отображает «живое» видео со специализированного USB-устройства.Устройство USB обеспечивает ок.10 кадров в секунду для видео 320х240 с массивом уровней серого.Приложение написано в Qt на платформе iMx51 (800 МГц), работающей под управлением Linux и X11.Мое приложение должно отображать это видео, масштабированное в 2 раза (так, 640x480) и использовать как можно меньше процессора.

В настоящее время изображения отображаются в виде простой QLabel, которая обновляет свое растровое изображение каждый раз, когда с устройства передается новый видеокадр.Когда QLabel отображается в разрешении 320x240, видео воспроизводится плавно, и приложение использует 20% ЦП.

Когда мы пытаемся масштабировать QLabel до размера 640x480, загрузка ЦП резко возрастает, а все доступные ресурсы потребляются со скоростью 10 кадров / сек.Наше единственное средство уменьшить загрузку процессора - сбросить кадры.

Мы пытались написать виджет с настраиваемым событием рисования, чтобы сами рисовать содержимое видеоизображения, но безрезультатно, этот метод использовал немного больше ресурсов ЦП, чем QLabel.

Наши другие продукты, которыеу этого есть возможность перетаскивать изображение непосредственно в необработанный кадровый буфер (без x11), и, несмотря на их гораздо более медленные процессоры, они могут справиться с этой задачей без каких-либо проблем.Кажется, что X11 и Qt добавляют нам колоссальные накладные расходы.

Должен быть ПРАВИЛЬНЫЙ способ отображения постоянно обновляемого изображения через Qt и X11, который не так ресурсоемок.Мы изучаем возможность установки и запуска openGL ES на устройстве, но об этом пока может быть и речи.Есть ли что-то, чего мне не хватает в Qt Framework, которое позволит мне выполнить эту относительно простую задачу?

Ответы [ 4 ]

1 голос
/ 16 ноября 2011

После загрузки и чтения исходного кода VLC я остановился на использовании расширения Xvideo для X11. Исходный код VLC содержит «механизм» вывода xvideo, использующий xcb для связи с xserver. Я использовал это в качестве примера для написания своего собственного решения.

На нашей платформе функции масштабирования и отображения расширения xvideo имеют аппаратное ускорение.

Я собираюсь предоставить учебное пособие и пример кода, как только позволит время.

0 голосов
/ 31 октября 2011

Не используйте QLabel для отображения движущегося содержимого.Вместо этого подкласс QWidget и реализовать свой собственный виджет.Кроме того, вы можете поэкспериментировать с прямым рисованием (флаги для QWidget), чтобы избежать двойной буферизации и т. Д.

Конечно, использование графического процессора для масштабирования - это хорошо, но для меня это звучит так, как если бы вы все ещедолжны переместить все данные с устройства на графический процессор с помощью процессора.Т.е. вы все равно будете использовать довольно много циклов только для перемещения единиц и нулей.

0 голосов
/ 12 ноября 2011

«Простой» X11 очень неэффективен для рендеринга растровых изображений из-за его клиент-серверной архитектуры, вам нужно использовать расширение MIT-SHM.В зависимости от версии Qt, он может включать в себя «растровый» графический движок, который изначально использует MIT-SHM.

См. Также Какой самый быстрый способ отобразить изображение в QT на X11 без OpenGL? - в итоге мне удалось добиться очень приличной производительности от Qt.Хитрость заключается в том, чтобы посмотреть, сколько раз вы копируете свое растровое изображение и пытаетесь свести его к минимуму.

Обратите внимание, что вам на самом деле не нужен OpenGL для растровых изображений, вы можете попробовать 2D-ускорение, если у вас есть подходящий драйвер для вашего оборудования.,У вас есть общая память, поэтому для растрового рендеринга ваш графический процессор работает так же быстро, как и процессор, он просто сэкономил бы вам несколько циклов ЦП, если вы выполняете растровый рендеринг (по существу, передача из памяти в память) с использованием другого оборудования.

0 голосов
/ 26 октября 2011

Ваша проблема с разрешением заключается в том, что процессор намного медленнее, чем графический процессор, поэтому рендеринг кадров с метками - действительно плохая идея. Когда вы увеличиваете разрешение, вы экспоненциально увеличиваете размер данных, с которыми ЦПУ будет работать. При работе с видео вы должны использовать графический процессор, который работает намного быстрее.

Я предлагаю вам использовать виджет QGL из модуля Qt OpenGL (http://doc.qt.nokia.com/4.7/qtopengl.html).

Вы можете читать кадры с вашего устройства, перемещать их в видеопамять, использовать графический процессор для их рендеринга (вы также можете применять фильтры и эффекты, если вы научитесь / знаете, как это сделать), сэкономив много времени ЦП. и уменьшить ваши проблемы с разрешением.

...