Diffusion simultanée du flux de la caméra

Android permet aux appareils de prendre en charge le streaming simultané des caméras. Par exemple, cela permet à un appareil d'utiliser simultanément la caméra avant et la caméra arrière. À partir d'Android 11, l'API Camera2 inclut les méthodes suivantes que les applications peuvent appeler pour déterminer si les caméras sont compatibles avec la diffusion simultanée et les configurations de flux compatibles.

  • getConcurrentCameraIds : obtient l'ensemble des combinaisons d'identifiants d'appareils photo actuellement connectés qui permettent de configurer simultanément des sessions d'appareils photo.
  • isConcurrentSessionConfigurationSupported: Vérifie si l'ensemble de caméras fourni et les les configurations de session peuvent être configurées simultanément.

Un ensemble de combinaisons de flux obligatoires qui doivent être acceptées lors de la diffusion simultanée sont incluses dans les caractéristiques de la caméra d'une caméra SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS .

Chaque appareil photo annoncé via getConcurrentStreamingCameraIds() doit prendre en charge les configurations garanties suivantes pour les flux simultanés.

Cible 1 Cible 2
Type Taille maximale Type Taille maximale Exemples de cas d'utilisation
YUV s1440p Traitement des vidéos ou des images dans l'application
PRIV S1440p Analyse du viseur dans l'application
JPEG S1440p Impossible de prendre une photo avec l'appareil photo
YUV / PRIV s720p JPEG S1440p Imagerie fixe standard
YUV/PRIV S720p YUV / PRIV s1440p Vidéo dans l'application ou traitement avec aperçu

Appareils ayant la capacité MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES). inclut CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME). la prise en charge de Y8 doit pouvoir remplacer les flux YUV par Y8 dans tous les cas des combinaisons de flux.

s720p fait référence à 720p (1 280 x 720) ou à la résolution maximale acceptée pour format particulier renvoyé par StreamConfigurationMap.getOutputSizes() s1440p fait référence à 1440p (1 920 x 1 440) ou à la résolution maximale prise en charge pour le format particulier renvoyé par StreamConfigurationMap.getOutputSizes(). Appareils dont les fonctionnalités n'incluent pas les fonctionnalités suivantes : ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE doit accepter au moins un flux Y16, Dataspace::DEPTH avec sVGA lors d'opérations simultanées, où sVGA est le plus petit des deux les résolutions suivantes:

  • résolution de sortie maximale pour le format donné
  • 640 x 480

Implémentation

Pour permettre aux applications d'interroger un appareil pour déterminer sont compatibles avec les flux simultanés, mettez en œuvre ICameraProvider@2.6 Interface HAL, qui comprend les méthodes suivantes:

Pour obtenir une implémentation de référence de l'interface ICameraProvider@2.6HAL, consultez la bibliothèque HAL de la caméra émulée EmulatedCameraProviderHWLImpl.cpp

Validation

Pour vérifier que votre implémentation de cette fonctionnalité fonctionne comme prévu, utilisez le test CTS ConcurrentCameraTest.java. Testez également à l'aide d'une application qui ouvre plusieurs caméras et les fait fonctionner simultanément.

Problèmes d'allocation de ressources

Si les HAL de l'appareil photo annoncent la prise en charge du fonctionnement simultané des appareils photo, ils peuvent rencontrer des problèmes d'allocation de ressources, en particulier s'il existe suffisamment de ressources de processeur de signal d'image (ISP) sur le téléphone pour diffuser simultanément les caméras avant et arrière (ou d'autres), mais pas à leur pleine capacité. Dans ce cas, l'HAL de la caméra doit allouer des ressources ressources matérielles spécifiques à chaque appareil photo.

Exemple de scénario

Le scénario suivant illustre ce problème.

Problème

L'appareil présente la configuration suivante :

  • L'ID de l'appareil photo 0 est un appareil photo logique doté d'un objectif grand angle et d'un ultra grand angle caméra, qui utilisent chacun une ressource FAI.
  • L'ID d'appareil photo 1 est un appareil photo qui utilise une ressource FAI.

L'appareil (téléphone) est associé à deux FAI. Si l'ID d'appareil photo 0 est ouvert et qu'une session est il est possible que le HAL de la caméra réserve deux FAI à la fois l'objectif ultra grand angle et l'appareil photo grand angle.

Dans ce cas, sachez que la caméra avant (ID 1) ne peut pas en configurer flux car les deux FAI sont utilisés.

Solution

Pour résoudre ce problème, le framework peut ouvrir les ID d'appareil photo 0 et 1. avant de configurer des sessions pour indiquer au HAL de la caméra comment alloue des ressources (car il attend désormais un fonctionnement simultané des caméras). Toutefois, cela peut limiter les capacités, par exemple, le zoom n'est pas gérer tout le ratio de la plage de zoom (car le fait de changer d'appareil photo les identifiants peuvent poser problème).

Pour implémenter cette solution, effectuez les mises à jour suivantes dans provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds

  • exiger que, pour le fonctionnement simultané des caméras, le framework doit ouvrir les appareils photo (@3.2::ICameraDevice::open) avant la configuration des sessions sur les caméras. Cela permet à l'appareil photo d'allouer les ressources en conséquence.

  • Pour résoudre le problème d'impossibilité de gérer le rapport de la plage de zoom complète, assurez-vous que les applications d'appareil photo, lorsqu'elles utilisent des appareils photo simultanément, utilisent le paramètre de commande ZOOM_RATIO entre 1x et MAX_DIGITAL_ZOOM uniquement au lieu de ZOOM_RATIO_RANGE complet (cela empêche le basculement des caméras physiques en interne, ce qui nécessite potentiellement plus d'ISP).

Problème avec testDualCameraPreview

Les mises à jour ci-dessus peuvent entraîner un problème avec un comportement autorisé. par le test MultiViewTest.java#testDualCameraPreview.

Le test testDualCameraPreview ne configure pas les sessions qu'après avoir ouvert toutes les caméras. Elle se déroule comme suit:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

En revanche, il tolère les défaillances d'ouverture de l'appareil photo ERROR_MAX_CAMERAS_IN_USE [1] Les applications tierces peuvent dépendre de ce comportement.

Parce que l'HAL de la caméra ne sait pas que tous les ID de caméra sont ouverts pour des opérations simultanées avant de configurer des sessions, il peut être difficile de allouent des ressources matérielles (en supposant qu'elles soient mises en concurrence).

Pour résoudre ce problème, tout en conservant la rétrocompatibilité et en prenant en charge le streaming simultané, les HAL de l'appareil photo doivent échouer les appels openCamera avec ERROR_MAX_CAMERAS_IN_USE s'ils ne sont pas compatibles avec la configuration complète du flux pour toutes les caméras exécutées simultanément.