Caméras USB externes

La plate-forme Android prend en charge l'utilisation de caméras USB Plug and Play (c'est-à-dire webcams) en utilisant API Android Camera2 et l'appareil photo CARL de commande. Les webcams prennent généralement en charge Classe vidéo USB (UVC) et sous Linux, la norme 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, comme le chat vidéo et les kiosques photo. Cette fonctionnalité ne remplace pas les requêtes HAL pour appareil photo sur les téléphones Android et n'est pas conçue pour gèrent des tâches complexes et exigeantes en performances impliquant des images haute résolution streaming haute vitesse, RA et contrôle manuel du FAI, des capteurs et de l'objectif.

Le processus HAL de la caméra USB est intégré au fournisseur de la caméra externe écoute la disponibilité des périphériques USB et énumère les appareils photo externes en conséquence. Le processus dispose d'autorisations et d'une stratégie SE semblable à celle d'un processus HAL intégré. Les webcams tierces qui communiquent directement avec des appareils USB nécessitent les mêmes autorisations d'appareil photo pour accéder à UVC comme avec n'importe quelle application d'appareil photo standard.

Exemples et sources

Pour en savoir plus sur l'implémentation d'une caméra USB, reportez-vous à la section "Caméra externe". l'implémentation de la documentation de référence du fournisseur sur ExternalCameraProvider Les implémentations de caméra et de session externe sont incluses dans ExternalCameraDevice et ExternalCameraDeviceSession À partir du niveau d'API 28, l'API cliente Java inclut EXTERNAL au niveau matériel.

Implémentation

L'implémentation doit être compatible avec android.hardware.usb.host du système d'exploitation.

La prise en charge du noyau pour les appareils UVC doit également être activée. Vous pouvez l'activer en en ajoutant 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 la caméra externe dans le build de l'appareil correspondant, ce qui ajoute les autorisations SELinux nécessaires, la configuration de la caméra externe et d'un fournisseur de caméra externe, procédez comme suit:

  • Ajoutez le fichier de configuration de la caméra externe et la bibliothèque de la caméra 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 la caméra externe au fichier manifeste de l'appareil Treble HAL.

    <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 de Treble, 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 droits d'auteur 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 à l'aide d'options de personnalisation générales. ou des optimisations propres à chaque appareil.

Personnalisations générales

Vous pouvez personnaliser le fournisseur de la caméra externe en modifiant le 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 internes
  • Limite supérieure de taille d'image et de fréquence d'images compatibles
  • Nombre de tampons en cours (à-coups par rapport à 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 à chaque appareil

Vous pouvez également améliorer les performances en ajoutant des optimisations spécifiques à chaque 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 la remplacer par spécifiques à chaque appareil.

Format de sortie HAL

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

  • YUV_420_888 pour la mise en mémoire tampon de la vidéo IMPLEMENTATION_DEFINED
  • YUV12 pour tous les autres tampons IMPLEMENTATION_DEFINED

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

Validation

Les appareils compatibles avec les caméras externes doivent CTS pour caméra. Le câble USB externe la webcam doit rester branchée sur l'appareil pendant toute la durée du test ; sinon certains scénarios de test échoueront.