Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Камера

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

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

Архитектура

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

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

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

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

Внедрение HAL

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

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

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

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

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

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

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

На следующем рисунке и в списке описаны устаревшие компоненты 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 для получения доступа к службе камеры.
binder IPC прокси
Прокси-серверы связывания IPC облегчают обмен данными через границы процесса. В каталоге frameworks/av/camera есть три класса frameworks/av/camera которые вызывают службу камеры. ICameraService - это интерфейс для службы камеры, ICamera - это интерфейс для определенного открытого устройства с камерой, а ICameraClient - это интерфейс устройства обратно в платформу приложения.
сервис камеры
Сервис камеры, расположенный в frameworks/av/services/camera/libcameraservice/CameraService.cpp , представляет собой фактический код, который взаимодействует с HAL.
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 для создания общей библиотеки. Убедитесь, что make-файл содержит следующие строки:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

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

  3. Укажите, что на вашем устройстве есть функции камеры, скопировав необходимые XML-файлы функций в каталог frameworks/native/data/etc с make-файлом вашего устройства. Например, чтобы указать, что ваше устройство имеет вспышку камеры и может выполнять автофокусировку, добавьте следующие строки в файл <device>/<company_name>/<device_name>/device.mk makefile вашего устройства:
    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 \
    

    Пример файла device/samsung/tuna/device.mk устройства см. В разделе device/samsung/tuna/device.mk .

  4. device/<company_name>/<device_name>/media_profiles.xml возможности device/<company_name>/<device_name>/media_profiles.xml , формата и разрешения вашей камеры в 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. Чтобы включить приложение Camera в образ системы вашего устройства, укажите его в переменной PRODUCT_PACKAGES в device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...