Caméras USB externes

La plate-forme Android prend en charge 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 de caméra HAL . Les webcams prennent généralement en charge les pilotes USB Video Class (UVC) et 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 kiosques photo. Cette fonctionnalité ne remplace pas les HAL de caméra interne typiques 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 un streaming haute résolution et haute vitesse, AR et un contrôle manuel FAI/capteur/objectif.

Le processus HAL de la caméra USB fait partie du fournisseur de caméra externe qui écoute la disponibilité des périphériques USB et énumère les périphériques de caméra externes en conséquence. Le processus dispose d'autorisations et d'une politique SE similaire au processus HAL de la caméra intégrée. Les applications de webcam tierces qui communiquent directement avec les périphériques USB nécessitent les mêmes autorisations de caméra pour accéder aux appareils UVC que n'importe quelle application de caméra classique.

Exemples et sources

Pour plus d’informations sur la façon d’implémenter des caméras USB, consultez l’implémentation de référence du fournisseur de caméra externe sur ExternalCameraProvider . Le périphérique de caméra externe et les implémentations de session sont inclus dans ExternalCameraDevice et ExternalCameraDeviceSession . À partir du niveau d'API 28, l'API du client Java inclut le niveau matériel EXTERNAL .

Mise en œuvre

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. Vous pouvez l'activer en ajoutant ce qui suit aux fichiers defconfig respectifs du noyau.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Pour activer le fournisseur de caméra externe dans la version de périphérique respective, 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 manifeste Treble HAL 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 fonctionne 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 la caméra 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 de caméra externe en modifiant le fichier external_camera_config.xml . Plus précisément, les clients peuvent personnaliser les paramètres suivants :

  • Hors nœuds vidéo des caméras internes
  • Taille d'image et limite supérieure de fréquence d'images prises en charge
  • Nombre de tampons en vol (compromis jenk vs 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 du tampon et décodage/encodage JPEG

Les implémentations génériques utilisent le CPU (libyuv/libjpeg) mais vous pouvez le remplacer par des optimisations spécifiques au périphérique.

Format de sortie HAL

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

  • YUV_420_888 pour les tampons 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 efficaces spécifiques au périphérique. Vous pouvez également prendre en charge des formats supplémentaires dans une implémentation personnalisée

Validation

Les appareils prenant en charge une caméra externe 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 cas de test échoueront.