Камера

Значок HAL камеры Android

Уровень аппаратной абстракции камеры (HAL) Android связывает высокоуровневые API-интерфейсы фреймворка камеры Camera 2 с базовым драйвером камеры и оборудованием. Подсистема камеры включает реализации компонентов конвейера обработки изображений, а HAL камеры предоставляет интерфейсы для реализации вашей версии этих компонентов.

Архитектура

На следующем рисунке и в приведенном ниже списке описаны компоненты HAL.

архитектура камеры Android

Рисунок 1. Архитектура камеры.

фреймворк приложений
На уровне фреймворка приложения находится код приложения, который использует Camera 2 API для взаимодействия с аппаратным обеспечением камеры. Внутри этот код вызывает соответствующие интерфейсы Binder для доступа к нативному коду, взаимодействующему с камерой.
АИДЛ
Интерфейс привязки, связанный с CameraService , можно найти в frameworks/av/camera/aidl/android/hardware . Сгенерированный код вызывает нативный код нижнего уровня для получения доступа к физической камере и возвращает данные, которые используются для создания объектов CameraDevice и, в конечном итоге CameraCaptureSession на уровне фреймворка.
нативный фреймворк
Этот фреймворк, расположенный в frameworks/av/ предоставляет нативный эквивалент классов CameraDevice и CameraCaptureSession . См. также справочник по Camera2 в NDK .
интерфейс IPC связующего
Интерфейс IPC binder обеспечивает связь через границы процессов. В каталоге frameworks/av/camera/camera/aidl/android/hardware находится несколько классов привязки камеры, которые вызывают службу камеры. ICameraService — это интерфейс к службе камеры; ICameraDeviceUser — это интерфейс к конкретному открытому устройству камеры; а ICameraServiceListener и ICameraDeviceCallbacks — это, соответственно, обратные вызовы CameraService и CameraDevice для фреймворка приложения.
сервис камер
Сервис камеры, расположенный в frameworks/av/services/camera/libcameraservice/CameraService.cpp , представляет собой код, непосредственно взаимодействующий с HAL.
ХАЛ
Уровень аппаратной абстракции определяет стандартный интерфейс, к которому обращается служба камеры и который необходимо реализовать для корректной работы аппаратного обеспечения камеры.

Внедрить HAL

HAL находится между драйвером камеры и высокоуровневой средой разработки Android и определяет интерфейс, который необходимо реализовать, чтобы приложения могли корректно работать с аппаратным обеспечением камеры. Интерфейсы HIDL для Camera HAL определены в файле hardware/interfaces/camera .

Типичный HAL с привязкой к коду должен реализовывать следующие интерфейсы HIDL:

  • ICameraProvider : Для перечисления отдельных устройств и управления их состоянием.
  • ICameraDevice : Интерфейс камеры.
  • ICameraDeviceSession : Активный интерфейс сеанса камеры.

Эталонные реализации HIDL доступны для CameraProvider.cpp , CameraDevice.cpp и CameraDeviceSession.cpp . Реализация использует старые HAL, которые по-прежнему используют устаревший API . Начиная с Android 8.0, реализации Camera HAL должны использовать API HIDL; использование устаревшего интерфейса не поддерживается.

Проверка входных данных

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

Устаревшие компоненты HAL

В этом разделе описывается архитектура устаревших компонентов HAL и способы реализации HAL. Для реализаций HAL камеры в Android 8.0 и выше необходимо использовать API HIDL, описанный выше.

Архитектура (наследие)

На следующем рисунке и в приведенном ниже списке описаны компоненты HAL устаревшей камеры.

архитектура камеры Android

Рисунок 2. Архитектура устаревшей камеры.

