Хотелось бы получать видео с камеры, но через Video For Linux получается медленно, сильно грузит процессор.
Как задействовать VPU в своем приложении.
Может у кого-нибудь есть примеры работы.
Если речь о USB-камерах, то никак не ускорить, для этого надо весь USB-стек ядра переписывать. В SoC на аппаратных ускорителях редко используют IOMMU, для работы им нужна физически непрерывная память., поэтому чтобы задействовать такой аппаратный ускоритель
1 выделяют промежуточный физически непрерывный буфер
2 копируют за счет CPU данные из фрагментированного буфера в физически непрерывный, при этом этот буфер выделяется аллокатором из некэшируемой и не буферизуемой области - скорость копирования CPU падает до десятков мегабайт, в случае больших объемов данных (видео) это просто капец всему "ускорению" :)
3 передают адрес промежуточного буфера аппаратному скорителю для DMA.
В случае когда данные поступают с IPU (CSI) они сразу складываются в физически непрерывный буфер, CPU используется только управления памятью и передачи указателей между аппаратными ускорителями. C PCIe (tw6869) данные тоже сразу в непрерывный буфер попадают - поэтому там такие космические скорости :)
Захват выполняется с VCEB. Львиную долю ресурсов процессора занимает перекодирование из формата YUYV в RGB24, а также последующая упаковка в JPEG. Использование VPU в этом случае сократило бы расходы процессора.
Мне необходимо в моей программе на Qt, считать видео с 2 или более камер.
Потом необходимо выполнить действия с этими изображениями, например, уменьшить, слить их в одно изображение, затем запаковать в JPEG отправить по сети через TCP.
Упаковка и JPEG и преобразование в RGB, занимает много времени используя процессор.
С помощью GStreamer я не вижу как решить эту задачу, так он может читать изображение только с одного источника.