Kamera HAL

Die Kamera-Hardware-Abstraktionsschicht (HAL) von Android verbindet die übergeordneten Kamera-Framework-APIs in android.hardware.camera2 mit Ihrem zugrunde liegenden Kameratreiber und Ihrer Hardware. Ab Android 13 verwendet die Entwicklung der Kamera-HAL-Schnittstelle AIDL . Mit Android 8.0 wurde Treble eingeführt und die Kamera-HAL-API auf eine stabile Schnittstelle umgestellt, die durch die HAL-Schnittstellenbeschreibungssprache (HIDL) definiert ist. Wenn Sie zuvor ein Kamera-HAL-Modul und einen Treiber für Android 7.0 und niedriger entwickelt haben, beachten Sie die erheblichen Änderungen in der Kamera-Pipeline.

AIDL-Kamera HAL

Für Geräte mit Android 13 oder höher umfasst das Kamera-Framework Unterstützung für AIDL-Kamera-HALs. Das Kamera-Framework unterstützt auch HIDL-Kamera-HALs, allerdings sind in Android 13 oder höher hinzugefügte Kamerafunktionen nur über die AIDL-Kamera-HAL-Schnittstellen verfügbar. Um solche Funktionen auf Geräten zu implementieren, die auf Android 13 oder höher aktualisiert werden, müssen Gerätehersteller ihren HAL-Prozess von der Verwendung von HIDL-Kameraschnittstellen auf AIDL-Kameraschnittstellen migrieren.

Weitere Informationen zu den Vorteilen von AIDL finden Sie unter AIDL für HALs .

Implementieren Sie AIDL-Kamera-HAL

Eine Referenzimplementierung einer AIDL-Kamera-HAL finden Sie hardware/google/camera/common/hal/aidl_service/ .

Die HAL-Spezifikationen der AIDL-Kamera finden Sie an den folgenden Orten:

Bei Geräten, die auf AIDL migrieren, müssen Gerätehersteller je nach Codestruktur möglicherweise die Android SELinux-Richtlinie (sepolicy) und die RC-Dateien ändern.

Validieren Sie den HAL der AIDL-Kamera

Um die HAL-Implementierung Ihrer AIDL-Kamera zu testen, stellen Sie sicher, dass das Gerät alle CTS- und VTS-Tests besteht. Android 13 führt den AIDL VTS-Test VtsAidlHalCameraProvider_TargetTest.cpp ein.

Funktionen der Kamera HAL3

Das Ziel der Neugestaltung der Android-Kamera-API besteht darin, die Fähigkeit von Apps zur Steuerung des Kamera-Subsystems auf Android-Geräten erheblich zu verbessern und gleichzeitig die API neu zu organisieren, um sie effizienter und wartbarer zu machen. Die zusätzliche Kontrolle erleichtert die Erstellung hochwertiger Kamera-Apps auf Android-Geräten, die zuverlässig über mehrere Produkte hinweg funktionieren und gleichzeitig nach Möglichkeit immer noch gerätespezifische Algorithmen verwenden, um Qualität und Leistung zu maximieren.

Version 3 des Kamera-Subsystems strukturiert die Betriebsmodi in einer einzigen einheitlichen Ansicht, die zur Implementierung aller vorherigen Modi und mehrerer anderer, wie z. B. des Burst-Modus, verwendet werden kann. Dies führt zu einer besseren Kontrolle des Benutzers über Fokus und Belichtung sowie zu mehr Nachbearbeitung, wie z. B. Rauschunterdrückung, Kontrast und Schärfung. Darüber hinaus erleichtert diese vereinfachte Ansicht Anwendungsentwicklern die Nutzung der verschiedenen Funktionen der Kamera.

Die API modelliert das Kamera-Subsystem als Pipeline, die eingehende Anfragen für Bildaufnahmen 1:1 in Bilder umwandelt. Die Anfragen kapseln alle Konfigurationsinformationen zur Erfassung und Verarbeitung eines Frames. Dazu gehören Auflösung und Pixelformat; manuelle Sensor-, Objektiv- und Blitzsteuerung; 3A-Betriebsarten; RAW->YUV-Verarbeitungssteuerung; Statistikerstellung; und so weiter.

Vereinfacht ausgedrückt fordert das Anwendungsframework einen Frame vom Kamerasubsystem an und das Kamerasubsystem gibt Ergebnisse an einen Ausgabestream zurück. Darüber hinaus werden für jeden Ergebnissatz Metadaten generiert, die Informationen wie Farbräume und Linsenschattierung enthalten. Sie können sich Kameraversion 3 als Pipeline zum unidirektionalen Stream von Kameraversion 1 vorstellen. Es wandelt jede Aufnahmeanfrage in ein vom Sensor aufgenommenes Bild um, das verarbeitet wird in:

  • Ein Ergebnisobjekt mit Metadaten zur Erfassung.
  • Ein bis N Puffer mit Bilddaten, jeder in seiner eigenen Zieloberfläche.

Der Satz möglicher Ausgabeflächen ist vorkonfiguriert:

  • Jede Oberfläche ist ein Ziel für einen Strom von Bildpuffern mit einer festen Auflösung.
  • Nur eine kleine Anzahl von Oberflächen kann gleichzeitig als Ausgänge konfiguriert werden (~3).

Eine Anfrage enthält alle gewünschten Aufnahmeeinstellungen und die Liste der Ausgabeoberflächen, in die Bildpuffer für diese Anfrage verschoben werden sollen (aus dem gesamten konfigurierten Satz). Eine Anfrage kann einmalig erfolgen (mit capture() ) oder auf unbestimmte Zeit wiederholt werden (mit setRepeatingRequest() ). Erfassungen haben Vorrang vor sich wiederholenden Anforderungen.

Kameradatenmodell

Abbildung 1. Kamera-Kernbetriebsmodell

Übersicht über die Kamera HAL1

Version 1 des Kamera-Subsystems wurde als Blackbox mit High-Level-Steuerung und den folgenden drei Betriebsmodi konzipiert:

  • Vorschau
  • Videoaufnahme
  • Immer noch erfassen

Jeder Modus verfügt über leicht unterschiedliche und überlappende Funktionen. Dadurch war es schwierig, neue Funktionen wie den Burst-Modus zu implementieren, der zwischen zwei Betriebsmodi liegt.

Kamerablockdiagramm

Abbildung 2. Kamerakomponenten

Android 7.0 unterstützt weiterhin die Kamera HAL1, da viele Geräte immer noch darauf angewiesen sind. Darüber hinaus unterstützt der Android-Kameradienst die Implementierung beider HALs (1 und 3), was nützlich ist, wenn Sie eine weniger leistungsfähige Frontkamera mit Kamera HAL1 und eine fortschrittlichere Rückkamera mit Kamera HAL3 unterstützen möchten.

Es gibt ein einzelnes Kamera-HAL- Modul (mit eigener Versionsnummer ), das mehrere unabhängige Kamerageräte auflistet, die jeweils über eine eigene Versionsnummer verfügen. Zur Unterstützung von Geräten 2 oder neuer ist Kameramodul 2 oder neuer erforderlich, und solche Kameramodule können eine Mischung aus Kamerageräteversionen haben (das meinen wir, wenn wir sagen, dass Android die Implementierung beider HALs unterstützt).