Unter Android 9 wurde die API-Unterstützung für Geräte mit mehreren Kameras durch ein neues logisches Kamera-Gerät eingeführt, das aus zwei oder mehr physischen Kameras besteht, die in dieselbe Richtung zeigen. Das logische Kamera-Gerät wird einer App als einzelnes CameraDevice/CaptureSession präsentiert, sodass die Interaktion mit in HAL integrierten Funktionen für mehrere Kameras möglich ist. Apps können optional auf die zugrunde liegenden physischen Kamerastreams, Metadaten und Steuerelemente zugreifen und diese steuern.
Abbildung 1. Unterstützung für mehrere Kameras
In diesem Diagramm sind die verschiedenen Kamera-IDs farblich gekennzeichnet. Die App kann gleichzeitig Rohpuffer von jeder physischen Kamera streamen. Außerdem ist es möglich, separate Steuerelemente festzulegen und separate Metadaten von verschiedenen physischen Kameras zu empfangen.
Beispiele und Quellen
Geräte mit mehreren Kameras müssen mit der logischen Multi-Kamera-Funktion beworben werden.
Kameraclient-Anwendungen 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 einzelnen Anfragen können aus dem vollständigen
Ergebnis abgerufen werden, indem
getPhysicalCameraResults() aufgerufen wird.
Einzelne physische Kameraanfragen 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 Nachbearbeitung und nur für Monochrom- und Bayer-Sensoren unterstützt.
Implementierung
Checkliste für die Unterstützung
So fügen Sie logische Multi-Kamera-Geräte auf der HAL-Seite hinzu:
- Fügen Sie für jedes logische Kamera-Gerät, das von zwei oder mehr physischen
Kameras unterstützt wird, die auch für eine App verfügbar sind, die Funktion
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAhinzu. - Füllen Sie das statische
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDSMetadatenfeld mit einer Liste der IDs der physischen Kameras. - Füllen Sie die tiefenbezogenen statischen Metadaten aus, die erforderlich sind, um die Pixel der physischen Kamerastreams zu korrelieren:
ANDROID_LENS_POSE_ROTATION,ANDROID_LENS_POSE_TRANSLATION,ANDROID_LENS_INTRINSIC_CALIBRATION,ANDROID_LENS_DISTORTION,ANDROID_LENS_POSE_REFERENCE. Legen Sie das statische
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPEMetadatenfeld auf Folgendes fest:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE: Für Sensoren im Haupt-Haupt-Modus ist keine Hardware-Synchronisierung für Verschlusszeit und Belichtung erforderlich.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED: Für Sensoren im Haupt-Neben-Modus ist eine Hardware-Synchronisierung für Verschlusszeit und Belichtung erforderlich.
Füllen Sie
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYSmit einer Liste der unterstützten Parameter für einzelne physische Kameras. Die Liste kann leer sein, wenn das logische Gerät keine einzelnen Anfragen unterstützt.Wenn einzelne Anfragen unterstützt werden, verarbeiten und wenden Sie die einzelnen
physicalCameraSettingsan, die als Teil von Aufnahmeanfragen eingehen können, und hängen Sie die einzelnenphysicalCameraMetadataentsprechend an.Füllen Sie für Kamera-HAL-Geräteversionen 3.5 (eingeführt in Android 10) oder höher den
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_IDErgebnisschlüssel mit der ID der aktuell aktiven physischen Kamera aus, die die logische Kamera unterstützt.
Bei Geräten mit Android 9 müssen Kamerageräte das Ersetzen eines logischen YUV- oder 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.
Bei Geräten mit Android 10, auf 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 Streamkombination mit
physischen Streams unterstützt wird.
Zuordnung der Streamkonfiguration
Für eine logische Kamera sind die obligatorischen Streamkombinationen für das Kameragerät einer bestimmten Hardwareebene dieselben wie für
CameraDevice.createCaptureSession.
Alle Streams in der Zuordnung der Streamkonfiguration müssen logische Streams sein.
Wenn eine App einen logischen RAW-Stream konfiguriert, darf das logische Kameragerät nicht zu physischen Unterkameras mit unterschiedlichen Sensorgrößen wechseln. So wird verhindert, dass vorhandene Apps für die RAW-Aufnahme nicht mehr funktionieren.
Wenn Sie den in HAL implementierten optischen Zoom nutzen möchten, indem Sie während der RAW-Aufnahme zwischen physischen Unterkameras wechseln, müssen Apps physische Unterkamerastreams anstelle eines logischen RAW-Streams konfigurieren.
Garantierte Streamkombination
Sowohl die logische Kamera als auch die zugrunde liegenden physischen Kameras müssen die obligatorischen Streamkombinationen garantieren, die für ihre Geräteebenen erforderlich sind.
Ein logisches Kameragerät sollte sich je nach Hardwareebene und Funktionen genauso verhalten wie ein physisches Kameragerät. Es wird empfohlen, dass das Feature-Set eine Obermenge der einzelnen physischen Kameras ist.
Bei Geräten mit Android 9 muss die logische Kamera für jede garantierte Streamkombination 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, Größe und Format werden von den physischen Kameras unterstützt.
Hinzufügen von zwei RAW-Streams, einer von jeder physischen Kamera, wenn die logische Kamera keine RAW-Funktion bietet, die zugrunde liegenden physischen Kameras jedoch schon. Dies ist in der Regel der Fall, wenn die physischen Kameras unterschiedliche Sensorgrößen haben.
Verwenden von physischen Streams anstelle eines logischen Streams derselben Größe und desselben Formats. Dadurch darf die Framerate der Aufnahme nicht verlangsamt werden, wenn die minimale Framedauer der physischen und logischen Streams gleich ist.
Überlegungen zu Leistung und Stromverbrauch
Leistung:
- Das Konfigurieren und Streamen physischer Streams kann die Aufnahmerate der logischen Kamera aufgrund von Ressourcenbeschränkungen verlangsamen.
- Das Anwenden von Einstellungen für physische Kameras kann die Aufnahmerate verlangsamen, wenn die zugrunde liegenden Kameras mit unterschiedlichen Frameraten verwendet werden.
Stromverbrauch:
- Die Energieoptimierung von HAL funktioniert im Standardfall weiterhin.
- Das Konfigurieren oder Anfordern physischer Streams kann die interne Energieoptimierung von HAL überschreiben und zu einem höheren Energieverbrauch führen.
Anpassung
Sie können Ihre Geräteimplementierung so anpassen:
- Die kombinierte Ausgabe des logischen Kamerageräts hängt vollständig von der HAL-Implementierung ab. Die Entscheidung, wie kombinierte logische Streams von den physischen Kameras abgeleitet werden, ist für die App und das Android-Kamera-Framework transparent.
- Einzelne physische Anfragen und Ergebnisse können optional unterstützt werden. Die Menge der verfügbaren Parameter in solchen Anfragen hängt ebenfalls vollständig von der jeweiligen HAL-Implementierung ab.
- Ab Android 10 kann HAL die Anzahl der
Kameras reduzieren, die von einer App direkt geöffnet werden können, indem einige oder alle PHYSICAL_IDs in
getCameraIdListnicht beworben werden. Der Aufruf vongetPhysicalCameraCharacteristicsmuss dann die Merkmale der physischen Kamera zurückgeben.
Validierung
Logische Multi-Kamera-Geräte müssen wie jede andere normale Kamera den Camera CTS bestehen.
Die Testfälle für diesen Gerätetyp finden Sie im
LogicalCameraDeviceTest
Modul.
Diese drei ITS-Tests sind auf Multi-Kamera-Systeme ausgerichtet, um die korrekte Kombination von Bildern zu ermöglichen:
scene1/test_multi_camera_match.pyscene4/test_multi_camera_alignment.pysensor_fusion/test_multi_camera_frame_sync.py
Die Tests für Szene 1 und Szene 4 werden mit dem
ITS-in-a-box-Test
aufbau ausgeführt. Der Test test_multi_camera_match bestätigt, dass die Helligkeit der Bildmitte übereinstimmt, wenn beide Kameras aktiviert sind. Der Test test_multi_camera_alignment bestätigt, dass die Kameraabstände, ‑ausrichtungen und ‑verzerrungsparameter korrekt geladen werden. Wenn das Multi-Kamera-System eine Kamera mit einem weiten Sichtfeld (> 90°) umfasst, ist die Version 2 der ITS-Box erforderlich.
Sensor_fusion ist ein zweiter Testaufbau, der wiederholte, vorgeschriebene Bewegungen des Smartphones ermöglicht und bestätigt, dass die Zeitstempel des Gyroskops und des Bildsensors übereinstimmen und dass die Multi-Kamera-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. Außerdem kann die ITS-Box der Version 1 über West-Mark (www.west-mark.com, dgoodman@west-mark.com) erworben werden.
Best Practices
Wenn Sie die Funktionen von Multi-Kamera-Geräten voll ausschöpfen und gleichzeitig die App-Kompatibilität beibehalten möchten, sollten Sie bei der Implementierung eines logischen Multi-Kamera-Geräts diese Best Practices beachten:
- (Android 10 oder höher) Blenden Sie physische Unterkameras in
getCameraIdListaus. Dadurch wird die Anzahl der Kameras reduziert, die von Apps direkt geöffnet werden können, sodass keine komplexe Logik zur Kameraauswahl erforderlich ist. - (Android 11 oder höher) Implementieren Sie für ein logisches Multi-Kamera
Gerät mit optischem Zoom die
ANDROID_CONTROL_ZOOM_RATIOAPI und verwenden SieANDROID_SCALER_CROP_REGIONnur für das Zuschneiden des Seitenverhältnisses.ANDROID_CONTROL_ZOOM_RATIOermöglicht es dem Gerät, herauszuzoomen und eine bessere Präzision beizubehalten. In diesem Fall muss HAL das Koordinatensystem vonANDROID_SCALER_CROP_REGION,ANDROID_CONTROL_AE_REGIONS,ANDROID_CONTROL_AWB_REGIONS,ANDROID_CONTROL_AF_REGIONS,ANDROID_STATISTICS_FACE_RECTANGLESundANDROID_STATISTICS_FACE_LANDMARKSanpassen, um das Sichtfeld nach dem Zoomen als aktives Sensorarray zu behandeln. Weitere Informationen zur Verwendung vonANDROID_SCALER_CROP_REGIONin Kombination mitANDROID_CONTROL_ZOOM_RATIO, finden Sie untercamera3_crop_reprocess#cropping. - Bei Multi-Kamera-Geräten mit physischen Kameras mit unterschiedlichen Funktionen muss das Gerät die Unterstützung für einen bestimmten Wert oder Bereich für ein Steuerelement nur dann bewerben, wenn der Wert oder Bereich vom gesamten Zoombereich unterstützt wird. Wenn die logische Kamera beispielsweise aus einer Ultraweitwinkel-, einer Weitwinkel- und einer Telekamera besteht, gehen Sie so vor:
- Wenn sich die Größen der aktiven Arrays der physischen Kameras unterscheiden, muss die
Kamera-HAL die Zuordnung von den aktiven Arrays der physischen Kameras zum
aktiven Array 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_LANDMARKSvornehmen, sodass das Koordinatensystem aus Sicht der App die aktive Arraygröße der logischen Kamera ist. - Wenn die Weitwinkel- und die Telekamera Autofokus unterstützen, die Ultraweitwinkelkamera jedoch einen festen Fokus hat, muss die logische Kamera die Autofokus-Unterstützung bewerben. HAL muss eine Autofokus-Zustandsmaschine für die Ultraweitwinkelkamera simulieren, damit die Tatsache, dass die zugrunde liegende physische Kamera einen festen Fokus hat, für die App transparent ist, wenn sie auf das Ultraweitwinkelobjektiv herauszoomt. Außerdem müssen die Autofokus-Zustandsmaschinen für die unterstützten AF-Modi wie erwartet funktionieren.
- Wenn die Weitwinkel- und die Telekamera 4K mit 60 fps unterstützen und die Ultraweitwinkelkamera nur 4K mit 30 fps oder 1080p mit 60 fps, aber nicht 4K mit 60 fps, darf die logische Kamera 4K mit 60 fps nicht in ihren unterstützten Streamkonfigurationen bewerben. So wird die
Integrität der Funktionen der logischen Kamera gewährleistet und verhindert, dass die App das
Problem hat, dass 4K mit 60 fps bei einem
ANDROID_CONTROL_ZOOM_RATIOWert von weniger als 1 nicht erreicht werden.
- Wenn sich die Größen der aktiven Arrays der physischen Kameras unterscheiden, muss die
Kamera-HAL die Zuordnung von den aktiven Arrays der physischen Kameras zum
aktiven Array der logischen Kamera für
- Unter Android 10 und höher muss eine logische Multi-Kamera keine Streamkombinationen unterstützen, die physische Streams enthalten.
Wenn HAL eine Kombination mit physischen Streams unterstützt:
- (Android 11 oder höher) Um Anwendungsfälle wie die Tiefenmessung mit Stereobildern und die Bewegungserkennung besser zu verarbeiten, muss das Sichtfeld der physischen Streamausgaben so groß wie möglich sein. Wenn ein physischer und ein logischer Stream jedoch von derselben physischen Kamera stammen, können Hardwarebeschränkungen dazu führen, dass das Sichtfeld des physischen Streams mit dem des logischen Streams übereinstimmt.
- Um den durch mehrere physische Streams verursachten Speicherdruck zu verringern,
müssen Apps
discardFreeBuffersverwenden, um die kostenlosen Puffer freizugeben (Puffer, die vom Consumer freigegeben, aber noch nicht vom Producer aus der Warteschlange entfernt wurden), wenn ein physischer Stream voraussichtlich für einen bestimmten Zeitraum im Leerlauf ist. - Wenn physische Streams von verschiedenen physischen Kameras in der Regel nicht
an dieselbe Anfrage angehängt werden, müssen Apps
surface groupverwenden, damit eine Pufferwarteschlange verwendet wird, um zwei App-seitige Oberflächen zu unterstützen. So wird der Speicherverbrauch reduziert.