Appareil photo

Icône HAL de l'appareil photo Android

La couche d'abstraction matérielle (HAL) de l'appareil photo d'Android connecte le haut niveau du framework d'appareil photo <ph type="x-smartling-placeholder"></ph> Camera 2 au pilote de caméra et au matériel sous-jacents. Le sous-système de l'appareil photo inclut des implémentations pour les composants du pipeline de caméra, tandis que la couche d'abstraction de la caméra fournit des interfaces pour l'implémentation de votre version de ces composants.

Architecture

La figure et la liste suivantes décrivent les composants HAL.

Architecture de l&#39;appareil photo Android

Figure 1 : Architecture de la caméra

framework d'application
Le code de l'application se trouve au niveau du framework d'application. <ph type="x-smartling-placeholder"></ph> l'API Camera 2 pour interagir avec les composants matériels de l'appareil photo. En interne, ce code appels correspondants <ph type="x-smartling-placeholder"></ph> Binder pour accéder au code natif qui interagit avec caméra.
AIDL
L'interface de liaison associée à CameraService peut être trouvé à <ph type="x-smartling-placeholder"></ph> frameworks/av/camera/aidl/android/hardware. Le code généré appelle le code natif de niveau inférieur pour obtenir l'accès au une caméra physique et renvoie les données utilisées pour créer <ph type="x-smartling-placeholder"></ph> CameraDevice et éventuellement <ph type="x-smartling-placeholder"></ph> CameraCaptureSession au niveau du framework.
framework natif
Ce framework situé dans frameworks/av/ fournit un natif équivalent au <ph type="x-smartling-placeholder"></ph> CameraDevice et CameraCaptureSession classes. Voir aussi <ph type="x-smartling-placeholder"></ph> Documentation de référence sur NDK camera2
Interface IPC de liaison
L'interface de liaison d'IPC facilite la communication sur les limites des processus. Plusieurs classes de liaison de caméra sont situées dans Répertoire frameworks/av/camera/camera/aidl/android/hardware qui au service de caméra. <ph type="x-smartling-placeholder"></ph> ICameraService est l'interface du service de l'appareil photo. <ph type="x-smartling-placeholder"></ph> ICameraDeviceUser est l'interface d'un conteneur ouvert appareil photo et ICameraServiceListener et ICameraDeviceCallbacks sont les Rappels CameraService et CameraDevice à la framework d'application.
service de caméra
Le service de caméra, situé à frameworks/av/services/camera/libcameraservice/CameraService.cpp, est le code qui interagit avec le HAL.
HAL
La couche d'abstraction matérielle définit l'interface standard et que vous devez implémenter pour que votre caméra le matériel fonctionne correctement.

Implémenter le HAL

Le HAL se situe entre le pilote de l'appareil photo et le framework Android de niveau supérieur. et définit une interface à implémenter pour que les applications puissent fonctionner correctement. le matériel de l'appareil photo. Le HIDL pour la couche d'abstraction de la caméra sont définies <ph type="x-smartling-placeholder"></ph> matériel/interfaces/caméra.

Un HAL lié typique doit implémenter les interfaces HIDL suivantes:

Les implémentations HIDL de référence sont disponibles pour CameraProvider.cpp, <ph type="x-smartling-placeholder"></ph> CameraDevice.cpp et CameraDeviceSession.cpp L'implémentation encapsule les anciennes HAL qui utilisent toujours ancienne API. À partir d'Android 8.0, les implémentations HAL de l'appareil photo doivent utiliser l'API HIDL. utiliser de l'ancienne interface n'est pas prise en charge.

Validation des entrées

Comme le HAL a accès à des ressources différentes de celles du service de caméra, la limite entre les deux sont traités comme une limite de sécurité. Cela signifie que les paramètres transmis par le service d'appareil photo considérés comme non fiables et non rectifiés. Pour prévenir les failles de sécurité qui permettent aux pirates informatiques élever des privilèges ou accéder à des données auxquelles ils ne sont pas censés avoir accès, le HAL de la caméra doit valider les paramètres transmis par le service d'appareil photo au HAL. Cela inclut la vérification de l'état les valeurs de longueur se situent dans les plages autorisées et nettoient les paramètres avant utilisation et avant en les transmettant aux pilotes du matériel ou du noyau.

Anciens composants HAL

Cette section décrit l'architecture des anciens composants HAL et explique comment pour implémenter le HAL. Sous Android 8.0 ou version ultérieure, les implémentations HAL de la caméra doivent utiliser l'API HIDL, décrite ci-dessus.

Architecture (ancienne)

La figure et la liste suivantes décrivent les anciens composants HAL de la caméra.

Architecture de l&#39;appareil photo Android

Figure 2. Architecture de l'ancien appareil photo

