Auf dieser Seite werden Versionsunterschiede bei Kamera-HALs, APIs und zugehörigen Compatibility Test Suite (CTS)-Tests beschrieben. Außerdem werden mehrere architektonische Änderungen behandelt, die zur Härtung und Sicherheit des Kamera-Frameworks in Android 7.0 vorgenommen wurden, die Umstellung auf Treble in Android 8.0 und die Updates, die Anbieter vornehmen müssen, um diese Änderungen in ihren Kameraimplementierungen zu unterstützen.
Terminologie
Auf dieser Seite werden die folgenden Begriffe verwendet:
- Camera API1
- Das Kamera-Framework auf App-Ebene auf Geräten mit Android 4.4 und niedriger, das über die Klasse
android.hardware.Camera
verfügbar ist. - Camera API2
- Das Kamera-Framework auf App-Ebene auf Geräten mit Android 5.0 und höher, das über das
android.hardware.camera2
-Paket bereitgestellt wird. - Kamera-HAL
- Die Kameramodulebene, die von SoC-Anbietern implementiert wird. Die öffentlichen Frameworks auf App-Ebene basieren auf der Kamera-HAL.
- Kamera HAL3.1
- Version der HAL des Kamerageräts, die mit Android 4.4 veröffentlicht wurde.
- Kamera HAL3.2
- Version der HAL des Kamerageräts, die mit Android 5.0 veröffentlicht wurde.
- Camera API1 CTS
- Reihe von Kamera-CTS-Tests, die über die Camera API 1 ausgeführt werden.
- Camera API2 CTS
- Zusätzliche CTS-Tests für Kameras, die über die Camera API2 ausgeführt werden.
- Höhen
- Die Anbieterimplementierung (gerätespezifische Software auf niedriger Ebene, die von Siliziumherstellern geschrieben wurde) wird über eine neue Anbieterschnittstelle vom Android-Betriebssystem getrennt.
- HIDL
- HAL-Schnittstellendefinitionsprache, die mit Treble eingeführt wurde und zum Definieren der Schnittstelle zwischen einer HAL und ihren Nutzern verwendet wird.
- VTS
- Anbietertestsuite, die zusammen mit Treble eingeführt wurde.
Kamera-APIs
Android umfasst die folgenden Kamera-APIs.
Camera API1
Mit Android 5.0 wurde die Camera API1 eingestellt. Sie wird nach und nach eingestellt, da sich die Entwicklung der neuen Plattform auf die Camera API2 konzentriert. Die Einstellung wird jedoch schrittweise erfolgen und Android-Releases unterstützen noch einige Zeit lang Apps mit der Camera API 1. Insbesondere wird der Support für Folgendes fortgesetzt:
- Camera API1-Schnittstellen für Apps Kamera-Apps, die auf der Camera API 1 basieren, sollten auf Geräten mit niedrigeren Android-Release-Versionen wie gewohnt funktionieren.
- Kamera HAL-Versionen Unterstützt Camera HAL1.0.
Camera API2
Das Camera API2-Framework stellt der App eine Kamerasteuerung auf niedriger Ebene zur Verfügung, einschließlich effizienter Zero-Copy-Burst-/Streaming-Abläufe und Frames-spezifischer Einstellungen für Belichtung, Verstärkung, Weißabgleich, Farbkonvertierung, Rauschunterdrückung und Schärfung. Weitere Informationen finden Sie im Video zur Google I/O-Übersicht.
Android 5.0 und höher enthält die Camera API2. Geräte mit Android 5.0 und höher unterstützen jedoch möglicherweise nicht alle Funktionen der Camera API2. Das Attribut android.info.supportedHardwareLevel
, das Apps über die Camera API2-Schnittstellen abfragen können, gibt eines der folgenden Unterstützungsniveaus an:
LEGACY
: Diese Geräte stellen Apps über die Kamera API 2-Schnittstellen Funktionen zur Verfügung, die ungefähr denselben Funktionen entsprechen, die Apps über die Kamera API 1-Schnittstellen zur Verfügung gestellt werden. Der Code der älteren Frameworks übersetzt Camera API2-Aufrufe konzeptionell in Camera API1-Aufrufe. Ältere Geräte unterstützen keine Camera API2-Funktionen wie Frames-spezifische Steuerelemente.LIMITED
: Diese Geräte unterstützen einige, aber nicht alle Funktionen der Camera API2 und müssen Camera HAL 3.2 oder höher verwenden.FULL
: Diese Geräte unterstützen alle wichtigen Funktionen der Camera API2 und müssen Camera HAL 3.2 oder höher und Android 5.0 oder höher verwenden.LEVEL_3
: Diese Geräte unterstützen die YUV-Neuverarbeitung und die RAW-Bilderfassung sowie zusätzliche Konfigurationen für Ausgabestreams.EXTERNAL
: Diese Geräte ähneln mit einigen AusnahmenLIMITED
-Geräten. Beispielsweise werden einige Sensor- oder Objektivinformationen möglicherweise nicht erfasst oder haben eine weniger stabile Bildrate. Diese Ebene wird für externe Kameras wie USB-Webcams verwendet.
Einzelne Funktionen werden über das Attribut android.request.availableCapabilities
in den Schnittstellen der Camera API2 bereitgestellt. Für FULL
-Geräte sind unter anderem die Funktionen MANUAL_SENSOR
und MANUAL_POST_PROCESSING
erforderlich. Die RAW
-Funktion ist auch für FULL
-Geräte optional.
LIMITED
-Geräte können eine beliebige Teilmenge dieser Funktionen angeben, auch keine. Die BACKWARD_COMPATIBLE
-Funktion muss jedoch immer definiert sein.
Die unterstützte Hardwareebene des Geräts sowie die von ihm unterstützten Camera2 API-Funktionen sind als die folgenden Feature-Flags verfügbar, um die Google Play-Filterung von Camera2 API-Kamera-Apps zu ermöglichen.
android.hardware.camera.hardware_level.full
android.hardware.camera.capability.raw
android.hardware.camera.capability.manual_sensor
android.hardware.camera.capability.manual_post_processing
CTS-Anforderungen
Geräte mit Android 5.0 und höher müssen die Kameratests für Camera API 1 CTS, Camera API 2 CTS und CTS Verifier bestehen.
Geräte, die keine Kamera-HAL3.2-Implementierung haben und die gesamten Schnittstellen der Camera API2 nicht unterstützen können, müssen trotzdem die CTS-Tests der Camera API2 bestehen. Das Gerät wird jedoch im Camera API2-LEGACY
-Modus ausgeführt, in dem die Camera API2-Aufrufe konzeptionell den Camera API1-Aufrufen zugeordnet werden. Alle Camera API2-CTS-Tests, die sich auf Funktionen oder Fähigkeiten beziehen, die über die Camera API1 hinausgehen, werden daher automatisch übersprungen.
Auf älteren Geräten werden bei CTS-Tests für die Camera API2 die vorhandenen öffentlichen Schnittstellen und Funktionen der Camera API1 ohne neue Anforderungen verwendet. Fehler, die aufgedeckt werden (und zu einem CTS-Fehler der Camera API2 führen), sind bereits in der vorhandenen HAL der Kamera des Geräts vorhanden und würden daher von vorhandenen Camera API1-Apps gefunden. Wir gehen nicht davon aus, dass viele Fehler dieser Art auftreten. Alle derartigen Fehler müssen jedoch behoben werden, damit die CTS-Tests der Camera API2 bestanden werden.
VTS-Anforderungen
Geräte mit Android 8.0 und höher mit binderisierten HAL-Implementierungen müssen die VTS-Tests für die Kamera bestehen.
Härtung des Kamera-Frameworks
Um die Sicherheit des Medien- und Kamera-Frameworks zu erhöhen, wird der Kameradienst in Android 7.0 aus dem Mediaserver verschoben. Ab Android 8.0 wird jede gebundene Camera HAL in einem separaten Prozess vom Kameradienst ausgeführt. Je nach verwendeter API- und HAL-Version müssen Anbieter möglicherweise Änderungen an der Kamera-HAL vornehmen. In den folgenden Abschnitten werden die Architekturänderungen in AP1 und AP2 für HAL1 und HAL3 sowie allgemeine Anforderungen beschrieben.
Architekturänderungen für API1
Bei der API1-Videoaufzeichnung wird davon ausgegangen, dass Kamera und Videoencoder im selben Prozess live sind. Bei Verwendung von API1 auf:
- Bei HAL3, bei dem der Kameradienst BufferQueue verwendet, um Puffer zwischen Prozessen zu übergeben, ist kein Update des Anbieters erforderlich.
Abbildung 1. Android 7.0-Kamera- und Medienstack in API1 auf HAL3
- HAL1, das die Weitergabe von Metadaten in Videopuffern unterstützt, müssen die Anbieter die HAL aktualisieren, um
kMetadataBufferTypeNativeHandleSource
zu verwenden. (kMetadataBufferTypeCameraSource
wird unter Android 7.0 nicht mehr unterstützt.)Abbildung 2. Android 7.0-Kamera- und Medienstack in API1 auf HAL1
Architekturänderungen für API2
Bei API2 auf HAL1 oder HAL3 gibt BufferQueue Puffer weiter, damit diese Pfade weiterhin funktionieren. Die Android 7.0-Architektur für API2 auf:
- HAL1 ist von der Verlagerung des Kameradienstes nicht betroffen und kein Anbieterupdate erforderlich.
- HAL3 ist betroffen, aber kein Anbieterupdate erforderlich:
Abbildung 3. Android 7.0-Kamera- und Medienstack in API2 auf HAL3
Zusätzliche Anforderungen
Die Architekturänderungen zur Erhöhung der Sicherheit des Medien- und Kamera-Frameworks umfassen die folgenden zusätzlichen Geräteanforderungen.
- Allgemein Geräte benötigen aufgrund der IPC zusätzliche Bandbreite. Dies kann sich auf zeitkritische Kameraanwendungen wie die Hochgeschwindigkeitsvideoaufzeichnung auswirken. Anbieter können die tatsächlichen Auswirkungen messen, indem sie
android.hardware.camera2.cts.PerformanceTest
und die Google Kamera App für die Hochgeschwindigkeitsvideoaufnahme mit 120/240 fps verwenden. Außerdem benötigen Geräte ein wenig zusätzlichen RAM, um den neuen Prozess zu erstellen. - Metadaten in Videopuffern übergeben (nur HAL1). Wenn HAL1 Metadaten anstelle von echten YUV-Frame-Daten in Video-Buffers speichert, muss die HAL
kMetadataBufferTypeNativeHandleSource
als Metadaten-Buffertyp verwenden undVideoNativeHandleMetadata
in Video-Buffers übergeben. (kMetadataBufferTypeCameraSource
wird unter Android 7.0 nicht mehr unterstützt.) MitVideoNativeHandleMetadata
können Kamera- und Medien-Frameworks die Video-Puffer zwischen Prozessen übergeben, indem die nativen Handles ordnungsgemäß serialisiert und deserialisiert werden. - Die Adresse des Buffer-Handles verweist nicht immer auf denselben Buffer (nur HAL3). Für jede Erfassungsanfrage erhält HAL3 Adressen von Puffer-Handles. HAL kann die Adressen nicht zum Identifizieren von Puffern verwenden, da die Adressen möglicherweise einen anderen Puffer-Handle speichern, nachdem HAL den Puffer zurückgegeben hat. Sie müssen die HAL so aktualisieren, dass die Puffer mit Puffer-Handles identifiziert werden. Beispiel: HAL empfängt die Adresse eines Pufferhandles A, in dem der Pufferhandle A gespeichert ist. Nachdem der HAL den Pufferhandle A zurückgegeben hat, kann die Pufferhandle-Adresse A beim nächsten Empfang durch den HAL den Pufferhandle B speichern.
- SELinux-Richtlinien für den Kameraserver aktualisieren Wenn gerätespezifische SELinux-Richtlinien dem Mediaserver Berechtigungen zum Ausführen der Kamera gewähren, müssen Sie die SELinux-Richtlinien aktualisieren, um dem Kameraserver die entsprechenden Berechtigungen zu gewähren. Wir raten davon ab, die SELinux-Richtlinien des Mediaservers für den Kameraserver zu replizieren, da Mediaserver und Kameraserver in der Regel unterschiedliche Ressourcen im System benötigen. Der Kameraserver sollte nur die Berechtigungen haben, die für die Ausführung der Kamerafunktionen erforderlich sind. Alle nicht erforderlichen kamerabezogenen Berechtigungen im Mediaserver sollten entfernt werden.
- Trennung zwischen Camera HAL und Kameraserver. Unter Android 8.0 und höher wird die binderisierte Camera HAL zusätzlich in einem anderen Prozess als der Kameraserver getrennt. Die IPC erfolgt über HIDL-definierte Schnittstellen.
Zertifizierungsstufe
Prüfen Sie bei allen Geräten mit Kamera und Android 7.0 die Implementierung, indem Sie den Android 7.0 CTS ausführen. Android 7.0 enthält zwar keine neuen CTS-Tests, mit denen Änderungen am Kameradienst überprüft werden, aber vorhandene CTS-Tests schlagen fehl, wenn Sie die oben genannten Änderungen nicht vorgenommen haben.
Prüfen Sie bei allen Geräten mit Kamera und Android 8.0 oder höher die Implementierung des Anbieters, indem Sie VTS ausführen.
Kamera HAL-Versionsverlauf
Eine Liste der Tests zur Bewertung der Android Camera HAL finden Sie in der Checkliste für HAL-Tests für Kameras.
Android 10
Mit Android 10 werden die folgenden Updates eingeführt.
Camera API
- Verbesserungen bei der Mehrfachkamera, durch die physische Kameras einzeln oder über entsprechende logische Kameras verwendet werden können, indem physische Kamera-IDs ausgeblendet werden. Weitere Informationen finden Sie unter Multi-Kamera-Unterstützung.
- Möglichkeit, zu prüfen, ob eine bestimmte Sitzungskonfiguration unterstützt wird, ohne dass durch das Erstellen einer neuen Sitzung ein Leistungsaufwand entsteht.
Siehe
CameraDevice
. - Es können empfohlene Streamkonfigurationen für einen bestimmten Anwendungsfall abgerufen werden, um den Client energieeffizienter und leistungsfähiger zu machen. Siehe
getRecommendedStreamConfigurationMap
. - Unterstützung für das JPEG-Bildformat mit Tiefeninformationen Weitere Informationen finden Sie in der Spezifikation für dynamische Tiefen.
- Unterstützung für das HEIC-Bildformat Weitere Informationen finden Sie unter HEIF-Bildverarbeitung.
- Verbesserungen beim Datenschutz Für bestimmte Schlüssel muss der Client
CAMERA
-Berechtigungen haben, bevor sie vonCameraCharacteristics
abgerufen werden können. Weitere Informationen finden Sie untergetKeysNeedingPermission
.
Kamera-HAL
Die folgenden Camera HAL-Versionen werden in Android 10 aktualisiert.
3.5
ICameraDevice
-
getPhysicalCameraCharacteristics
: Die statischen Kamerainformationen für eine physische Kamera-ID, die einem logischen Kameragerät zugeordnet ist. Weitere Informationen finden Sie unter Multi-Kamera-Unterstützung. isStreamCombinationSupported
: Diese Methode unterstützt eine öffentliche API, mit der Clients abfragen können, ob eine Sitzungskonfiguration unterstützt wird. Weitere Informationen findest du unter API zum Abfragen von Streamkombinationen.
ICameraDeviceSession
-
isReconfigurationNeeded
: Methode, die dem Kamera-Framework mitteilt, ob eine vollständige Neukonfiguration des Streams für mögliche neue Sitzungsparameterwerte erforderlich ist. So lassen sich unnötige Verzögerungen bei der Neukonfiguration der Kamera vermeiden. Siehe Anfrage zur Sitzungsneukonfiguration. - HAL-APIs zur Pufferverwaltung: Mit diesen APIs kann die HAL der Kamera nur bei Bedarf Puffer vom Kamera-Framework anfordern, anstatt jede Aufnahmeanfrage mit den zugehörigen Puffern in der gesamten Kamerapipeline zu verknüpfen. Dies führt zu einer potenziell erheblichen Speichereinsparung.
-
signalStreamFlush
: Signalisiert der HAL, dass der KameradienstconfigureStreams_3_5
ausführen wird und dass der HAL alle Buffers der angegebenen Streams zurückgeben muss. -
configureStreams_3_5
: Ähnlich wieICameraDevice3.4.configureStreams
, aber zusätzlich wird derstreamConfigCounter
-Zähler bereitgestellt, um auf eine Race-Bedingung zwischen denconfigureStreams_3_5
- undsignalStreamFlush
-Aufrufen zu prüfen.
-
Aktualisierungen für ICameraDeviceCallback
:
-
requestStreamBuffers
: Synchroner Rückruf, den die HAL der Kamera aufruft, um den Kameraserver um Buffers zu bitten. Weitere Informationen finden Sie unterrequestStreamBuffers
. -
returnStreamBuffers
: Synchroner Rückruf für die Kamera-HAL, um Ausgabe-Buffer an den Kameraserver zurückzugeben. Weitere Informationen finden Sie unterreturnStreamBuffers
.
3.4
Die folgenden Schlüssel werden den Kamerametadaten in Android 10 hinzugefügt.
- Bildformate
ANDROID_SCALER_AVAILABLE_FORMATS_RAW10
ANDROID_SCALER_AVAILABLE_FORMATS_RAW12
ANDROID_SCALER_AVAILABLE_FORMATS_Y8
- Kamerametadaten-Tags
ANDROID_REQUEST_CHARACTERISTIC_KEYS_NEEDING_PERMISSION
ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS
ANDROID_SCALER_AVAILABLE_RECOMMENDED_INPUT_OUTPUT_FORMATS_MAP
ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION
ANDROID_DEPTH_AVAILABLE_RECOMMENDED_DEPTH_STREAM_CONFIGURATIONS
ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS
ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS
ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS
ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS
ANDROID_HEIC_INFO_SUPPORTED
ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
- Funktionen
-
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA
-
- Werte für den Schlüssel
ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO
ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR
- Verfügbare Konfigurationen für dynamische Tiefenstreams
ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_OUTPUT
ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_INPUT
- Verfügbare HEIC-Streamkonfigurationen
-
ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_OUTPUT
ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_INPUT
-
Kameramodul
Die folgenden Kameramodulversionen werden in Android 10 aktualisiert.
2.5
- Die Methode
notifyDeviceStateChange
wurde hinzugefügt, damit Geräte die HAL der Kamera benachrichtigen können, wenn sich physische Änderungen wie das Zusammenklappen auf die Kamera und die Weiterleitung auswirken.
2.4
- Für Geräte, die mit API-Level 29 oder höher gestartet werden, MUSS
true
fürisTorchModeSupported
angegeben werden.
Android 9
Mit der Android 9-Version werden die folgenden Updates für die Kamera API2 und die HAL-Schnittstelle eingeführt.
Camera API
- Einführung der Multi-Kamera-API zur besseren Unterstützung von Geräten mit mehreren Kameras, die in dieselbe Richtung zeigen. Dadurch sind Funktionen wie Bokeh und nahtloses Zoomen möglich. So können Apps mehrere Kameras auf einem Gerät als eine logische Einheit (logische Kamera) anzeigen. Aufnahmeanfragen können auch an einzelne Kamerageräte gesendet werden, die zu einer logischen Kamera gehören. Weitere Informationen finden Sie unter Multi-Kamera-Unterstützung.
- Sitzungsparameter werden eingeführt. Sitzungsparameter sind eine Teilmenge der verfügbaren Erfassungsparameter, die bei Änderung zu erheblichen Verarbeitungsverzögerungen führen können. Diese Kosten können reduziert werden, wenn Clients ihre Anfangswerte während der Initialisierung der Aufnahmesitzung übergeben. Weitere Informationen finden Sie unter Sitzungsparameter.
- Es werden Datenschlüssel für die optische Stabilisierung (OIS) für Stabilisierung und Effekte auf App-Ebene hinzugefügt. Weitere Informationen finden Sie unter
STATISTICS_OIS_SAMPLES
. - Unterstützung für externes Blitzgerät hinzugefügt. Weitere Informationen finden Sie unter
CONTROL_AE_MODE_ON_EXTERNAL_FLASH
. - Fügen Sie in
CAPTURE_INTENT
einen Intent für die Bewegungserkennung hinzu. Weitere Informationen finden Sie unterCONTROL_CAPTURE_INTENT_MOTION_TRACKING
. LENS_RADIAL_DISTORTION
wird eingestellt und an seine Stelle wirdLENS_DISTORTION
gesetzt.- Es wurden Modi zur Verzeichnungskorrektur in
CaptureRequest
hinzugefügt. Weitere Informationen finden Sie unterDISTORTION_CORRECTION_MODE
. - Unterstützung für externe USB-/UVC-Kameras auf unterstützten Geräten. Weitere Informationen finden Sie unter
INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL
.
Kamera-HAL
3.4
Updates für ICameraDeviceSession
-
configureStreams_3_4
: Unterstützung fürsessionParameters
und logische Kameras. -
processCaptureRequest_3_4
: Unterstützung für die Aufnahme physischer Kamera-IDs in die Streamstruktur.
Updates für ICameraDeviceCallback
-
processCaptureResult_3_4
: Fügt den Aufnahmeergebnissen Metadaten der physischen Kamera hinzu.
3.3
Die folgenden Schlüssel werden den Kamerametadaten in Android 9 hinzugefügt.
- Funktionen
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
- Kamerametadaten-Tags
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
ANDROID_DISTORTION_CORRECTION_AVAILABLE_MODES
ANDROID_LENS_POSE_REFERENCE
-
ANDROID_LENS_DISTORTION
ANDROID_REQUEST_AVAILABLE_SESSION_KEYS
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
ANDROID_STATISTICS_OIS_DATA_MODE
ANDROID_STATISTICS_OIS_TIMESTAMPS
ANDROID_STATISTICS_OIS_X_SHIFTS
ANDROID_STATISTICS_OIS_Y_SHIFTS
Android 8.0
Mit der Android 8.0-Version wurde Treble eingeführt. Bei Treble müssen Kamera-HAL-Implementierungen von Anbietern gebunden werden. Android 8.0 enthält außerdem die folgenden wichtigen Verbesserungen am Kameradienst:
- Gemeinsam genutzte Oberflächen: Mehrere Oberflächen mit derselben
OutputConfiguration
- System API für benutzerdefinierte Kameramodi
onCaptureQueueEmpty
Weitere Informationen zu diesen Funktionen finden Sie in den folgenden Abschnitten.
Gemeinsam genutzte Oberflächen
Mit dieser Funktion können zwei Ausgänge, z. B. Vorschau und Videocodierung, mit nur einem Satz von Puffern betrieben werden, was den Stromverbrauch und die Speichernutzung reduziert. Um diese Funktion zu unterstützen, müssen Gerätehersteller dafür sorgen, dass ihre Kamera-HAL- und gralloc-HAL-Implementierungen Gralloc-Buffer erstellen können, die von mehreren verschiedenen Abnehmern (z. B. dem Hardware-Composer/der GPU und dem Videoencoder) und nicht nur von einem Abnehmer verwendet werden. Der Kameradienst übergibt die Flags zur Nutzung durch den Verbraucher an die Kamera-HAL und die gralloc-HAL. Diese müssen entweder die richtigen Arten von Puffern zuweisen oder die Kamera-HAL muss einen Fehler zurückgeben, dass diese Kombination von Verbrauchern nicht unterstützt wird.
Weitere Informationen finden Sie in der
enableSurfaceSharing
Entwicklerdokumentation.
System API für benutzerdefinierte Kameramodi
Die öffentliche Kamera-API definiert zwei Betriebsmodi: normale und eingeschränkte Hochgeschwindigkeitsaufnahmen. Sie haben eine ziemlich unterschiedliche Semantik. Beispielsweise ist der Hochgeschwindigkeitsmodus auf maximal zwei bestimmte Ausgänge gleichzeitig beschränkt. Verschiedene OEMs haben Interesse an der Definition anderer benutzerdefinierter Modi für hardwarespezifische Funktionen geäußert. Der Modus ist im Grunde nur eine Ganzzahl, die an configure_streams
übergeben wird. Siehe:
hardware/camera/device/3.2/ICameraDeviceSession#configurestreams
.
Diese Funktion umfasst einen System-API-Aufruf, mit dem OEM-Kamera-Apps einen benutzerdefinierten Modus aktivieren können. Diese Modi müssen mit dem Ganzzahlwert 0x8000 beginnen, um Konflikte mit zukünftigen Modi zu vermeiden, die der öffentlichen API hinzugefügt werden.
Um diese Funktion zu unterstützen, müssen OEMs ihrer HAL lediglich den neuen Modus hinzufügen, der durch diese Ganzzahl ausgelöst wird, die bei „configure_streams“ an die HAL übergeben wird. Anschließend muss ihre benutzerdefinierte Kamera-App die System-API verwenden.
Der Methodenname ist
android.hardware.camera2.CameraDevice#createCustomCaptureSession
.
Siehe:
frameworks/base/core/java/android/hardware/camera2/CameraDevice
.
onCaptureQueueEmpty
Mit dieser API soll die Latenz von Steuerelementänderungen wie dem Zoomen reduziert werden, indem die Anfragewarteschlange so leer wie möglich gehalten wird. onCaptureQueueEmpty
erfordert keine HAL-Arbeit; es war eine rein frameworkseitige Ergänzung. Apps, die diese Funktion nutzen möchten, müssen diesem Callback einen Listener hinzufügen und entsprechend reagieren. In der Regel wird dazu eine weitere Aufnahmeanfrage an das Kameragerät gesendet.
HIDL-Schnittstelle der Kamera
Die Camera HIDL-Schnittstelle ist eine vollständige Überarbeitung der Camera HAL-Schnittstelle, die stabile HIDL-definierte APIs verwendet. Alle Funktionen und Kamerafunktionen, die in den neuesten älteren Versionen 3.4 und 2.4 (für das Kameramodul) eingeführt wurden, sind ebenfalls Teil der HIDL-Definitionen.
3.4
Kleinere Ergänzungen zu unterstützten Metadaten und Änderungen an der Unterstützung von data_space:
- Fügen Sie
ANDROID_SENSOR_OPAQUE_RAW_SIZE
-Metadaten als obligatorisch hinzu, wenn dasRAW_OPAQUE
-Format unterstützt wird. - Fügen Sie
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE
-Statische Metadaten als obligatorisch hinzu, wenn ein RAW-Format unterstützt wird. - Verwenden Sie für das Feld
camera3_stream_t data_space
eine flexiblere Definition, indem Sie die Definition der Datenraumcodierung der Version 0 verwenden. - Allgemeine Metadatenergänzungen, die für HALv3.2 oder höher verwendet werden können:
-
ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE
ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL
ANDROID_SENSOR_DYNAMIC_WHITE_LEVEL
ANDROID_SENSOR_OPAQUE_RAW_SIZE
ANDROID_SENSOR_OPTICAL_BLACK_REGIONS
-
3.3
Kleinere Überarbeitung der HAL mit erweiterten Funktionen:
- API-Aktualisierungen für die erneute Verarbeitung von OPAQUE- und YUV-Dateien.
- Grundlegende Unterstützung für Tiefenausgabe-Buffer.
- Dem Feld
camera3_stream_t
wurde das Felddata_space
hinzugefügt. - Dem
camera3_stream_t
-Feld wurde das Rotationsfeld hinzugefügt. - Der Betriebsmodus der Kamera 3-Streamkonfiguration wurde zu
camera3_stream_configuration_t
hinzugefügt.
3.2
Kleinere Überarbeitung der HAL mit erweiterten Funktionen:
get_metadata_vendor_tag_ops
wird eingestellt. Verwenden Sie stattdessenget_vendor_tag_ops
incamera_common.h
.register_stream_buffers
wird eingestellt. Alle vom Framework an HAL inprocess_capture_request
bereitgestellten Gralloc-Buffer können jederzeit neu sein.- Unterstützung für teilweise Ergebnisse hinzufügen
process_capture_result
wird möglicherweise mehrmals mit einer Teilmenge der verfügbaren Ergebnisse aufgerufen, bevor das vollständige Ergebnis verfügbar ist. - Fügen Sie
camera3_request_template
eine manuelle Vorlage hinzu. Apps können diese Vorlage verwenden, um die Aufnahmeeinstellungen direkt zu steuern. - Überarbeiten Sie die Spezifikationen für den bidirektionalen und den Eingabestream.
- Ändern Sie den Rückgabepfad des Eingabepuffers. Der Puffer wird in
process_capture_result
anstelle vonprocess_capture_request
zurückgegeben.
3.1
Kleinere Überarbeitung der HAL mit erweiterten Funktionen:
configure_streams
übergibt Flags zur Nutzernutzung an die HAL.- Flush-Aufruf, um alle laufenden Anfragen/Puffer so schnell wie möglich zu löschen.
3
Erste Überarbeitung der HAL mit erweiterten Funktionen:
- Hauptversionsänderung, da das ABI völlig anders ist. Es gibt keine Änderungen an den erforderlichen Hardwarefunktionen oder dem Betriebsmodell im Vergleich zu Version 2.0.
- Überarbeitete Schnittstellen für Eingabeanfragen und Stream-Warteschlangen: Das Framework ruft die HAL mit der nächsten Anfrage auf und die Stream-Buffer wurden bereits aus der Warteschlange entfernt. Die Unterstützung des Sync Framework ist enthalten, was für effiziente Implementierungen erforderlich ist.
- Auslöser wurden in Anfragen und die meisten Benachrichtigungen in Ergebnisse verschoben.
- Alle Callbacks wurden im Framework in einer Struktur und alle Einrichtungsmethoden in einem einzigen
initialize()
-Aufruf zusammengefasst. - Die Streamkonfiguration wurde zu einem einzigen Aufruf zusammengefasst, um die Streamverwaltung zu vereinfachen.
Bidirektionale Streams ersetzen das
STREAM_FROM_STREAM
-Konstrukt. - Semantik für den eingeschränkten Modus bei älteren/eingeschränkten Hardwaregeräten
2
Erste Version der HAL mit erweiterten Funktionen (Android 4.2) [camera2.h]:
- Ausreichend für die Implementierung der vorhandenen
android.hardware.Camera
API. - Ermöglicht eine ZSL-Warteschlange in der Kameradienstebene.
- Nicht getestet für neue Funktionen wie manuelle Aufnahmesteuerung, Bayer-RAW-Aufnahme, Neuverarbeitung von RAW-Daten usw.
1.0
Erste Android-Kamera-HAL (Android 4.0) [camera.h]:
- Von der C++-Abstraktionsschicht „CameraHardwareInterface“ konvertiert.
- Unterstützt die
android.hardware.Camera
API.
Versionsverlauf des Kameramoduls
Dieser Abschnitt enthält Informationen zur Modulversionierung für das Kamera-Hardwaremodul auf der Grundlage von camera_module_t.common.module_api_version
. Die beiden höchstwertigen Hexadezimalstellen stehen für die Hauptversion und die beiden niedrigsten für die Nebenversion.
2.4
Diese Kameramodulversion führt die folgenden API-Änderungen ein:
- Unterstützung für den Taschenlampenmodus Das Framework kann den Taschenlampenmodus für jede Kamera mit Blitz aktivieren, ohne dass die Kamera geöffnet werden muss. Das Kameragerät hat beim Zugriff auf den Blitz eine höhere Priorität als das Kameramodul. Wenn Sie eine Kamera öffnen, wird die Taschenlampe ausgeschaltet, wenn sie über die Moduloberfläche aktiviert wurde. Bei Ressourcenkonflikten, z. B. wenn
open()
zum Öffnen eines Kamerageräts aufgerufen wird, muss das HAL-Modul der Kamera das Framework über den Status-Callback des Taschenlampenmodus darüber informieren, dass der Taschenlampenmodus deaktiviert wurde. - Unterstützung externer Kameras (z. B. USB-Hot-Plug-Kameras) Die API-Updates geben an, dass die statischen Kamerainformationen nur verfügbar sind, wenn die Kamera angeschlossen und für externe Hot-Plug-Kameras einsatzbereit ist. Aufrufe zum Abrufen statischer Informationen sind ungültig, wenn der Kamerastatus nicht
CAMERA_DEVICE_STATUS_PRESENT
ist. Das Framework nutzt ausschließlich Rückrufe für Gerätestatusänderungen, um die Liste der verfügbaren externen Kameras zu verwalten. - Tipps zur Kameraarbitrage Es wird unterstützt, die Anzahl der Kamerageräte anzugeben, die gleichzeitig geöffnet und verwendet werden können. Um gültige Gerätekombinationen anzugeben, sollten die Felder
resource_cost
undconflicting_devices
immer in dercamera_info
-Struktur festgelegt sein, die vomget_camera_info
-Aufruf zurückgegeben wird. - Methode zur Modulinitialisierung. Wird vom Kameradienst aufgerufen, nachdem das HAL-Modul geladen wurde, um eine einmalige Initialisierung des HAL zu ermöglichen. Sie wird aufgerufen, bevor andere Modulmethoden aufgerufen werden.
2.3
Diese Kameramodulversion bietet Unterstützung für offene Legacy-HAL-Geräte für Kameras.
Das Framework kann damit das Kameragerät als HAL-Gerät mit niedrigerer Geräte-HAL-Version öffnen, wenn dasselbe Gerät mehrere Geräte-API-Versionen unterstützen kann.
Der Standardaufruf für das Hardwaremodul (common.methods->open
) öffnet das Kameragerät weiterhin mit der neuesten unterstützten Version, die auch in camera_info_t.device_version
aufgeführt ist.
2,2
Diese Kameramodulversion unterstützt Anbieter-Tags vom Modul und ersetzt die alte vendor_tag_query_ops
, auf die zuvor nur bei geöffnetem Gerät zugegriffen werden konnte.
2.1
Diese Kameramodulversion unterstützt asynchrone Rückrufe an das Framework vom HAL-Modul der Kamera, mit denen das Framework über Änderungen am Status des Kameramoduls informiert wird. Module, die eine gültige set_callbacks()
-Methode bereitstellen, müssen mindestens diese Versionsnummer angeben.
2
Kameramodule, die diese Versionsnummer melden, implementieren die zweite Version der HAL-Schnittstelle des Kameramoduls. Kameras, die über dieses Modul geöffnet werden können, unterstützen entweder Version 1.0 oder Version 2.0 der HAL-Schnittstelle der Kamera. Das Feld device_version
von „camera_info“ ist immer gültig. Das Feld static_camera_characteristics
von camera_info
ist gültig, wenn das Feld device_version
mindestens 2.0 ist.
1.0
Kameramodule, die diese Versionsnummern melden, implementieren die ursprüngliche HAL-Schnittstelle des Kameramoduls. Alle Kameras, die über dieses Modul geöffnet werden können, unterstützen nur Version 1 der HAL des Kamerageräts. Die Felder device_version
und static_camera_characteristics
von camera_info
sind ungültig. Dieses Modul und die zugehörigen Geräte können nur die android.hardware.Camera
API unterstützen.