Caméras USB externes

La plate-forme Android est compatible avec l'utilisation de caméras USB plug-and-play (c'est-à-dire des 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 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 d'appareil photo internes standards sur les téléphones Android et n'est pas conçue pour prendre en charge des tâches complexes et gourmandes en performances impliquant le streaming haute résolution et à grande vitesse, 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 d'appareil photo 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 l'appareil photo intégré. Les applications de webcam tierces qui communiquent directement avec des appareils USB nécessitent les mêmes autorisations d'appareil photo pour accéder aux appareils UVC que pour toute application d'appareil photo standard.

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 d'appareils photo externes sur ExternalCameraProvider. Les implémentations de l'appareil et de la session de la caméra externe sont incluses dans ExternalCameraDevice et ExternalCameraDeviceSession. À partir du niveau d'API 28, l'API cliente Java inclut le niveau matériel EXTERNAL.

Implémentation

L'implémentation doit prendre en charge la fonctionnalité système android.hardware.usb.host.

La prise en charge du noyau pour les appareils UVC doit également être activée. Pour ce faire, ajoutez les éléments suivants aux fichiers defconfig du noyau respectif.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Pour activer le fournisseur d'appareil photo externe dans le build de l'appareil respectif, ce qui ajoute les autorisations SELinux nécessaires, la configuration de l'appareil photo externe et la dépendance du fournisseur d'appareil photo externe, procédez comme suit:

  • Ajoutez le fichier de configuration de l'appareil photo externe et la bibliothèque de l'appareil photo externe à 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 (les lignes de droits d'auteur sont 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 via des options de personnalisation générales ou des optimisations spécifiques à l'appareil.

Personnalisations générales

Vous pouvez personnaliser le fournisseur d'appareil photo externe 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
  • Taille d'image et fréquence d'images maximales compatibles
  • Nombre de mémoires tampons en cours de transmission (compromis entre latence et 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 de la mémoire tampon et décodage/encodage JPEG

Les implémentations génériques utilisent le processeur (libyuv/libjpeg), mais vous pouvez le 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 appareils photo externes doivent réussir le CTS de la caméra. La webcam USB externe doit rester branchée à l'appareil spécifique pendant toute la durée de l'exécution du test, sinon certains cas de test échoueront.