Google se compromete a promover la equidad racial para las comunidades negras. Ver cómo.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Cámara

Icono de Android Camera HAL

La capa de abstracción de hardware de cámara (HAL) de Android conecta las API de marco de cámara de nivel superior en la Cámara 2 con el controlador y el hardware de la cámara subyacente. El subsistema de cámara incluye implementaciones para componentes de canalización de cámara, mientras que la cámara HAL proporciona interfaces para usar en la implementación de su versión de estos componentes.

Arquitectura

La siguiente figura y lista describen los componentes de HAL.

Arquitectura de la cámara Android

Figura 1. Arquitectura de la cámara

marco de la aplicación
En el nivel de marco de la aplicación se encuentra el código de la aplicación, que utiliza la API de Camera 2 para interactuar con el hardware de la cámara. Internamente, este código llama a las interfaces Binder correspondientes para acceder al código nativo que interactúa con la cámara.
AIDL
La interfaz de la carpeta asociada con CameraService se puede encontrar en frameworks / av / camera / aidl / android / hardware . El código generado llama al código nativo de nivel inferior para obtener acceso a la cámara física y devuelve los datos que se utilizan para crear el CameraDevice y, finalmente, los objetos CameraCaptureSession a nivel de marco.
marco nativo
Este marco que reside en frameworks/av/ proporciona un equivalente nativo a las clases CameraDevice y CameraCaptureSession . Consulte también la referencia de la cámara NDK2 .
interfaz IPC de carpeta
La interfaz de carpeta IPC facilita la comunicación sobre los límites del proceso. Hay varias clases de carpetas de cámara ubicadas en el directorio frameworks/av/camera/camera/aidl/android/hardware que llaman al servicio de cámara. ICameraService es la interfaz para el servicio de cámara; ICameraDeviceUser es la interfaz para un dispositivo de cámara abierto específico; e ICameraServiceListener e ICameraDeviceCallbacks son las respectivas devoluciones de llamada de CameraService y CameraDevice al marco de la aplicación.
servicio de cámara
El servicio de cámara, ubicado en frameworks/av/services/camera/libcameraservice/CameraService.cpp , es el código real que interactúa con el HAL.
HAL
La capa de abstracción de hardware define la interfaz estándar a la que llama el servicio de la cámara y que debe implementar para que el hardware de la cámara funcione correctamente.

Implementando el HAL

El HAL se encuentra entre el controlador de la cámara y el marco de Android de nivel superior y define una interfaz que debe implementar para que las aplicaciones puedan operar correctamente el hardware de la cámara. Las interfaces HIDL para la cámara HAL se definen en hardware / interfaces / cámara .

Un HAL binderizado típico debe implementar las siguientes interfaces HIDL:

Las implementaciones de referencia HIDL están disponibles para CameraProvider.cpp , CameraDevice.cpp y CameraDeviceSession.cpp . La implementación envuelve los HAL antiguos que aún usan la API heredada . A partir de Android 8.0, las implementaciones de Camera HAL deben usar la API HIDL; No se admite el uso de la interfaz heredada.

Componentes HAL heredados

Esta sección describe la arquitectura de los componentes de HAL heredados y cómo implementar el HAL. Las implementaciones de la cámara HAL en Android 8.0 y superior deben usar la API HIDL, descrita anteriormente.

Arquitectura (legado)

La siguiente figura y lista describen los componentes HAL de la cámara heredada.

Arquitectura de la cámara Android

Figura 2. Arquitectura de cámara heredada

