Unterstützung mehrerer Kameras

Mit Android 9 wurde die API-Unterstützung für Geräte mit mehreren Kameras durch ein neues logisches Kameragerät eingeführt, das aus zwei oder mehr physischen Kamerageräten besteht, die in die gleiche Richtung zeigen. Das logische Kameragerät wird einer App als einzelnes CameraDevice/CaptureSession zur Verfügung gestellt, was die Interaktion mit HAL-integrierten Multikamerafunktionen ermöglicht. Apps können optional auf zugrunde liegende physische Kamerastreams, Metadaten und Steuerelemente zugreifen und diese steuern.

Unterstützung mehrerer Kameras

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 empfangen.

Beispiele und Quellen

Multi-Kamera-Geräte müssen mit der logischen Multi-Kamera-Fähigkeit beworben werden.

Kamera-Clients 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 durch Aufruf getPhysicalCameraResults() aus dem Gesamtergebnis abgefragt werden.

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 Multikamerageräte auf der HAL-Seite hinzu:

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.

Bei Geräten 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

Bei einer logischen Kamera sind die obligatorischen Stream-Kombinationen für das Kameragerät einer bestimmten Hardwarestufe dieselben wie in CameraDevice.createCaptureSession erforderlich. Alle Streams in der Stream-Konfigurationszuordnung müssen logische Streams sein.

Wenn eine App für ein logisches Kameragerät, das RAW-Funktionen mit physischen Unterkameras unterschiedlicher Größe unterstützt, einen logischen RAW-Stream konfiguriert, darf das logische Kameragerät nicht zu physischen Unterkameras mit unterschiedlichen Sensorgrößen wechseln. Dadurch wird sichergestellt, dass bestehende RAW-Erfassungs-Apps nicht kaputt gehen.

Um den 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 die ihr zugrunde liegenden physischen Kameras müssen die für ihre Geräteebenen erforderlichen obligatorischen Stream-Kombinationen gewährleisten.

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 Funktionsumfang eine Obermenge des Funktionsumfangs einzelner physischer 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 Größe und Format von den physischen Kameras unterstützt werden.

  • Hinzufügen von zwei Rohdatenströmen, einer von jeder physischen Kamera, wenn die logische Kamera keine RAW-Fähigkeit ankündigt, die zugrunde liegenden physischen Kameras jedoch schon. Dies tritt normalerweise auf, wenn die physischen Kameras unterschiedliche Sensorgrößen haben.

  • Verwendung physischer Streams anstelle eines logischen Streams derselben Größe und desselben Formats. Dies darf die Bildrate der Erfassung nicht verlangsamen, wenn die minimale Bilddauer der physischen und logischen Streams gleich ist.

Überlegungen zu Leistung und Leistung

  • Leistung:

    • Das Konfigurieren und Streamen physischer Streams kann aufgrund von Ressourcenbeschränkungen die Erfassungsrate der logischen Kamera verlangsamen.
    • Das Anwenden physischer Kameraeinstellungen kann die Aufnahmerate verlangsamen, wenn die zugrunde liegenden Kameras auf unterschiedliche Bildraten eingestellt sind.
  • Leistung:

    • Die Leistungsoptimierung von HAL funktioniert im Standardfall weiterhin.
    • Das Konfigurieren oder Anfordern physischer Streams kann die interne Energieoptimierung von HAL außer Kraft setzen und zu einem höheren Stromverbrauch führen.

Anpassung

Sie können Ihre Geräteimplementierung auf folgende Weise anpassen.

  • Die fusionierte Ausgabe des logischen Kamerageräts hängt vollständig von der HAL-Implementierung ab. Die Entscheidung darüber, wie zusammengeführte logische Streams von den physischen Kameras abgeleitet werden, ist für die App und das Android-Kamera-Framework transparent.
  • Individuelle körperliche Wünsche und Ergebnisse können optional unterstützt werden. Der Satz verfügbarer Parameter in solchen Anfragen 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 in getCameraIdList nicht anzukündigen. Der Aufruf von getPhysicalCameraCharacteristics muss dann die Eigenschaften der physischen Kamera zurückgeben.

Validierung

Logische Geräte mit mehreren Kameras müssen den Kamera-CTS wie jede andere normale Kamera bestehen. Die Testfälle, die auf diesen Gerätetyp abzielen, finden Sie im Modul LogicalCameraDeviceTest .

Diese drei ITS-Tests zielen auf Mehrkamerasysteme ab, um die ordnungsgemäße Zusammenführung von Bildern zu erleichtern:

