Caméras USB externes

<!-- Copyright 2018 The Android Open Source Project

Autorisation sous licence Apache, version 2.0 (la "Licence") ; n'utilisez ce fichier que dans le cadre de la Licence. Vous pouvez obtenir une copie de la Licence à l'adresse suivante :

  http://www.apache.org/licenses/LICENSE-2.0

Sauf dispositions légales applicables ou accord écrit préalable, le logiciel distribué dans le cadre de la Licence est fourni "EN L'ÉTAT", À L'EXCLUSION DE TOUTE GARANTIE OU CONDITION DE QUELQUE NATURE QUE CE SOIT, expresse ou implicite. Consultez la Licence pour connaître la langue spécifique qui régit les autorisations et les limitations applicables. -->

La plate-forme Android est compatible avec l'utilisation de caméras USB plug-and-play (c'est-à-dire les webcams) à l'aide de l'API Android Camera2 standard et de l'interface HAL de l'appareil photo. Les webcams sont généralement compatibles avec les pilotes USB Video Class (UVC). Sous Linux, le pilote standard Video4Linux (V4L) est utilisé pour contrôler les caméras UVC.

Grâce à la prise en charge des webcams, les appareils peuvent être utilisés dans des cas d'utilisation légers tels que le chat vidéo et les bornes photo. Cette fonctionnalité ne remplace pas les HAL de caméras internes classiques sur les téléphones Android et n'est pas conçue pour prendre en charge les tâches complexes et gourmandes en ressources impliquant le streaming haute résolution et à haut débit, la RA et le contrôle manuel de l'ISP/du capteur/de l'objectif.

Le processus HAL de la caméra USB fait partie du fournisseur de caméras externes qui écoute la disponibilité des périphériques USB et énumère les caméras externes en conséquence. Le processus dispose d'autorisations et d'une stratégie SE semblables à celles du processus HAL de l'appareil photo intégré. Les applications de webcam tierces qui communiquent directement avec les appareils USB nécessitent les mêmes autorisations d'accès aux appareils UVC que les applications de caméras classiques.

Exemples et sources

Pour en savoir plus sur l'implémentation des caméras USB, consultez l'implémentation de référence du fournisseur de caméras externes sur ExternalCameraProvider. Les implémentations de l'appareil photo externe et de la session sont incluses dans ExternalCameraDevice et ExternalCameraDeviceSession. À partir du niveau d'API 28, l'API du client Java inclut le niveau matériel EXTERNAL.

Implémentation

L'implémentation doit être compatible avec la fonctionnalité système android.hardware.usb.host.

La prise en charge des appareils UVC par le noyau doit également être activée. Pour ce faire, ajoutez les lignes suivantes aux fichiers defconfig du noyau concerné.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Pour activer le fournisseur de caméras externes dans la version de l'appareil concerné, ce qui ajoute les autorisations SELinux nécessaires, la configuration de la caméra externe et la dépendance du fournisseur de caméras externes, procédez comme suit :

  • Ajoutez le fichier de configuration de la caméra externe et la bibliothèque de caméras externes à device.mk.

    +PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service
    
    +PRODUCT_COPY_FILES += \
    +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
    
  • Ajoutez le nom du fournisseur de caméras externes au fichier manifeste HAL Treble de l'appareil.

    <hal format="aidl">
        <name>android.hardware.camera.provider</name>
        <version>1</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>internal/0</instance>
    +       <instance>external/0</instance>
        </interface>
    </hal>
    
  • (Facultatif) Si l'appareil s'exécute en mode Treble passthrough, mettez à jour sepolicy afin que cameraserver puisse accéder à la caméra UVC.

    +# for external camera
    +allow cameraserver device:dir r_dir_perms;
    +allow cameraserver video_device:dir r_dir_perms;
    +allow cameraserver video_device:chr_file rw_file_perms;
    

Voici un exemple de external_camera_config.xml (lignes de copyright omises).

<ExternalCamera>
    <Provider>
        <ignore> <!-- Internal video devices to be ignored by external camera HAL -->
            <id>0</id> <!-- No leading/trailing spaces -->
            <id>1</id>
        </ignore>
    </Provider>
    <!-- See ExternalCameraUtils.cpp for default values of Device configurations below -->
    <Device>
        <!-- Max JPEG buffer size in bytes-->
        <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) -->
        <!-- Size of v4l2 buffer queue when streaming >= 30fps -->
        <!-- Larger value: more request can be cached pipeline (less janky)  -->
        <!-- Smaller value: use less memory -->
        <NumVideoBuffers count="4"/>
        <!-- Size of v4l2 buffer queue when streaming < 30fps -->
        <NumStillBuffers count="2"/>

        <!-- List of maximum fps for various output sizes -->
        <!-- Any image size smaller than the size listed in Limit row will report
            fps (as minimum frame duration) up to the fpsBound value. -->
        <FpsList>
            <!-- width/height must be increasing, fpsBound must be decreasing-->
            <Limit width="640" height="480" fpsBound="30.0"/>
            <Limit width="1280" height="720" fpsBound="15.0"/>
            <Limit width="1920" height="1080" fpsBound="10.0"/>
            <!-- image size larger than the last entry will not be supported-->
        </FpsList>
    </Device>
</ExternalCamera>

Personnalisation

Vous pouvez améliorer l'appareil photo Android grâce à des options de personnalisation générales ou des optimisations spécifiques à l'appareil.

Personnalisations générales

Vous pouvez personnaliser le fournisseur de caméras externes en modifiant le fichier external_camera_config.xml. Plus précisément, les clients peuvent personnaliser les paramètres suivants :

  • Exclure les nœuds vidéo des caméras intérieures
  • Limite supérieure de la taille d'image et de la fréquence d'images acceptées
  • Nombre de tampons en vol (compromis entre saccades et mémoire)

En plus de ces paramètres, vous pouvez ajouter les vôtres ou développer vos propres configurations.

Optimisations spécifiques à l'appareil

Vous pouvez également améliorer les performances en ajoutant des optimisations spécifiques aux appareils.

Copie/mise à l'échelle du tampon et décodage/encodage JPEG

Les implémentations génériques utilisent le CPU (libyuv/libjpeg), mais vous pouvez les remplacer par des optimisations spécifiques à l'appareil.

Format de sortie HAL

Les implémentations génériques utilisent les formats de sortie suivants :

  • YUV_420_888 pour la vidéo IMPLEMENTATION_DEFINED tampons
  • YUV12 pour tous les autres tampons IMPLEMENTATION_DEFINED

Pour améliorer les performances, vous pouvez remplacer les formats de sortie par des formats efficaces spécifiques à l'appareil. Vous pouvez également prendre en charge d'autres formats dans une implémentation personnalisée.

Validation

Les appareils compatibles avec les caméras externes doivent réussir le CTS de la caméra. La webcam USB externe doit rester branchée sur l'appareil spécifique pendant toute la durée du test, sinon certains scénarios de test échoueront.