Appareil photo

Icône Android Camera HAL

La couche d'abstraction matérielle (HAL, Hardware Abstraction Layer) de l'appareil photo d'Android connecte les API de framework de l'appareil photo de niveau supérieur dans Camera 2 à votre pilote et matériel d'appareil photo sous-jacents. Le sous-système de l'appareil photo inclut des implémentations pour les composants du pipeline de l'appareil photo, tandis que la HAL de l'appareil photo fournit des interfaces à utiliser pour implémenter votre version de ces composants.

Architecture

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

Architecture de l'appareil photo Android

Figure 1. Architecture de l'appareil photo.

framework d'application
Au niveau du framework d'application se trouve le code de l'application, qui utilise l' API Camera 2 pour interagir avec le matériel de l'appareil photo. En interne, ce code appelle les interfaces Binder correspondantes pour accéder au code natif qui interagit avec l'appareil photo.
AIDL
L'interface Binder associée à CameraService se trouve dans frameworks/av/camera/aidl/android/hardware. Le code généré appelle le code natif de niveau inférieur pour accéder à l' appareil photo physique et renvoie les données utilisées pour créer les CameraDevice et, à terme, CameraCaptureSession objets au niveau du framework.
framework natif
Ce framework résidant dans frameworks/av/ fournit un équivalent natif des CameraDevice et CameraCaptureSession classes. Consultez également la documentation de référence sur l'appareil photo NDK 2.
interface IPC Binder
L'interface IPC Binder facilite la communication au-delà des limites des processus. Plusieurs classes Binder d'appareil photo se trouvent dans le frameworks/av/camera/camera/aidl/android/hardware répertoire qui appelle le service d'appareil photo. ICameraService est l'interface du service d'appareil photo ; ICameraDeviceUser est l'interface d'un appareil photo ouvert spécifique ; et ICameraServiceListener et ICameraDeviceCallbacks sont les rappels CameraService et CameraDevice respectifs du framework d'application.
service d'appareil photo
Le service d'appareil photo, situé dans frameworks/av/services/camera/libcameraservice/CameraService.cpp, est le code réel qui interagit avec la HAL.
HAL
La couche d'abstraction matérielle définit l'interface standard que le service d'appareil photo appelle et que vous devez implémenter pour que votre matériel d'appareil photo fonctionne correctement.

Implémenter la HAL

La HAL se situe entre le pilote de l'appareil photo et le framework Android de niveau supérieur, et définit une interface que vous devez implémenter pour que les applications puissent utiliser correctement le matériel de l'appareil photo. Les interfaces HIDL pour la HAL de l'appareil photo sont définies dans hardware/interfaces/camera.

Une HAL Binder standard doit implémenter les interfaces HIDL suivantes :

Des implémentations HIDL de référence sont disponibles pour CameraProvider.cpp, CameraDevice.cpp, et CameraDeviceSession.cpp. L'implémentation encapsule les anciennes HAL qui utilisent encore l' ancienne API. À partir d'Android 8.0, les implémentations de la HAL de l'appareil photo doivent utiliser l'API HIDL. L'utilisation de l'ancienne interface n'est pas prise en charge.

Validation des entrées

Comme la HAL a accès à différentes ressources que le service d'appareil photo, la limite entre les deux est traitée comme une limite de sécurité. Cela signifie que les paramètres transmis par le service d'appareil photo sont considérés comme non approuvés et non nettoyés. Pour éviter les failles de sécurité qui permettent aux pirates informatiques d'élever leurs privilèges ou d'accéder à des données auxquelles ils ne sont pas censés avoir accès, la HAL de l'appareil photo doit valider les paramètres transmis par le service d'appareil photo à la HAL. Cela inclut la vérification que les valeurs de longueur du tampon se trouvent dans les plages autorisées et le nettoyage des paramètres avant utilisation et avant de les transmettre aux pilotes matériels ou de noyau.

HAL héritée

Cette section décrit l'architecture des composants HAL hérités et comment implémenter la HAL. Les implémentations de la HAL de l'appareil photo sur Android 8.0 ou version ultérieure doivent utiliser l'API HIDL, décrite ci-dessus.

Architecture (héritée)

La figure et la liste suivantes décrivent les composants HAL hérités de l'appareil photo :

Architecture de l'appareil photo Android

Figure 2. Architecture héritée de l'appareil photo.

