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