Android 9 a introduit la prise en charge des API pour les appareils multicaméra via un nouvel appareil photo logique composé de deux appareils photo physiques ou plus orientés dans la même direction. L'appareil photo logique est exposé en tant qu'appareil CameraDevice/CaptureSession unique à une application, ce qui permet d'interagir avec les fonctionnalités multicaméra intégrées à HAL. Les applications peuvent éventuellement accéder aux flux, métadonnées et commandes des caméras physiques sous-jacentes, et les contrôler.
Figure 1 : Compatibilité avec plusieurs caméras
Dans ce diagramme, les différents ID de caméra sont codés par couleur. L'application peut diffuser simultanément des tampons bruts de chaque caméra physique. Il est également possible de définir des commandes distinctes et de recevoir des métadonnées distinctes de différentes caméras physiques.
Exemples et sources
Les appareils multicaméra doivent être annoncés avec la fonctionnalité multicaméra logique.
Les clients de la caméra peuvent interroger l'ID de caméra des appareils physiques dont une caméra logique particulière est composée en appelant getPhysicalCameraIds()
.
Les ID renvoyés dans le résultat sont ensuite utilisés pour contrôler individuellement les appareils physiques via setPhysicalCameraId()
.
Les résultats de ces requêtes individuelles peuvent être interrogés à partir du résultat complet en appelant getPhysicalCameraResults()
.
Les requêtes de caméras physiques individuelles ne peuvent accepter qu'un sous-ensemble limité de paramètres. Pour obtenir la liste des paramètres acceptés, les développeurs peuvent appeler getAvailablePhysicalCameraRequestKeys()
.
Les flux de caméras physiques ne sont compatibles qu'avec les requêtes de non-retraitement et uniquement avec les capteurs monochromes et Bayer.
Implémentation
Checklist d'assistance
Pour ajouter des appareils multicaméra logiques côté HAL:
- Ajoutez une fonctionnalité
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
pour tout appareil photo logique basé sur deux caméras physiques ou plus qui sont également exposées à une application. - Renseignez le champ de métadonnées statique
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
avec une liste d'ID d'appareil photo physique. - Renseignez les métadonnées statiques liées à la profondeur requises pour établir une corrélation entre les pixels des flux d'appareils photo physiques :
ANDROID_LENS_POSE_ROTATION
,ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
etANDROID_LENS_POSE_REFERENCE
. Définissez le champ de métadonnées statique
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
sur:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: pour les capteurs en mode principal/principal, aucune synchronisation matérielle de l'obturateur ni de l'exposition n'est effectuée.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: pour les capteurs en mode principal-secondaire, synchronisation de l'obturateur et de l'exposition matériel.
Renseignez
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
avec une liste des paramètres compatibles pour chaque caméra physique. La liste peut être vide si l'appareil logique n'est pas compatible avec les requêtes individuelles.Si les requêtes individuelles sont prises en charge, traitez et appliquez les
physicalCameraSettings
individuels pouvant arriver dans les requêtes de capture, puis ajoutez lesphysicalCameraMetadata
individuels en conséquence.Pour les versions d'appareil Camera HAL 3.5 (introduites dans Android 10) ou ultérieures, renseignez la clé de résultat
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
à l'aide de l'ID de l'appareil photo physique actif actuel qui sert de base à l'appareil photo logique.
Pour les appareils équipés d'Android 9, les appareils photo doivent être compatibles avec le remplacement d'un flux YUV/RAW logique par des flux physiques de la même taille (ne s'applique pas aux flux RAW) et du même format provenant de deux caméras physiques. Cela ne s'applique pas aux appareils équipés d'Android 10.
Pour les appareils équipés d'Android 10 dont la version de l'appareil HAL de l'appareil photo est 3.5 ou ultérieure, l'appareil photo doit être compatible avec isStreamCombinationSupported
pour que les applications puissent interroger si une combinaison de flux particulière contenant des flux physiques est prise en charge.
Carte de configuration des flux
Pour une caméra logique, les combinaisons de flux obligatoires pour l'appareil photo d'un certain niveau matériel sont les mêmes que celles requises dans CameraDevice.createCaptureSession
.
Tous les flux de la carte de configuration des flux doivent être des flux logiques.
Pour un appareil photo logique compatible avec la fonctionnalité RAW avec des sous-caméras physiques de différentes tailles, si une application configure un flux RAW logique, l'appareil photo logique ne doit pas passer à des sous-caméras physiques de différentes tailles de capteur. Cela garantit que les applications de capture RAW existantes ne sont pas endommagées.
Pour profiter du zoom optique implémenté par HAL en basculant entre les sous-caméras physiques lors de la capture RAW, les applications doivent configurer des flux de sous-caméras physiques au lieu d'un flux RAW logique.
Combinaison de flux garantis
La caméra logique et ses caméras physiques sous-jacentes doivent garantir les combinaisons de flux obligatoires requises pour leurs niveaux d'appareil.
Un appareil photo logique doit fonctionner de la même manière qu'un appareil photo physique en fonction de son niveau matériel et de ses fonctionnalités. Il est recommandé d'utiliser un sur-ensemble de fonctionnalités par rapport à celles des caméras physiques individuelles.
Sur les appareils équipés d'Android 9, la caméra logique doit prendre en charge les éléments suivants pour chaque combinaison de flux garanti:
Remplacement d'un flux logique YUV_420_888 ou brut par deux flux physiques de la même taille et du même format, chacun provenant d'une caméra physique distincte, étant donné que la taille et le format sont compatibles avec les caméras physiques.
Ajouter deux flux bruts, un provenant de chaque appareil photo physique, si l'appareil photo logique n'annonce pas la fonctionnalité RAW, alors que les caméras physiques sous-jacentes le font. Cela se produit généralement lorsque les caméras physiques ont des tailles de capteur différentes.
Utilisation de flux physiques au lieu d'un flux logique de la même taille et du même format. Cela ne doit pas ralentir la fréquence d'images de la capture lorsque la durée minimale des images des flux physiques et logiques est identique.
Considérations sur les performances et la consommation d'énergie
Performances :
- La configuration et la diffusion de flux physiques peuvent ralentir le taux de capture de la caméra logique en raison de contraintes liées aux ressources.
- L'application de paramètres physiques de l'appareil photo peut ralentir le débit de capture si les caméras sous-jacentes sont définies sur différentes fréquences d'images.
Alimentation :
- L'optimisation de l'alimentation de HAL continue de fonctionner par défaut.
- La configuration ou la demande de flux physiques peut remplacer l'optimisation de l'alimentation interne de HAL et entraîner une consommation d'énergie plus importante.
Personnalisation
Vous pouvez personnaliser l'implémentation de votre appareil de différentes manières.
- La sortie fusionnée de l'appareil photo logique dépend entièrement de l'implémentation du HAL. La décision concernant la manière dont les flux logiques fusionnés sont dérivés des caméras physiques est transparente pour le framework de l'application et de l'appareil photo Android.
- Les demandes et résultats physiques individuels peuvent être acceptés. L'ensemble des paramètres disponibles dans ces requêtes dépend également entièrement de l'implémentation HAL spécifique.
- À partir d'Android 10, le HAL peut réduire le nombre d'appareils photo pouvant être ouverts directement par une application en choisissant de ne pas diffuser certains ou tous les PHYSICAL_ID dans
getCameraIdList
. L'appel degetPhysicalCameraCharacteristics
doit ensuite renvoyer les caractéristiques de la caméra physique.
Validation
Les appareils multicaméra logiques doivent passer le CTS de la caméra comme n'importe quelle autre caméra standard.
Les cas de test qui ciblent ce type d'appareil se trouvent dans le module LogicalCameraDeviceTest
.
Ces trois tests ITS ciblent les systèmes multicaméras pour faciliter la fusion correcte des images:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
Les tests de la scène 1 et de la scène 4 sont exécutés avec la plate-forme de test ITS-in-a-box. Le test test_multi_camera_match
affirme que la luminosité au centre des images correspond lorsque les deux appareils photo sont activés. Le test test_multi_camera_alignment
affirme que les espacements, les orientations et les paramètres de distorsion de la caméra sont correctement chargés. Si le système multicaméra inclut une caméra à champ de vision large (>90°), la version 2 de la boîte ITS est requise.
Sensor_fusion
est un deuxième banc d'essai qui permet de répéter des mouvements de téléphone prescrits et affirme que les codes temporels du gyroscope et du capteur d'image correspondent et que les images multicaméras sont synchronisées.
Toutes les boîtes sont disponibles auprès d'AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) et de MYWAY Manufacturing (www.myway.tw, sales@myway.tw). De plus, la boîte ITS rev1 peut être achetée via West-Mark (www.west-mark.com, dgoodman@west-mark.com).
Bonnes pratiques
Pour profiter pleinement des fonctionnalités activées par la multicaméra tout en conservant la compatibilité des applications, suivez ces bonnes pratiques lors de l'implémentation d'un appareil multicaméra logique:
- (Android 10 ou version ultérieure) Masquer les sous-caméras physiques dans
getCameraIdList
. Cela réduit le nombre d'appareils photo pouvant être ouverts directement par les applications, ce qui élimine la nécessité d'avoir une logique de sélection d'appareil photo complexe. - (Android 11 ou version ultérieure) Pour un appareil multicaméra logique compatible avec le zoom optique, implémentez l'API
ANDROID_CONTROL_ZOOM_RATIO
et utilisezANDROID_SCALER_CROP_REGION
uniquement pour le recadrage du format.ANDROID_CONTROL_ZOOM_RATIO
permet à l'appareil d'effectuer un zoom arrière et de conserver une meilleure précision. Dans ce cas, le HAL doit ajuster le système de coordonnées deANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
etANDROID_STATISTICS_FACE_LANDMARKS
pour traiter le champ de vision après zoom comme le tableau actif du capteur. Pour en savoir plus sur le fonctionnement deANDROID_SCALER_CROP_REGION
avecANDROID_CONTROL_ZOOM_RATIO
, consultezcamera3_crop_reprocess#cropping
. - Pour les appareils multicaméras avec des caméras physiques aux fonctionnalités différentes, assurez-vous que l'appareil ne déclare la prise en charge d'une certaine valeur ou plage pour une commande que si la plage de zoom complète est compatible avec la valeur ou la plage. Par exemple, si l'appareil photo logique est composé d'un appareil photo ultra grand angle, d'un appareil photo grand angle et d'un appareil à téléobjectif, procédez comme suit :
- Si les tailles de matrice active des caméras physiques sont différentes, le HAL de la caméra doit mapper les matrices actives des caméras physiques sur la matrice active de la caméra logique pour
ANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
etANDROID_STATISTICS_FACE_LANDMARKS
afin que, du point de vue de l'application, le système de coordonnées corresponde à la taille de la matrice active de la caméra logique. - Si les caméras grand angle et téléobjectif sont compatibles avec l'autofocus, mais que la caméra ultra grand angle est à mise au point fixe, assurez-vous que l'appareil photo logique annonce la compatibilité avec l'autofocus. Le HAL doit simuler une machine d'état de mise au point automatique pour l'appareil photo ultra grand angle de sorte que lorsque l'application effectue un zoom arrière sur l'objectif ultra grand angle, la mise au point fixe de la caméra physique sous-jacente est transparente pour l'application. De plus, les machines d'état de mise au point automatique pour les modes de mise au point automatique fonctionnent comme prévu.
- Si les caméras grand-angle et téléobjectif sont compatibles avec la 4K à 60 images par seconde, et que la caméra ultra grand-angle n'est compatible qu'avec la 4K à 30 images par seconde ou le 1080p à 60 images par seconde, mais pas avec la 4K à 60 images par seconde, assurez-vous que la caméra logique n'annonce pas la 4K à 60 images par seconde dans ses configurations de flux compatibles. Cela garantit l'intégrité des fonctionnalités logiques de l'appareil photo, ce qui garantit que l'application ne rencontrera pas le problème de non-atteinte de la résolution 4K à 60 FPS pour une valeur
ANDROID_CONTROL_ZOOM_RATIO
inférieure à 1.
- Si les tailles de matrice active des caméras physiques sont différentes, le HAL de la caméra doit mapper les matrices actives des caméras physiques sur la matrice active de la caméra logique pour
- À partir d'Android 10, il n'est pas nécessaire de disposer d'une multicaméra logique pour accepter les combinaisons de flux incluant des flux physiques.
Si le HAL accepte une combinaison avec des flux physiques :
- (Android 11 ou version ultérieure) Pour mieux gérer les cas d'utilisation tels que la profondeur à partir de la stéréo et du suivi des mouvements, faites en sorte que le champ de vision des sorties de flux physiques soit aussi grand que possible par le matériel. Toutefois, si un flux physique et un flux logique proviennent de la même caméra physique, les limitations matérielles peuvent forcer le champ de vision du flux physique à être identique à celui du flux logique.
- Pour résoudre la pression de mémoire causée par plusieurs flux physiques, assurez-vous que les applications utilisent
discardFreeBuffers
pour désallouer les tampons libres (tampons libérés par le consommateur, mais pas encore retirés de la file d'attente par le producteur) si un flux physique est censé être inactif pendant une période donnée. - Si les flux physiques de différentes caméras physiques ne sont généralement pas associés à la même requête, assurez-vous que les applications utilisent
surface group
afin qu'une file d'attente de tampon soit utilisée pour prendre en charge deux surfaces orientées vers l'application, ce qui réduit la consommation de mémoire.