Android permet aux appareils de prendre en charge le streaming simultané des caméras. Par exemple, cela permet à un appareil d'utiliser simultanément les caméras avant et 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 de caméras actuellement connectées qui permettent de configurer des sessions de caméras simultanément.isConcurrentSessionConfigurationSupported
: Vérifie si l'ensemble fourni de périphériques de caméras et leurs configurations de session correspondantes peuvent être configurés simultanément.
Un ensemble de combinaisons de flux obligatoires qui doivent être prises en charge lors de la diffusion simultanée est inclus dans les caractéristiques de la caméra d'un appareil photo dans la propriété SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
.
Chaque caméra annoncée via getConcurrentStreamingCameraIds()
doit être compatible avec les configurations garanties suivantes pour les flux simultanés.
Cible 1 | Objectif 2 | |||
---|---|---|---|---|
Saisie | Taille maximale | Saisie | Taille maximale | Exemples de cas d'utilisation |
YUV | s1440p | Traitement d'images ou de vidéos dans une application | ||
PRIV | s1440p | Analyse du viseur dans l'application | ||
JPEG | s1440p | Pas de capture d'image fixe dans le viseur | ||
YUV / PRIV | s720p | JPEG | s1440p | Imagerie fixe standard |
YUV / PRIV | s720p | YUV / PRIV | s1440p | Vidéo ou traitement dans une application avec aperçu |
Les appareils dotés de la fonctionnalité MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
, y compris CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
) compatibles avec Y8 doivent permettre de remplacer les flux YUV par Y8 dans toutes les combinaisons de flux garanties.
s720p
fait référence à la résolution 720p (1 280 x 720) ou à la résolution maximale acceptée pour le format spécifique renvoyé par StreamConfigurationMap.getOutputSizes()
.
s1440p
fait référence à 1440p (1920 x 1440) ou à la résolution maximale acceptée pour le format spécifique renvoyé par StreamConfigurationMap.getOutputSizes()
.
Les appareils dont les fonctionnalités n'incluent pas ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
doivent prendre en charge au moins un flux Y16, Dataspace::DEPTH
avec une résolution sVGA, lors d'un fonctionnement simultané, où sVGA est la plus petite des deux 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 afin de déterminer si ses caméras sont compatibles avec le streaming simultané, implémentez l'interface HAL ICameraProvider@2.6
, qui inclut les méthodes suivantes :
Pour obtenir une implémentation de référence de l'interface HAL ICameraProvider@2.6
, consultez la bibliothèque HAL de l'appareil photo émulé sur EmulatedCameraProviderHWLImpl.cpp
.
Validation
Pour vérifier que votre implémentation de cette fonctionnalité fonctionne comme prévu, utilisez le test ConcurrentCameraTest.java
du CTS. Testez également l'application à 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 caméras annoncent la prise en charge du fonctionnement simultané des appareils photo, ils peuvent rencontrer des problèmes d'allocation de ressources, en particulier dans le cas où le téléphone dispose de suffisamment de ressources de processeur de signal d'image (ISP) pour diffuser simultanément les caméras avant et arrière (ou d'autres), mais pas à leur pleine capacité. Dans ce cas, le HAL de l'appareil photo doit allouer des ressources matérielles limitées à 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 caméra
0
est une caméra logique soutenue par une caméra grand-angle et une caméra ultra grand-angle, qui utilisent chacune une ressource ISP. - L'ID de caméra
1
est une caméra qui utilise une ressource ISP.
L'appareil (téléphone) dispose de deux FAI. Si l'ID de caméra 0
est ouvert et qu'une session est configurée, il est possible que le HAL de la caméra réserve deux ISP en prévision de l'utilisation des caméras ultra grand-angle et grand-angle.
Dans ce cas, la caméra avant (ID 1
) ne peut configurer aucun flux, car les deux FAI sont utilisés.
Solution
Pour résoudre ce problème, le framework peut ouvrir les ID de caméra 0
et 1
avant de configurer les sessions afin de fournir un indice au HAL de la caméra sur la façon d'allouer les ressources (car il s'attend désormais à un fonctionnement simultané des caméras).
Toutefois, cela peut entraîner des capacités limitées. Par exemple, le zoom peut ne pas être en mesure de gérer le rapport de plage de zoom complet (car le changement d'ID de caméra physique peut être problématique).
Pour mettre en œuvre cette solution, apportez les modifications suivantes à provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Exigez que, pour le fonctionnement simultané des caméras, le framework de la caméra ouvre les périphériques de caméra (
@3.2::ICameraDevice::open
) avant de configurer des sessions sur les périphériques de caméra. Cela permet aux fournisseurs de caméras d'allouer les ressources en conséquence.Pour résoudre le problème d'impossibilité de gérer le rapport de plage de zoom complète, assurez-vous que les applications de caméras, lorsqu'elles utilisent des caméras simultanément, sont garanties d'utiliser le paramètre de contrôle
ZOOM_RATIO
uniquement entre 1x etMAX_DIGITAL_ZOOM
au lieu deZOOM_RATIO_RANGE
complet (cela empêche le changement de caméras physiques en interne, ce qui nécessite potentiellement plus d'ISP).
Problème lié à testDualCameraPreview
Lorsque vous effectuez les modifications ci-dessus, cela peut créer un problème avec un comportement autorisé par le test MultiViewTest.java#testDualCameraPreview
.
Le test testDualCameraPreview
ne configure pas les sessions uniquement après l'ouverture de toutes les caméras. Voici la séquence à suivre :
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Toutefois, il tolère les échecs d'ouverture de l'appareil photo avec ERROR_MAX_CAMERAS_IN_USE [1]
. Il est possible que des applications tierces dépendent de ce comportement.
Étant donné que le HAL de l'appareil photo ne connaîtra pas l'ensemble complet d'ID d'appareil photo ouverts pour un fonctionnement simultané avant de configurer les sessions, il peut être difficile pour lui d'allouer des ressources matérielles (en supposant qu'il y ait une certaine concurrence pour elles).
Pour résoudre ce problème, en plus de maintenir la rétrocompatibilité et de prendre en charge le streaming simultané, les HAL de caméras doivent échouer les appels openCamera
avec ERROR_MAX_CAMERAS_IN_USE
s'ils ne peuvent pas prendre en charge la configuration complète du flux pour toutes les caméras fonctionnant simultanément.