Die Tests für Szene 1 und Szene 4 werden mit dem ITS-in-a-box- Prüfstand durchgeführt. Der test_multi_camera_match Test stellt sicher, dass die Helligkeit der Bildmitte übereinstimmt, wenn beide Kameras aktiviert sind. Der test_multi_camera_alignment -Test stellt sicher, dass Kameraabstände, Ausrichtungen und Verzerrungsparameter ordnungsgemäß geladen werden. Wenn das Multikamerasystem eine Wide FoV-Kamera (>90o) umfasst, ist die rev2-Version der ITS-Box erforderlich.

Sensor_fusion ist ein zweiter Prüfstand, der wiederholte, vorgeschriebene Telefonbewegungen ermöglicht und sicherstellt, dass die Zeitstempel des Gyroskops und des Bildsensors übereinstimmen und dass die Bilder mehrerer Kameras 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 ITS-Box rev1 über West-Mark ( www.west-mark.com , dgoodman@west-mark.com) erworben werden.

Empfohlene Vorgehensweise

Befolgen Sie bei der Implementierung eines logischen Geräts mit mehreren Kameras die folgenden Best Practices, um die durch Multi-Kamera ermöglichten Funktionen voll auszunutzen und gleichzeitig die App-Kompatibilität aufrechtzuerhalten:

  • (Android 10 oder höher) Physische Unterkameras vor getCameraIdList ausblenden. Dadurch wird die Anzahl der Kameras reduziert, die von Apps direkt geöffnet werden können, sodass Apps nicht mehr über eine komplexe Kameraauswahllogik verfügen müssen.
  • (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 verwenden Sie ANDROID_SCALER_CROP_REGION nur für das 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 von ANDROID_SCALER_CROP_REGION , ANDROID_CONTROL_AE_REGIONS , ANDROID_CONTROL_AWB_REGIONS , ANDROID_CONTROL_AF_REGIONS , ANDROID_STATISTICS_FACE_RECTANGLES und ANDROID_STATISTICS_FACE_LANDMARKS anpassen, um das Sichtfeld nach dem Zoom als aktives Array des Sensors zu behandeln. Weitere Informationen zur Zusammenarbeit ANDROID_SCALER_CROP_REGION mit ANDROID_CONTROL_ZOOM_RATIO finden Sie unter camera3_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 eines bestimmten Werts oder Bereichs für ein Steuerelement nur dann 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 aktiven Array-Größen der physischen Kameras unterschiedlich sind, muss der 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 und ANDROID_STATISTICS_FACE_LANDMARKS durchführen Markiert damit die App Aus dieser Perspektive ist das Koordinatensystem die aktive Array-Größe der logischen Kamera.
    • Wenn die Weitwinkel- und Telekameras Autofokus unterstützen, die Ultraweitwinkelkamera jedoch über einen festen Fokus verfügt, stellen Sie sicher, dass die logische Kamera Autofokus-Unterstützung ankündigt. Der HAL muss eine Autofokus-Zustandsmaschine für die Ultraweitwinkelkamera simulieren, sodass beim Herauszoomen der App auf das Ultraweitwinkelobjektiv die Tatsache, dass die zugrunde liegende physische Kamera einen festen Fokus hat, für die App und die Autofokus-Zustandsmaschinen für die unterstützten AF-Modi transparent ist Funktioniert wie erwartet.
    • Wenn die Weitwinkel- und Telekameras 4K bei 60 fps unterstützen und die Ultrawide-Kamera nur 4K bei 30 fps oder 1080p bei 60 fps, aber nicht 4K bei 60 fps, stellen Sie sicher, dass die logische Kamera nicht 4k bei 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, dass 4K bei 60 fps bei einem ANDROID_CONTROL_ZOOM_RATIO Wert von weniger als 1 nicht erreicht wird.
  • Ab Android 10 ist keine logische Multikamera mehr erforderlich, um Stream-Kombinationen mit physischen Streams zu unterstützen. Wenn der HAL eine Kombination mit physischen Streams unterstützt:
    • (Android 11 oder höher) Um Anwendungsfälle wie Tiefe von Stereo und Bewegungsverfolgung besser zu bewältigen, machen Sie das Sichtfeld der physischen Stream-Ausgänge so groß, wie es von der 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 übereinstimmt.
    • Um dem durch mehrere physische Streams verursachten Speicherdruck entgegenzuwirken, stellen Sie sicher, dass Apps discardFreeBuffers verwenden, um die freien Puffer (Puffer, die vom Verbraucher freigegeben, aber vom Produzenten noch nicht aus der Warteschlange entfernt werden) 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 sind, stellen Sie sicher, dass Apps eine surface group verwenden, sodass eine Pufferwarteschlange zur Unterstützung zweier App-Oberflächen verwendet wird, wodurch der Speicherverbrauch reduziert wird.