Unterstützung für mehrere Kameras

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 dieselbe Richtung zeigen. Das logische Kameragerät wird als einzelnes CameraDevice/CaptureSession einer App zugänglich gemacht, die eine Interaktion mit HAL-integrierten Multi-Kamera-Funktionen ermöglicht. Apps können optional auf zugrunde liegende physische Kamerastreams, Metadaten und Steuerelemente zugreifen und diese steuern.

Unterstützung für mehrere Kameras

Abbildung 1. Unterstützung für mehrere Kameras

In diesem Diagramm sind verschiedene Kamera-IDs farbcodiert. Die App kann RAW-Puffer 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

Multi-Kamera - Geräte müssen mit dem geworben werden logische Multi-Kamera - Fähigkeit .

Kamera - Clients die Kamera - ID der physikalischen Geräte eine bestimmte logische Kamera durch den Aufruf ist aus abfragen können getPhysicalCameraIds() . Die IDs als Teil des Ergebnisses zurückgegeben wird dann verwendet , physikalische Geräte zu steuern , einzeln durch setPhysicalCameraId() . Die Ergebnisse aus solchen individuellen Anforderungen können durch den Aufruf aus dem Gesamtergebnis abgefragt werden getPhysicalCameraResults() .

Individuelle physische Kameraanforderungen unterstützen möglicherweise nur eine begrenzte Teilmenge von Parametern. Um eine Liste der unterstützten Parameter zu erhalten, können Entwickler nennen getAvailablePhysicalCameraRequestKeys() .

Physische Kamerastreams werden nur für Nicht-Wiederverarbeitungsanforderungen 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:

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 , wo die Kamera HAL Geräteversion ist 3.5 oder höher, muss die Kamera Gerät unterstützt isStreamCombinationSupported für Anwendungen zu Abfrage , ob eine bestimmte Strom Kombination physikalische Ströme , das unterstützt wird.

Stream-Konfigurationskarte

Für eine logische Kamera, die obligatorische Strom Kombinationen für die Kameraeinrichtung einer bestimmten Hardware - Ebene ist das gleiche wie das, was in erforderlich ist CameraDevice.createCaptureSession . Alle Streams in der Streamkonfigurationszuordnung müssen logische Streams sein.

Bei einem logischen Kameragerät, das die RAW-Funktion mit physischen Unterkameras unterschiedlicher Größe unterstützt, darf das logische Kameragerät nicht auf physische Unterkameras mit unterschiedlichen Sensorgrößen umschalten, wenn eine App einen logischen RAW-Stream konfiguriert. Dadurch wird sichergestellt, dass vorhandene RAW-Capture-Apps nicht kaputt gehen.

Um den HAL-implementierten optischen Zoom durch Umschalten zwischen physischen Unterkameras während der RAW-Aufnahme zu nutzen, müssen Apps physische Unterkamera-Streams anstelle eines logischen RAW-Streams konfigurieren.

Garantierte Stream-Kombination

Sowohl die logische Kamera und die zugrunde liegenden physikalischen Kameras müssen die Garantie obligatorischen Strom Kombinationen , die für ihre Geräteebenen.

Ein logisches Kameragerät sollte basierend auf seiner Hardwareebene und seinen Fähigkeiten genauso funktionieren wie ein physisches Kameragerät. Es wird empfohlen, dass der Funktionsumfang der einzelnen physischen Kameras übergeordnet 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 der gleichen Größe und des gleichen Formats, die jeweils von einer separaten physischen Kamera stammen, vorausgesetzt, dass die Größe und das 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-Funktion 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 Bildrate der Aufnahme nicht verlangsamen, wenn die minimale Bilddauer des physischen und des logischen Streams gleich ist.

Überlegungen zu Leistung und Leistung

  • Leistung:

    • Das Konfigurieren und Streamen von physischen Streams kann die Erfassungsrate der logischen Kamera aufgrund von Ressourcenbeschränkungen verlangsamen.
    • Das Anwenden von physischen Kameraeinstellungen kann die Aufnahmerate verlangsamen, wenn die zugrunde liegenden Kameras in unterschiedliche Bildraten versetzt werden.
  • Leistung:

    • Die Leistungsoptimierung von HAL funktioniert im Standardfall weiter.
    • Das Konfigurieren oder Anfordern von physischen Streams kann die interne Leistungsoptimierung von HAL außer Kraft setzen und einen höheren Stromverbrauch verursachen.

Anpassung

Sie können Ihre Geräteimplementierung wie folgt anpassen.

  • Die fusionierte Ausgabe 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 das App- und Android-Kamera-Framework transparent.
  • Individuelle körperliche Anforderungen 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.
  • Von Android 10 kann der HAL die Anzahl der Kameras reduzieren , die direkt von einer Anwendung geöffnet werden kann durch die Wahl nicht einige oder alle PHYSICAL_IDs in inserieren getCameraIdList . Der Aufruf getPhysicalCameraCharacteristics müssen dann die Eigenschaften der physischen Kamera zurückzukehren.

