Камера

Значок 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 \
    ...