В рамках проекта libcamera развивается стек для поддержки камер в Linux
Сообщество LinuxTV, занимающееся разработкой и поддержкой мультимедийных-подсистем в ядре Linux, совместно с некоторыми производителями камер, основало проект libcamera, нацеленный на создание библиотеки для унификации поддержки и упрощения работы с видеокамерами, фотокамерами и TV-тюнерами в Linux, Android и ChromeOS. Предоставляемый библиотекой API со временем может заменить V4L2. Код проекта написан на C++ и распространяется под лицензией LGPLv2.1.
В рамках представленного проекта разработчики намерены переломить текущую ситуацию в области поддержки камер для смартфонов и встраиваемых устройств, которые завязаны в основном на проприетарные драйверы. Если в традиционных камерах операции первичной обработки изображений производятся на встроенном в камеру специализированном процессоре (MCU), то во встраиваемых устройствах для сокращения стоимости камеры эти функции выносятся на плечи основного CPU. Пользователи подобных камер поставлены в зависимость от закрытых драйверов от производителя и специфичных для них программных интерфейсов. Предоставляемый ядром Linux API V4L2 был создан в расчете на работу с традиционными обособленными web-камерами и плохо адаптирован для появившейся в последнее время тенденции выноса функциональности MCU на плечи CPU.
В рамках проекта libcamera сторонники СПО и производители оборудования попытались создать компромиссное решение, с одной стороны удовлетворяющее потребности разработчиков открытого ПО, а с другой - позволяющее защитить интеллектуальную собственность производителей камер. Для обеспечения совместимости с существующими программными окружениями и приложениями предоставляются прослойки для обеспечения совместимости на уровне API V4L, Gstreamer и Android Camera HAL. В отличие от V4L2 предлагаемый библиотекой libcamera стек реализован целиком в пространстве пользователя.
Специфичные для каждой камеры проприетарные компоненты взаимодействия с оборудованием оформляются в виде модулей, выполняемых в отдельных изолированных окружениях и взаимодействующих с библиотекой через IPC. Модули не имеют прямого доступа к устройству и обращаются к оборудованию через промежуточный 3A API. Запросы через данный API проверяются, фильтруются и ограничиваются только обращением к функциональности, необходимой для управления камерой. В случае эксплуатации уязвимостей в закрытых компонентах камер, атакующие не смогут получить доступ к основной системе.
- Предоставление алгоритмов для обработки и улучшения качества изображений и видео (корректировка баланса белого, устранение шума, стабилизация видео). Реализации алгоритмов могут быть как вынесены в проприетарные изолированные модули (например, алгоритмы автофокуса и выбора экспозиции), так и подключаться в виде открытых внешних библиотек;
- Возможности для управления захватом данных с камер на уровне отдельных кадров и синхронизации снимков с работой вспышки;
- Функции раздельной работы с несколькими камерами в системе;
- Возможности захвата одновременно нескольких видеопотоков с одной камеры (например, один с низким разрешением для видеоконференции, а другой с высоким разрешением для архивной записи на диск);
- API для определения списка имеющихся внешних и встроенных камер. Поддержки профилей устройств и обработчиков событий подключения и отключения камер. Предоставление структур с информацией о возможностях каждой камеры;