Validierung

Logische Geräte mit mehreren Kameras müssen das Kamera-CTS wie jede andere normale Kamera bestehen. Die Testfälle , die diese Art von Vorrichtung kann gezielt in der gefunden werden LogicalCameraDeviceTest Modul.

Diese drei ITS-Tests zielen auf Systeme mit mehreren Kameras ab, um die ordnungsgemäße Verschmelzung von Bildern zu erleichtern:

Die Szene 1 und Szene 4 Tests durchgeführt mit dem ITS-in-a-box - Prüfstand. Der test_multi_camera_match Test behauptet , dass die Helligkeit von der Mitte der Bilder entspricht , wenn die beiden Kameras beide aktiviert sind. Der test_multi_camera_alignment Test behauptet , dass Kameraabstände, Ausrichtungen und Verzerrungsparameter korrekt geladen. 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 wiederholt, dass vorgeschriebenes Telefon Bewegung ermöglicht und bestätigt , daß die Gyroskop und die Bildsensorzeitstempel übereinstimmt , und dass das Multi-Kamera - Frames ist synchron.

Alle Boxen sind über AcuSpec, Inc. ( www.acuspecinc.com , fred@acuspecinc.com) und MYWAY Manufacturing ( www.myway.tw , sales@myway.tw). Zusätzlich kann die rev1 ITS - Box durch West-Mark erworben werden ( www.west-mark.com , dgoodman@west-mark.com).

Empfohlene Vorgehensweise

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

  • (Android 10 oder höher) ausblenden physikalischen Teil Kameras aus getCameraIdList . Dadurch wird die Anzahl der Kameras reduziert, die direkt von Apps geöffnet werden können, sodass Apps keine komplexe Kameraauswahllogik benötigen.
  • (Android 11 oder höher) für eine logische Vorrichtung mit mehreren Kameras optischen Zooms Unterstützung implementieren die ANDROID_CONTROL_ZOOM_RATIO API, und die Verwendung ANDROID_SCALER_CROP_REGION für Seitenverhältnis Zuschneiden nur. ANDROID_CONTROL_ZOOM_RATIO ermöglicht das Gerät verkleinern und eine bessere Präzision beizubehalten. In diesem Fall muss der HAL das Koordinatensystem von justieren 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 das post-Zoom Sichtfeld als Sensor aktive Array zu behandeln. Weitere Informationen darüber , wie ANDROID_SCALER_CROP_REGION mit arbeitet ANDROID_CONTROL_ZOOM_RATIO finden 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 für einen bestimmten Wert oder Bereich 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 Feldgrößen der physikalischen Kameras unterschiedlich sind, muss die Kamera HAL die Abbildung von den physischen Kameras Aktiv - Arrays auf die logische Kamera aktiven Array tun 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 so dass aus dem App Perspektive ist das Koordinatensystem die aktive Array-Größe der logischen Kamera.
    • Wenn die Weitwinkel- und Telekamera 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 Ultraweitwinkel-Kamera simulieren, damit beim Herauszoomen der App auf das Ultraweitwinkel-Objektiv die Tatsache, dass die zugrunde liegende physische Kamera einen festen Fokus hat, für die App transparent ist und die Autofokus-Zustandsmaschinen für die unterstützten AF-Modi 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, aber nicht 4K @ 60 fps unterstützt, stellen Sie sicher, dass die logische Kamera 4k @ 60 fps nicht ankündigt seine unterstützten Stream-Konfigurationen. Dies gewährleistet die Integrität der logischen Kamera - Funktionen, um sicherzustellen , dass der App nicht in das Problem läuft nicht zu erreichen 4k @ 60 fps bei einem ANDROID_CONTROL_ZOOM_RATIO Wert von weniger als 1.
  • Ab Android 10 ist keine logische Multikamera erforderlich, um Stream-Kombinationen mit physischen Streams zu unterstützen. 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 zu handhaben, machen Sie das Sichtfeld der physischen Stream-Ausgaben 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 Hardwarebeschränkungen das Sichtfeld des physischen Streams dazu zwingen, das gleiche wie der logische Stream zu sein.
    • Um den Speicherdruck anspricht , die durch mehr physischen Ströme, stellen Sie sicher , Apps nutzen discardFreeBuffers die freien Puffer (Puffer , die vom Verbraucher freigegeben werden, aber noch nicht vom Hersteller aus der Warteschlange entfernt) freizugeben , wenn ein physischer Strom erwartet wird , wird im Leerlauf für einen Zeitraum von Zeit.
    • Wenn physikalische Ströme aus unterschiedlichen physikalischen Kameras sind in der Regel nicht auf die gleiche Anforderung angebracht, stellen Sie sicher Anwendungen verwenden surface group , so dass eine Pufferwarteschlange verwendet wird , um zwei app gerichteten Oberflächen zu sichern, zu reduzieren Speicherverbrauch.