фреймворк приложений
На уровне фреймворка приложения находится код приложения, который использует API android.hardware.Camera для взаимодействия с аппаратным обеспечением камеры. Внутри этот код вызывает соответствующий класс-посредник JNI для доступа к нативному коду, взаимодействующему с камерой.
JNI
Код JNI, связанный с android.hardware.Camera , находится в frameworks/base/core/jni/android_hardware_Camera.cpp . Этот код вызывает низкоуровневый нативный код для получения доступа к физической камере и возвращает данные, которые используются для создания объекта android.hardware.Camera на уровне фреймворка.
нативный фреймворк
Нативная среда разработки, определенная в frameworks/av/camera/Camera.cpp предоставляет нативный эквивалент класса android.hardware.Camera . Этот класс вызывает прокси-объекты IPC-связывателя для получения доступа к службе камеры.
связующие IPC прокси
Прокси-объекты IPC-привязки обеспечивают связь через границы процессов. В каталоге frameworks/av/camera находятся три класса привязки камеры, которые вызывают службу камеры. ICameraService — это интерфейс к службе камеры, ICamera — интерфейс к конкретному открытому устройству камеры, а ICameraClient — это интерфейс устройства к фреймворку приложения.
сервис камер
Сервис камеры, расположенный в frameworks/av/services/camera/libcameraservice/CameraService.cpp , представляет собой код, непосредственно взаимодействующий с HAL.
ХАЛ
Уровень аппаратной абстракции определяет стандартный интерфейс, к которому обращается служба камеры и который необходимо реализовать для корректной работы аппаратного обеспечения камеры.
драйвер ядра
Драйвер камеры взаимодействует с фактическим аппаратным обеспечением камеры и вашей реализацией HAL. Камера и драйвер должны поддерживать форматы изображений YV12 и NV21 для обеспечения возможности предварительного просмотра изображения с камеры на дисплее и видеозаписи.

Внедрить HAL (устаревшую версию)

HAL находится между драйвером камеры и высокоуровневой средой разработки Android и определяет интерфейс, который необходимо реализовать, чтобы приложения могли корректно работать с аппаратным обеспечением камеры. Интерфейс HAL определен в заголовочных файлах hardware/libhardware/include/hardware/camera.h и hardware/libhardware/include/hardware/camera_common.h .

В camera_common.h определена camera_module , стандартная структура для получения общей информации о камере, такой как идентификатор камеры и свойства, общие для всех камер (то есть, является ли она фронтальной или тыловой камерой).

Файл camera.h содержит код, соответствующий android.hardware.Camera . Этот заголовочный файл объявляет структуру camera_device , которая, в свою очередь, содержит структуру camera_device_ops с указателями на функции, реализующие интерфейс HAL. Документацию по параметрам камеры, которые могут устанавливать разработчики, см. в frameworks/av/include/camera/CameraParameters.h . Эти параметры устанавливаются с помощью функции, на которую указывает указатель int (*set_parameters)(struct camera_device *, const char *parms) в HAL.

Пример реализации HAL можно найти в документации к HAL для Galaxy Nexus в hardware/ti/omap4xxx/camera .

Настройте общую библиотеку

Настройте систему сборки Android таким образом, чтобы она корректно упаковывала реализацию HAL в разделяемую библиотеку и скопировала её в нужное место, создав файл Android.mk :

  1. Создайте каталог device/<company_name>/<device_name>/camera для хранения исходных файлов вашей библиотеки.
  2. Создайте файл Android.mk для сборки разделяемой библиотеки. Убедитесь, что файл makefile содержит следующие строки:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Ваша библиотека должна называться camera.<device_name> (расширение .so добавляется автоматически), чтобы Android мог корректно загрузить библиотеку. Пример можно найти в makefile для камеры Galaxy Nexus, расположенном в hardware/ti/omap4xxx/Android.mk .

  3. Чтобы указать наличие у вашего устройства функций камеры, скопируйте необходимые XML-файлы функций из каталога frameworks/native/data/etc вместе с makefile вашего устройства. Например, чтобы указать, что ваше устройство имеет вспышку и автофокус, добавьте следующие строки в makefile вашего устройства: <device>/<company_name>/<device_name>/device.mk
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    Пример файла makefile для устройства можно найти в файле device/samsung/tuna/device.mk .

  4. Укажите возможности вашей камеры по передаче медиафайлов (кодек, формат и разрешение) в XML-файлах device/<company_name>/<device_name>/media_profiles.xml и device/<company_name>/<device_name>/media_codecs.xml . Подробнее см. раздел «Предоставление доступа к кодекам фреймворку» .
  5. Добавьте следующие строки в файл makefile вашего устройства device/<company_name>/<device_name>/device.mk , чтобы скопировать файлы media_profiles.xml и media_codecs.xml в соответствующее место:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. Чтобы включить приложение «Камера» в образ системы вашего устройства, укажите его в переменной PRODUCT_PACKAGES в файле makefile device/<company>/<device>/device.mk вашего устройства:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...