framework d'application
Le code de l'application se trouve au niveau du framework d'application. <ph type="x-smartling-placeholder"></ph> android.hardware.Camera pour interagir avec le matériel de l'appareil photo. En interne, ce code appelle la classe Glue JNI correspondante pour accéder au code natif qui interagit avec caméra.
JNI
Code JNI associé à <ph type="x-smartling-placeholder"></ph> android.hardware.Camera se trouve dans frameworks/base/core/jni/android_hardware_Camera.cpp Ce code appelle le code natif de niveau inférieur pour obtenir l'accès à l'appareil photo physique et renvoie les données permettant de créer <ph type="x-smartling-placeholder"></ph> android.hardware.Camera au niveau du framework.
framework natif
Framework natif défini dans frameworks/av/camera/Camera.cpp fournit un équivalent natif <ph type="x-smartling-placeholder"></ph> android.hardware.Camera. Cette classe appelle l'IPC des proxys de liaison pour accéder au service de l’appareil photo.
proxys IPC de liaison
Les proxys de liaison IPC facilitent la communication sur les limites des processus. Trois classes de liaison de caméra sont situées dans Répertoire frameworks/av/camera qui appelle le service de caméra. ICameraService est l'interface du service de l'appareil photo. ICamera est l'interface d'un appareil photo ouvert spécifique, et ICameraClient est l'interface de l'appareil framework d'application.
service de caméra
Le service de caméra, situé à frameworks/av/services/camera/libcameraservice/CameraService.cpp, est le code qui interagit avec le HAL.
HAL
La couche d'abstraction matérielle définit l'interface standard et que vous devez implémenter pour que votre caméra le matériel fonctionne correctement.
pilote de noyau
Le pilote de la caméra interagit avec le matériel et votre l'implémentation de l'HAL. La caméra et le pilote doivent être compatibles avec les modèles YV12 et NV21 d'image pour pouvoir prévisualiser l'image de l'appareil photo sur le display et vidéo.

Implémenter le HAL (ancien)

Le HAL se situe entre le pilote de l'appareil photo et le framework Android de niveau supérieur. et définit une interface à implémenter pour que les applications puissent fonctionner correctement. le matériel de l'appareil photo. L'interface HAL est définie dans hardware/libhardware/include/hardware/camera.h et hardware/libhardware/include/hardware/camera_common.h.

camera_common.h définit camera_module, une valeur pour obtenir des informations générales sur la caméra, telles que son identifiant et les propriétés communes à toutes les caméras (qu'il s'agisse d'une caméra frontale caméra arrière).

camera.h contient du code correspondant à <ph type="x-smartling-placeholder"></ph> android.hardware.Camera Ce fichier d'en-tête déclare Structure camera_device contenant à son tour un Structure camera_device_ops avec des pointeurs vers des fonctions qui implémentent l'interface HAL. Pour accéder à la documentation sur les paramètres de l'appareil photo, les développeurs peuvent définie, reportez-vous à frameworks/av/include/camera/CameraParameters.h. Ces paramètres sont définis avec la fonction indiquée par int (*set_parameters)(struct camera_device *, const char *parms) dans le HAL.

Pour obtenir un exemple d'implémentation HAL, reportez-vous à l'implémentation de l'API Galaxy Nexus HAL dans hardware/ti/omap4xxx/camera.

Configurer la bibliothèque partagée

Configurer le système de compilation Android pour empaqueter correctement l'implémentation HAL dans une bibliothèque partagée et copiez-le à l'emplacement approprié en créant une Fichier Android.mk:

  1. Créer un device/<company_name>/<device_name>/camera contenant les fichiers sources de votre bibliothèque.
  2. Créez un fichier Android.mk pour créer la bibliothèque partagée. Assurez-vous que que le fichier makefile contienne les lignes suivantes:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Votre bibliothèque doit être nommée camera.<device_name> (.so est ajouté automatiquement) afin qu'Android puisse charger correctement la bibliothèque. Pour obtenir un exemple, consultez le fichier makefile de l'appareil photo du Galaxy Nexus situé dans hardware/ti/omap4xxx/Android.mk

  3. Spécifiez que votre appareil dispose des fonctionnalités de l'appareil photo en copiant le fichier XML des fonctionnalités nécessaires les fichiers du répertoire frameworks/native/data/etc avec votre le fichier makefile de l'appareil. Par exemple, pour indiquer que votre appareil est équipé d'un flash d'appareil photo vous pouvez effectuer la mise au point automatique, ajoutez les lignes suivantes dans le <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 \
    

    Pour obtenir un exemple de fichier makefile d'un appareil, consultez device/samsung/tuna/device.mk

  4. Déclarez le codec multimédia, le format et les capacités de résolution de votre caméra au format device/<company_name>/<device_name>/media_profiles.xml et device/<company_name>/<device_name>/media_codecs.xml XML. Pour en savoir plus, consultez Exposer les codecs au framework.
  5. Ajoutez les lignes suivantes dans le fichier Fichier makefile device/<company_name>/<device_name>/device.mk pour copier media_profiles.xml et media_codecs.xml à l'emplacement approprié:
    # 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. Pour inclure l'application Appareil photo dans l'image système de votre appareil, indiquez-la dans le la variable PRODUCT_PACKAGES dans le fichier device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...