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
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->
La plate-forme Android est compatible avec les caméras USB plug-and-play (c'est-à-dire les webcams) via l'API Android Camera2 standard et 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 Video4Linux (V4L) 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 d'appareil photo internes standards sur les téléphones Android et n'est pas conçue pour prendre en charge les tâches complexes et gourmandes en performances impliquant un streaming haute résolution et haut débit, 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 caméras externes en conséquence. Le processus dispose d'autorisations et d'une règle 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 à l'appareil photo pour accéder aux appareils UVC que n'importe quelle 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 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 cliente 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 compatibilité du kernel avec 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 de caméra externe dans la compilation 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é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.xmlAjoutez le nom du fournisseur de la 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>Liez l'instance du fournisseur de caméra AIDL
external/0àhal_camera_servicedans le fichiersepolicy/service_contextsde l'appareil. Pour en savoir plus, consultez SEPolicy pour les HAL AIDL.android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0(Facultatif) Si l'appareil s'exécute en mode passthrough Treble, mettez à jour
sepolicypour quecameraserverpuisse 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 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 :
- Exclure les nœuds vidéo des caméras internes
- Taille d'image et limite supérieure de fréquence d'images compatibles
- Nombre de tampons en cours (compromis entre à-coups 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 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_888pour les tampons vidéoIMPLEMENTATION_DEFINEDYUV12pour tous les autres tamponsIMPLEMENTATION_DEFINED
Pour améliorer les performances, vous pouvez remplacer les formats de sortie par des formats efficaces spécifiques à l'appareil. Vous pouvez également accepter d'autres formats dans une implémentation personnalisée.
Validation
Les appareils compatibles avec 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 scénarios de test échoueront.