Android 9 führte die API-Unterstützung für Geräte mit mehreren Kameras durch ein neues logisches Kameragerät ein, das aus zwei oder mehr physischen Kamerageräten besteht, die in die gleiche Richtung zeigen. Das logische Kameragerät wird als einzelnes CameraDevice/CaptureSession für eine App bereitgestellt, die eine Interaktion mit HAL-integrierten Multikamerafunktionen ermöglicht. Apps können optional auf zugrunde liegende physische Kamerastreams, Metadaten und Steuerelemente zugreifen und diese steuern.
Abbildung 1 . Unterstützung mehrerer Kameras
In diesem Diagramm sind verschiedene Kamera-IDs farblich gekennzeichnet. Die App kann Rohpuffer von jeder physischen Kamera gleichzeitig streamen. Es ist auch möglich, separate Steuerelemente festzulegen und separate Metadaten von verschiedenen physischen Kameras zu erhalten.
Beispiele und Quellen
Geräte mit mehreren Kameras müssen mit der logischen Multikamera-Fähigkeit beworben werden.
Kameraclients können die Kamera-ID der physischen Geräte abfragen, aus denen eine bestimmte logische Kamera besteht, indem sie getPhysicalCameraIds()
aufrufen. Die als Teil des Ergebnisses zurückgegebenen IDs werden dann verwendet, um physische Geräte einzeln über setPhysicalCameraId()
zu steuern. Die Ergebnisse solcher Einzelanfragen können aus dem vollständigen Ergebnis abgefragt werden, indem getPhysicalCameraResults()
wird.
Einzelne physische Kameraanforderungen unterstützen möglicherweise nur eine begrenzte Teilmenge von Parametern. Um eine Liste der unterstützten Parameter zu erhalten, können Entwickler getAvailablePhysicalCameraRequestKeys()
aufrufen.
Physische Kamerastreams werden nur für Anfragen ohne erneute Verarbeitung und nur für Monochrom- und Bayer-Sensoren unterstützt.
Implementierung
Support-Checkliste
So fügen Sie logische Geräte mit mehreren Kameras auf der HAL-Seite hinzu:
- Fügen Sie eine
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
Funktion für jedes logische Kameragerät hinzu, das von zwei oder mehr physischen Kameras unterstützt wird, die auch einer App ausgesetzt sind. - Füllen Sie das statische Metadatenfeld
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
mit einer Liste physischer Kamera-IDs aus. - Füllen Sie die tiefenbezogenen statischen Metadaten aus, die für die Korrelation zwischen den Pixeln der physischen Kamerastreams erforderlich sind:
ANDROID_LENS_POSE_ROTATION
,ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. Setzen Sie das statische Metadatenfeld
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
auf:-
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: Für Sensoren im Master-Master-Modus, keine Hardware-Shutter/Belichtungssynchronisation. -
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: Für Sensoren im Master-Slave-Modus Hardware-Shutter/Belichtungssynchronisierung.
-
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
mit einer Liste unterstützter Parameter für einzelne physische Kameras. Die Liste kann leer sein, wenn das logische Gerät einzelne Anforderungen nicht unterstützt.Wenn einzelne Anforderungen unterstützt werden, verarbeiten und wenden Sie die einzelnen
physicalCameraSettings
an, die als Teil von Erfassungsanforderungen eintreffen können, und hängen Sie die einzelnenphysicalCameraMetadata
entsprechend an.Füllen Sie für Kamera-HAL-Geräteversionen 3.5 (eingeführt in Android 10) oder höher den Ergebnisschlüssel
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
mit der ID der aktuell aktiven physischen Kamera, die die logische Kamera unterstützt.
Bei Geräten mit Android 9 müssen Kamerageräte das Ersetzen eines logischen YUV/RAW-Streams durch physische Streams derselben Größe (gilt nicht für RAW-Streams) und desselben Formats von zwei physischen Kameras unterstützen. Dies gilt nicht für Geräte mit Android 10.
Für Geräte mit Android 10, bei denen die Kamera-HAL-Geräteversion 3.5 oder höher ist, muss das Kameragerät isStreamCombinationSupported
unterstützen, damit Apps abfragen können, ob eine bestimmte Stream-Kombination mit physischen Streams unterstützt wird.
Stream-Konfigurationskarte
Für eine logische Kamera sind die obligatorischen Stream-Kombinationen für das Kameragerät einer bestimmten Hardwarestufe identisch mit denen, die in CameraDevice.createCaptureSession
erforderlich sind. Alle Streams in der Stream-Konfigurationszuordnung müssen logische Streams sein.
Für ein logisches Kameragerät, das RAW-Fähigkeit mit physischen Subkameras unterschiedlicher Größe unterstützt, darf das logische Kameragerät nicht zu physischen Subkameras mit unterschiedlichen Sensorgrößen wechseln, wenn eine App einen logischen RAW-Stream konfiguriert. Dadurch wird sichergestellt, dass vorhandene RAW-Erfassungs-Apps nicht kaputt gehen.
Um den von HAL implementierten optischen Zoom durch Umschalten zwischen physischen Subkameras während der RAW-Aufnahme zu nutzen, müssen Apps physische Subkamera-Streams anstelle eines logischen RAW-Streams konfigurieren.
Garantierte Stream-Kombination
Sowohl die logische Kamera als auch ihre zugrunde liegenden physischen Kameras müssen die obligatorischen Stream-Kombinationen garantieren, die für ihre Geräteebenen erforderlich sind.
Ein logisches Kameragerät sollte basierend auf seiner Hardwarestufe und seinen Fähigkeiten genauso funktionieren wie ein physisches Kameragerät. Es wird empfohlen, dass der Funktionssatz eine Obermenge der einzelnen physischen Kameras ist.
Auf Geräten mit Android 9 muss die logische Kamera für jede garantierte Stream-Kombination Folgendes unterstützen:
Ersetzen eines logischen YUV_420_888- oder RAW-Streams durch zwei physische Streams derselben Größe und desselben Formats, jeweils von einer separaten physischen Kamera, vorausgesetzt, dass die Größe und das Format von den physischen Kameras unterstützt werden.
Hinzufügen von zwei RAW-Streams, einen von jeder physischen Kamera, wenn die logische Kamera keine RAW-Fähigkeit ankündigt, die zugrunde liegenden physischen Kameras jedoch. Dies tritt normalerweise auf, wenn die physischen Kameras unterschiedliche Sensorgrößen haben.
Verwenden von physischen Streams anstelle eines logischen Streams derselben Größe und desselben Formats. Dies darf die Framerate der Erfassung nicht verlangsamen, wenn die minimale Framedauer der physischen und logischen Streams gleich ist.
Leistungs- und Energieüberlegungen
Leistung:
- Das Konfigurieren und Streamen von physischen Streams kann die Erfassungsrate der logischen Kamera aufgrund von Ressourcenbeschränkungen verlangsamen.
- Das Anwenden physischer Kameraeinstellungen kann die Aufnahmerate verlangsamen, wenn die zugrunde liegenden Kameras in unterschiedliche Bildraten versetzt werden.
Leistung:
- Die Leistungsoptimierung von HAL arbeitet im Standardfall weiter.
- Das Konfigurieren oder Anfordern von physischen Streams kann die interne Energieoptimierung von HAL außer Kraft setzen und einen höheren Stromverbrauch verursachen.
Anpassung
Sie können Ihre Geräteimplementierung auf folgende Weise anpassen.
- Der verschmolzene Ausgang des logischen Kamerageräts hängt vollständig von der HAL-Implementierung ab. Die Entscheidung, wie fusionierte logische Streams von den physischen Kameras abgeleitet werden, ist für die App und das Android-Kamera-Framework transparent.
- Individuelle physische Anfragen und Ergebnisse können optional unterstützt werden. Der Satz verfügbarer Parameter in solchen Anforderungen hängt auch vollständig von der spezifischen HAL-Implementierung ab.
- Ab Android 10 kann die HAL die Anzahl der Kameras reduzieren, die direkt von einer App geöffnet werden können, indem sie sich dafür entscheidet, einige oder alle PHYSICAL_IDs nicht in
getCameraIdList
. Der AufrufgetPhysicalCameraCharacteristics
muss dann die Eigenschaften der physischen Kamera zurückgeben.
Validierung
Logische Geräte mit mehreren Kameras müssen Kamera-CTS wie jede andere normale Kamera passieren. Die Testfälle, die auf diesen Gerätetyp abzielen, finden Sie im LogicalCameraDeviceTest
-Modul.
Diese drei ITS-Tests zielen auf Mehrkamerasysteme ab, um die ordnungsgemäße Zusammenführung von Bildern zu erleichtern:
-
scene1/test_multi_camera_match.py
-
scene4/test_multi_camera_alignment.py
-
sensor_fusion/test_multi_camera_frame_sync.py
Die Tests Szene 1 und Szene 4 laufen mit dem ITS-in-a-Box -Prüfstand. Der Test test_multi_camera_match
behauptet, dass die Helligkeit der Mitte der Bilder übereinstimmt, wenn beide Kameras aktiviert sind. Der Test test_multi_camera_alignment
, dass Kameraabstände, Ausrichtungen und Verzerrungsparameter richtig geladen sind. Wenn das Multikamerasystem eine Wide FoV-Kamera (>90o) enthält, ist die rev2-Version der ITS-Box erforderlich.
Sensor_fusion
ist ein zweiter Prüfstand, der wiederholte, vorgeschriebene Telefonbewegungen ermöglicht und bestätigt, dass die Zeitstempel des Gyroskops und des Bildsensors übereinstimmen und dass die Multikamera-Frames synchron sind.
Alle Boxen sind über AcuSpec, Inc. ( www.acuspecinc.com , fred@acuspecinc.com) und MYWAY Manufacturing ( www.myway.tw , sales@myway.tw) erhältlich. Darüber hinaus kann die rev1 ITS-Box über West-Mark ( www.west-mark.com , dgoodman@west-mark.com) erworben werden.
Empfohlene Vorgehensweise
Um die Vorteile der Multi-Kamera-Funktionen voll auszuschöpfen und gleichzeitig die App-Kompatibilität aufrechtzuerhalten, befolgen Sie diese Best Practices bei der Implementierung eines logischen Multi-Kamera-Geräts:
- (Android 10 oder höher) Physische Subkameras von
getCameraIdList
. Dies reduziert die Anzahl der Kameras, die direkt von Apps geöffnet werden können, wodurch die Notwendigkeit für Apps entfällt, über eine komplexe Kameraauswahllogik zu verfügen. - (Android 11 oder höher) Implementieren Sie für ein logisches Gerät mit mehreren Kameras, das optischen Zoom unterstützt, die API
ANDROID_CONTROL_ZOOM_RATIO
und verwendenANDROID_SCALER_CROP_REGION
nur zum Zuschneiden des Seitenverhältnisses.ANDROID_CONTROL_ZOOM_RATIO
ermöglicht es dem Gerät, herauszuzoomen und eine bessere Präzision beizubehalten. In diesem Fall muss die HAL das Koordinatensystem vonANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
undANDROID_STATISTICS_FACE_LANDMARKS
, um das Post-Zoom-Sichtfeld als das aktive Sensorarray zu behandeln. Weitere Informationen darüber, wieANDROID_SCALER_CROP_REGION
mitANDROID_CONTROL_ZOOM_RATIO
zusammenarbeitet, finden Sie untercamera3_crop_reprocess#cropping
. - Stellen Sie bei Geräten mit mehreren Kameras und physischen Kameras mit unterschiedlichen Funktionen sicher, dass das Gerät die Unterstützung für einen bestimmten Wert oder Bereich für ein Steuerelement nur ankündigt, wenn der gesamte Zoombereich den Wert oder Bereich unterstützt. Wenn die logische Kamera beispielsweise aus einer Ultraweitwinkel-, einer Weitwinkel- und einer Telekamera besteht, gehen Sie wie folgt vor:
- Wenn die Größen der aktiven Arrays der physischen Kameras unterschiedlich sind, muss die Kamera-HAL die Zuordnung von den aktiven Arrays der physischen Kameras zu den aktiven Arrays der logischen Kamera für
ANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
undANDROID_STATISTICS_FACE_LANDMARKS
vornehmen, damit diese von den Apps stammen Perspektive ist das Koordinatensystem die Größe des aktiven Arrays der logischen Kamera. - Wenn die Weitwinkel- und Telekameras den Autofokus unterstützen, die Ultraweitwinkelkamera jedoch einen festen Fokus hat, stellen Sie sicher, dass die logische Kamera die Autofokus-Unterstützung ankündigt. Die HAL muss eine Autofokus-Zustandsmaschine für die Ultrawide-Kamera simulieren, damit beim Herauszoomen der App auf das Ultrawide-Objektiv die Tatsache, dass die zugrunde liegende physische Kamera fest fokussiert ist, für die App und die Autofokus-Zustandsmaschinen für die unterstützten AF-Modi transparent ist funktionieren wie erwartet.
- Wenn die Weitwinkel- und Telekameras 4K @ 60 fps unterstützen und die Ultrawide-Kamera nur 4K @ 30 fps oder 1080p @ 60 fps unterstützt, aber nicht 4K @ 60 fps, stellen Sie sicher, dass die logische Kamera nicht 4k @ 60 fps ankündigt seine unterstützten Stream-Konfigurationen. Dies garantiert die Integrität der logischen Kamerafunktionen und stellt sicher, dass die App nicht auf das Problem stößt, 4k @ 60 fps bei einem
ANDROID_CONTROL_ZOOM_RATIO
Wert von weniger als 1 nicht zu erreichen.
- Wenn die Größen der aktiven Arrays der physischen Kameras unterschiedlich sind, muss die Kamera-HAL die Zuordnung von den aktiven Arrays der physischen Kameras zu den aktiven Arrays der logischen Kamera für
- Ab Android 10 ist keine logische Multi-Kamera erforderlich, um Stream-Kombinationen zu unterstützen, die physische Streams enthalten. Wenn die HAL eine Kombination mit physischen Streams unterstützt:
- (Android 11 oder höher) Um Anwendungsfälle wie Tiefe von Stereo und Bewegungsverfolgung besser handhaben zu können, machen Sie das Sichtfeld der physischen Stream-Ausgänge so groß wie dies durch die Hardware erreicht werden kann. Wenn jedoch ein physischer Stream und ein logischer Stream von derselben physischen Kamera stammen, können Hardwareeinschränkungen dazu führen, dass das Sichtfeld des physischen Streams mit dem des logischen Streams identisch ist.
- Um den durch mehrere physische Streams verursachten Speicherdruck zu beheben, stellen Sie sicher, dass Apps
discardFreeBuffers
verwenden, um die freien Puffer (Puffer, die vom Verbraucher freigegeben, aber noch nicht aus der Warteschlange entfernt wurden) freizugeben, wenn erwartet wird, dass ein physischer Stream für einen bestimmten Zeitraum inaktiv ist von Zeit. - Wenn physische Streams von verschiedenen physischen Kameras normalerweise nicht an dieselbe Anfrage angehängt werden, stellen Sie sicher, dass Apps eine
surface group
verwenden, sodass eine Pufferwarteschlange verwendet wird, um zwei App-zugewandte Oberflächen zu sichern, wodurch der Speicherverbrauch reduziert wird.