framework d'application
Au niveau du framework d'application se trouve le code de l'application, qui utilise l' android.hardware.Camera API pour interagir avec le matériel de l'appareil photo. En interne, ce code appelle une classe de colle JNI correspondante pour accéder au code natif qui interagit avec l' appareil photo.
JNI
Le code JNI associé à 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 accéder à l'appareil photo physique et renvoie les données utilisées pour créer l'objet android.hardware.Camera au niveau du framework.
framework natif
Le framework natif défini dans frameworks/av/camera/Camera.cpp fournit un équivalent natif de la android.hardware.Camera classe. Cette classe appelle les proxys Binder IPC pour accéder au service d'appareil photo.
proxys IPC Binder
Les proxys IPC Binder facilitent la communication au-delà des limites des processus. Trois classes Binder d'appareil photo se trouvent dans le frameworks/av/camera répertoire qui appelle le service d'appareil photo. ICameraService est l'interface du service d'appareil photo, ICamera est l'interface d'un appareil photo ouvert spécifique, et ICameraClient est l'interface de l'appareil vers le framework d'application.
service d'appareil photo
Le service d'appareil photo, situé dans frameworks/av/services/camera/libcameraservice/CameraService.cpp, est le code réel qui interagit avec la HAL.
HAL
La couche d'abstraction matérielle définit l'interface standard que le service d'appareil photo appelle et que vous devez implémenter pour que votre matériel d'appareil photo fonctionne correctement.
pilote de noyau
Le pilote de l'appareil photo interagit avec le matériel de l'appareil photo et votre implémentation de la HAL. L'appareil photo et le pilote doivent être compatibles avec les formats d'image YV12 et NV21 pour permettre l'aperçu de l'image de l'appareil photo sur l' écran et l'enregistrement vidéo.

Implémenter la HAL (héritée)

La HAL se situe entre le pilote de l'appareil photo et le framework Android de niveau supérieur, et définit une interface que vous devez implémenter pour que les applications puissent utiliser correctement le matériel de l'appareil photo. L'interface HAL est définie dans les fichiers d'en-tête hardware/libhardware/include/hardware/camera.h et hardware/libhardware/include/hardware/camera_common.h.

camera_common.h définit camera_module, une structure standard permettant d'obtenir des informations générales sur l'appareil photo, telles que son ID et les propriétés communes à tous les appareils photo (c'est-à-dire s'il s'agit d'un appareil photo avant ou arrière).

camera.h contient le code correspondant à android.hardware.Camera. Ce fichier d'en-tête déclare une camera_device structure qui contient à son tour une camera_device_ops structure avec des pointeurs vers des fonctions qui implémentent l'interface HAL. Pour obtenir de la documentation sur les paramètres de l'appareil photo que les développeurs peuvent définir, consultez frameworks/av/include/camera/CameraParameters.h. Ces paramètres sont définis avec la fonction pointée par int (*set_parameters)(struct camera_device *, const char *parms) dans la HAL.

Pour obtenir un exemple d'implémentation HAL, consultez l'implémentation de la HAL Galaxy Nexus dans hardware/ti/omap4xxx/camera.

Configurer la bibliothèque partagée

Configurez le système de compilation Android pour empaqueter correctement l'implémentation HAL dans une bibliothèque partagée et la copier à l'emplacement approprié en créant un fichier Android.mk :

  1. Créez un device/<company_name>/<device_name>/camera répertoire pour contenir les fichiers sources de votre bibliothèque.
  2. Créez un fichier Android.mk pour compiler la bibliothèque partagée. Assurez-vous que le fichier makefile contient 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ée automatiquement) afin qu'Android puisse charger la bibliothèque correctement. Pour obtenir un exemple, consultez le fichier makefile de l'appareil photo Galaxy Nexus situé dans hardware/ti/omap4xxx/Android.mk.

  3. Spécifiez que votre appareil dispose de fonctionnalités d'appareil photo en copiant les fichiers XML de fonctionnalité nécessaires dans le répertoire frameworks/native/data/etc avec le fichier makefile de votre appareil. Par exemple, pour spécifier que votre appareil dispose d'un flash de l'appareil photo et peut effectuer l'autofocus, ajoutez les lignes suivantes dans le fichier makefile <device>/<company_name>/<device_name>/device.mk de votre appareil :
    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'appareil, consultez device/samsung/tuna/device.mk.

  4. Déclarez les capacités de codec média, de format et de résolution de votre appareil photo dans device/<company_name>/<device_name>/media_profiles.xml et device/<company_name>/<device_name>/media_codecs.xml fichiers XML. Pour en savoir plus, consultez la section Exposer les codecs au framework.
  5. Ajoutez les lignes suivantes dans le fichier makefile de votre appareil pour copier les fichiers media_profiles.xml et media_codecs.xml à l'emplacement approprié :device/<company_name>/<device_name>/device.mk
    # 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, spécifiez-la dans la PRODUCT_PACKAGES variable du fichier makefile device/<company>/<device>/device.mk de votre appareil :
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...