Аппаратно-зависимый уровень (HAL) камеры Android связывает API фреймворка камеры более высокого уровня в android.hardware.camera2 с базовым драйвером камеры и аппаратным обеспечением. Начиная с Android 13, разработка интерфейса HAL камеры выполняется с помощью AIDL. В Android 8.0 появился Treble, который переключает Camera HAL API на стабильный интерфейс, определяемый языком описания интерфейса HAL (HIDL). Если вы ранее разрабатывали модуль HAL и драйвер камеры для Android 7.0 и более ранних версий, обратите внимание на значительные изменения в конвейере камеры.
Аппаратно-зависимый уровень камеры AIDL
На устройствах с Android 13 или более поздней версией ОС фреймворк камеры поддерживает HAL-интерфейсы камеры AIDL. Фреймворк камеры также поддерживает HAL-интерфейсы HIDL, однако функции камеры, добавленные в Android 13 или более поздних версиях, доступны только через HAL-интерфейсы AIDL. Чтобы реализовать такие функции на устройствах, обновляемых до Android 13 или более поздней версии, производители устройств должны перевести процесс HAL с использования интерфейсов камеры HIDL на интерфейсы камеры AIDL.
Подробнее о преимуществах AIDL…
Реализуйте HAL камеры AIDL
Пример реализации HAL камеры AIDL можно найти на странице
hardware/google/camera/common/hal/aidl_service/.
Спецификации AIDL HAL для камеры можно найти в следующих местах:
- Поставщик камеры:
hardware/interfaces/camera/provider/aidl/. - Устройство камеры:
hardware/interfaces/camera/device/aidl/ - Метаданные камеры:
hardware/interfaces/camera/metadata/aidl/ - Распространенные типы данных:
hardware/interfaces/camera/common/aidl/
Для устройств, переходящих на AIDL, производителям может потребоваться изменить правила Android SELinux (sepolicy) и RC-файлы в зависимости от структуры кода.
Как проверить AIDL-интерфейс HAL камеры
Чтобы протестировать реализацию HAL камеры AIDL, убедитесь, что устройство проходит все тесты CTS и VTS. В Android 13 появился тест AIDL VTS
VtsAidlHalCameraProvider_TargetTest.cpp.
Функции Camera HAL3
Цель редизайна Android Camera API – значительно расширить возможности приложений по управлению подсистемой камеры на устройствах Android, а также реорганизовать API, чтобы сделать его более эффективным и удобным в обслуживании. Дополнительные возможности управления позволяют создавать качественные приложения для камеры на устройствах Android, которые надежно работают на разных устройствах, но при этом используют алгоритмы, разработанные специально для них, чтобы обеспечить максимальное качество и производительность.
В версии 3 подсистемы камеры режимы работы объединены в единое представление, которое можно использовать для реализации любого из предыдущих режимов и нескольких других, например серийной съемки. Это позволяет пользователям лучше управлять фокусом и экспозицией, а также выполнять постобработку, например шумоподавление, настройку контрастности и резкости. Кроме того, упрощенный интерфейс позволяет разработчикам приложений легко использовать различные функции камеры.
API моделирует подсистему камеры как конвейер, который преобразует входящие запросы на захват кадра в кадры в соотношении 1:1. Запросы содержат всю информацию о конфигурации, необходимую для захвата и обработки кадра. Это включает разрешение и формат пикселей, ручное управление датчиком, объективом и вспышкой, режимы работы 3A, управление обработкой RAW->YUV, генерацию статистики и т. д.
Проще говоря, фреймворк приложения запрашивает фрейм у подсистемы камеры, а та возвращает результаты в выходной поток. Кроме того, для каждого набора результатов создаются метаданные, содержащие такую информацию, как цветовые пространства и затенение объектива. Камера версии 3 – это конвейер, который передает данные в одностороннем порядке, как камера версии 1. Каждый запрос на фотосъемку преобразуется в одно изображение, полученное с помощью датчика, которое затем обрабатывается и превращается в:
- Объект результата с метаданными о захвате.
- От одного до N буферов данных изображений, каждый в свою целевую поверхность.
Набор возможных выходных поверхностей предварительно настроен:
- Каждая поверхность – это место назначения для потока буферов изображений с фиксированным разрешением.
- В качестве выходных устройств можно настроить только небольшое количество поверхностей (около трех).
Запрос содержит все необходимые настройки захвата и список выходных поверхностей, в которые нужно передавать буферы изображений для этого запроса (из общего настроенного набора). Запрос может быть однократным (с capture()) или повторяться бесконечно (с setRepeatingRequest()). Захваченные данные имеют приоритет над повторяющимися запросами.
Рисунок 1. Основная модель работы камеры
Обзор Camera HAL1
Первая версия подсистемы камеры была разработана как черный ящик с элементами управления высокого уровня и тремя режимами работы:
- Предпросмотр
- Видеозапись
- Фотосъемка
У каждого режима есть свои особенности, но некоторые функции совпадают. Это затрудняло реализацию новых функций, таких как серийная съемка, которая находится между двумя режимами работы.
Рисунок 2. Компоненты камеры
В Android 7.0 по-прежнему поддерживается HAL1 камеры, поскольку многие устройства все ещё используют его. Кроме того, сервис камеры Android поддерживает реализацию обоих HAL (1 и 3), что полезно, если вы хотите поддерживать менее мощную фронтальную камеру с HAL1 и более продвинутую заднюю камеру с HAL3.
Существует один модуль HAL камеры (со своим номером версии), в котором перечислены несколько независимых устройств камеры, у каждого из которых есть свой номер версии. Для поддержки устройств версии 2 или более новой требуется модуль камеры версии 2 или более новой. Такие модули могут содержать разные версии устройств камеры (именно это мы имеем в виду, когда говорим, что Android поддерживает реализацию обоих аппаратно-зависимых уровней).