marco de la aplicación
En el nivel de marco de la aplicación se encuentra el código de la aplicación, que utiliza la API android.hardware.Camera para interactuar con el hardware de la cámara. Internamente, este código llama a una clase de pegamento JNI correspondiente para acceder al código nativo que interactúa con la cámara.
JNI
El código JNI asociado con android.hardware.Camera se encuentra en frameworks/base/core/jni/android_hardware_Camera.cpp . Este código llama al código nativo de nivel inferior para obtener acceso a la cámara física y devuelve datos que se utilizan para crear el objeto android.hardware.Camera en el nivel de marco.
marco nativo
El marco nativo definido en frameworks/av/camera/Camera.cpp proporciona un equivalente nativo a la clase android.hardware.Camera . Esta clase llama a los proxies de carpeta IPC para obtener acceso al servicio de cámara.
proxies de IPC de la carpeta
Los proxies aglutinantes de IPC facilitan la comunicación sobre los límites del proceso. Hay tres clases de carpetas de cámara que se encuentran en el directorio frameworks/av/camera que llama al servicio de cámara. ICameraService es la interfaz para el servicio de la cámara, ICamera es la interfaz para un dispositivo de cámara abierto específico e ICameraClient es la interfaz del dispositivo de regreso al marco de la aplicación.
servicio de cámara
El servicio de cámara, ubicado en frameworks/av/services/camera/libcameraservice/CameraService.cpp , es el código real que interactúa con el HAL.
HAL
La capa de abstracción de hardware define la interfaz estándar a la que llama el servicio de la cámara y que debe implementar para que el hardware de la cámara funcione correctamente.
controlador de kernel
El controlador de la cámara interactúa con el hardware real de la cámara y su implementación del HAL. La cámara y el controlador deben ser compatibles con los formatos de imagen YV12 y NV21 para proporcionar una vista previa de la imagen de la cámara en la pantalla y la grabación de video.

Implementando el HAL (legado)

El HAL se encuentra entre el controlador de la cámara y el marco de Android de nivel superior y define una interfaz que debe implementar para que las aplicaciones puedan operar correctamente el hardware de la cámara. La interfaz HAL se define en los archivos de encabezado hardware/libhardware/include/hardware/camera.h y hardware/libhardware/include/hardware/camera_common.h .

camera_common.h define camera_module , una estructura estándar para obtener información general sobre la cámara, como la identificación de la cámara y las propiedades comunes a todas las cámaras (es decir, si se trata de una cámara frontal o posterior).

camera.h contiene código que corresponde a android.hardware.Camera . Este archivo de encabezado declara una estructura camera_device que a su vez contiene una estructura camera_device_ops con punteros a funciones que implementan la interfaz HAL. Para obtener documentación sobre los parámetros de la cámara que los desarrolladores pueden establecer, consulte frameworks/av/include/camera/CameraParameters.h . Estos parámetros se establecen con la función a la que apunta int (*set_parameters)(struct camera_device *, const char *parms) en el HAL.

Para ver un ejemplo de implementación de HAL, consulte la implementación de Galaxy Nexus HAL en hardware/ti/omap4xxx/camera .

Configurar la biblioteca compartida

Configure el sistema de compilación de Android para empaquetar correctamente la implementación de HAL en una biblioteca compartida y Android.mk en la ubicación adecuada creando un archivo Android.mk :

  1. Cree un directorio device/<company_name>/<device_name>/camera para contener los archivos fuente de su biblioteca.
  2. Cree un archivo Android.mk para construir la biblioteca compartida. Asegúrese de que el archivo MAKE contenga las siguientes líneas:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Su biblioteca debe llamarse camera.<device_name> ( .so se agrega automáticamente), para que Android pueda cargar la biblioteca correctamente. Para ver un ejemplo, vea el archivo MAKE para la cámara Galaxy Nexus ubicada en hardware/ti/omap4xxx/Android.mk .

  3. Especifique que su dispositivo tenga funciones de cámara copiando los archivos XML de funciones necesarios en el directorio frameworks/native/data/etc con el archivo MAKE de su dispositivo. Por ejemplo, para especificar que su dispositivo tiene un flash de cámara y puede enfocar automáticamente, agregue las siguientes líneas en el <device>/<company_name>/<device_name>/device.mk makefile de su <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 \
    

    Para ver un ejemplo de un archivo make de dispositivo, consulte device/samsung/tuna/device.mk .

  4. Declare las capacidades de códec, formato y resolución de medios de su cámara en los archivos XML de device/<company_name>/<device_name>/media_profiles.xml device/<company_name>/<device_name>/media_codecs.xml device/<company_name>/<device_name>/media_profiles.xml y device/<company_name>/<device_name>/media_codecs.xml . Para obtener detalles, consulte Exposición de códecs al marco .
  5. Agregue las siguientes líneas en el dispositivo de su device/<company_name>/<device_name>/device.mk makefile para copiar los archivos media_profiles.xml y media_codecs.xml en la ubicación adecuada:
    # 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. Para incluir la aplicación de la cámara en la imagen del sistema de su dispositivo, especifíquela en la variable PRODUCT_PACKAGES en el device/<company>/<device>/device.mk makefile de su device/<company>/<device>/device.mk :
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...