Caméras USB externes

<!-- Copyright 2018 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. 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. Reportez-vous à la Licence pour connaître les conditions régissant les autorisations et les limites définies par la Licence. -->

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

Grâce à la compatibilité avec les webcams, les appareils peuvent être utilisés dans des cas d'utilisation légers, tels que les chats vidéo et les bornes photo. Cette fonctionnalité ne remplace pas les HAL de caméra 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 la diffusion en streaming haute résolution et haute vitesse, la RA et le contrôle manuel du FAI/capteur/objectif.

Le processus HAL de la caméra USB fait partie du fournisseur de caméra externe qui écoute la disponibilité des appareils USB et énumère les appareils photo externes en conséquence. Le processus dispose d'autorisations et d'une stratégie SE semblables à celles du processus HAL de la caméra intégrée. 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 n'importe quelle application de caméra classique.

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éra externe dans 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 client Java inclut le EXTERNAL niveau de matériel.

Implémentation

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

La compatibilité du noyau avec les appareils UVC doit également être activée. Pour ce faire, ajoutez les éléments suivants aux fichiers defconfig du noyau respectifs.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Pour activer le fournisseur de caméra externe dans la version de l'appareil correspondante, ce qui ajoute les autorisations SELinux nécessaires, la configuration de la caméra externe et la dépendance du fournisseur de caméra externe, 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éra externe 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 passthrough Treble, mettez à jour sepolicy pour 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 la caméra 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éra externe en modifiant le fichier external_camera_config.xml. Plus précisément, les clients peuvent personnaliser les paramètres suivants :

  • Exclusion des nœuds vidéo des caméras internes
  • Limite supérieure de la taille d'image et de la fréquence d'images compatibles
  • Nombre de tampons en vol (compromis entre les à-coups et la mémoire)

En plus de ces paramètres, vous pouvez ajouter vos propres paramè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 à l'appareil.

Copie/mise à l'échelle des tampons et décodage/encodage JPEG

Les implémentations génériques utilisent le processeur (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 les tampons IMPLEMENTATION_DEFINED vidéo
  • 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 des formats supplémentaires dans une implémentation personnalisée.

Validation

Les appareils compatibles avec les caméras externes doivent réussir le test 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 cas de test échoueront.