Mit Android 10 werden optionale camera HAL3-Zwischenspeicher Management-APIs, mit denen Sie zur Implementierung einer Zwischenspeicherverwaltungslogik, um unterschiedliche Speicherkapazitäten Kompromisse bei der Latenz bei HAL-Implementierungen von Kameras.
Der Kamera-HAL benötigt N Anfragen (wobei N gleich der Pipeline depth) in der Pipeline in der Warteschlange stehen, benötigt aber oft nicht alle n Sätze von Ausgabepuffer.
Zum Beispiel könnte sich der HAL acht Anfragen in der Pipeline befinden, aber es kann erfordert lediglich Ausgabepuffer für die beiden Anfragen in den letzten Phasen der zu erstellen. Auf Geräten mit Android 9 und niedriger weist das Kamera-Framework wird gepuffert, wenn die Anfrage im HAL in die Warteschlange gestellt wird. Es können also sechs nicht verwendete Zwischenspeicher im HAL. In Android 10 Die HAL3-Pufferverwaltungs-APIs der Kamera ermöglichen eine Entkopplung der Ausgabedaten. um die sechs Sätze von Puffern freizugeben. Dies kann Hunderte von auf High-End-Geräten weniger Arbeitsspeicher sparen. Geräten mit wenig Arbeitsspeicher.
Abbildung 1 zeigt ein Diagramm der HAL-Schnittstelle einer Kamera für aktive Geräte Android 9 und niedriger Abbildung 2 zeigt die HAL-Schnittstelle der Kamera in Android. 10 mit die HAL3-Pufferverwaltungs-APIs der Kamera implementiert sind.
Abbildung 1: Kamera-HAL-Schnittstelle unter Android 9 und niedriger
Abbildung 2: Kamera-HAL-Schnittstelle in Android 10 unter Verwendung der Zwischenspeicherverwaltungs-APIs
APIs zur Zwischenspeicherverwaltung implementieren
Zum Implementieren der APIs zur Zwischenspeicherverwaltung muss der Kamera-HAL:
- HIDL implementieren
ICameraDevice@3.5
- Schlüssel für Kameraeigenschaften festlegen
android.info.supportedBufferManagementVersion
anHIDL_DEVICE_3_5
.
Die Kamera-HAL verwendet den
requestStreamBuffers
und
returnStreamBuffers
Methoden in
ICameraDeviceCallback.hal
um Puffer anzufordern und zurückzugeben. Der HAL muss auch den Parameter
signalStreamFlush
Methode in
ICameraDeviceSession.hal
um dem Kamera-HAL zu signalisieren, dass Puffer zurückgegeben werden.
requestStreamBuffers
Verwenden Sie die Methode
requestStreamBuffers
-Methode zum Anfordern von Puffern aus dem Kamera-Framework. Bei Verwendung der Kamera HAL3
APIs zur Pufferverwaltung
zum Erfassen von Anfragen vom Kamera-Framework
Ausgabepuffer enthalten, d. h. das Feld bufferId
in
StreamBuffer
ist 0
. Daher muss der Kamera-HAL requestStreamBuffers
verwenden, um
vom Kamerarahmen gepuffert werden.
Mit der Methode requestStreamBuffers
kann der Aufrufer mehrere Zwischenspeicher anfordern
aus mehreren Ausgabestreams in einem einzigen Aufruf verarbeitet, was weniger HIDL IPC ermöglicht.
Anrufe. Aufrufe benötigen jedoch mehr Zeit, wenn mehr Zwischenspeicher am
Dies kann sich negativ auf die Gesamtlatenz
von Anfrage zu Ergebnis auswirken.
Da requestStreamBuffers
-Aufrufe in der Kamera serialisiert sind,
wird empfohlen, dass der Kamera-HAL einen speziellen
um Puffer anzufordern.
Wenn eine Pufferanfrage fehlschlägt, muss der Kamera-HAL nicht schwerwiegende Fehler. In der folgenden Liste sind häufige Gründe aufgeführt, Anfragen fehlschlagen und wie sie von der Kamera-HAL verarbeitet werden sollen.
- Die App trennt sich vom Ausgabestream:
Dies ist ein nicht schwerwiegender Fehler. Der Kamera-HAL sollte
ERROR_REQUEST
für jede Aufnahmeanfrage auf einen unterbrochenen Stream ausgerichtet ist und bereit ist, nachfolgende Anfragen zu verarbeiten. . - Zeitüberschreitung:Dieser Fall kann auftreten, wenn eine App gerade
zeitintensiven Verarbeitung und
Änderungen an Puffern. Der Kamera-HAL sollte
Senden
ERROR_REQUEST
für Aufnahmeanfragen, die aufgrund eines Zeitüberschreitungsfehler und sind bereit, nachfolgende Anfragen normal zu verarbeiten. - Das Kamera-Framework bereitet eine neue Streamkonfiguration vor:
Der Kamera-HAL sollte bis zum nächsten
configureStreams
abgeschlossen ist, bevor SierequestStreamBuffers
erneut aufrufen. - Die HAL der Kamera hat ihre
Pufferlimit
(Feld
maxBuffers
): Der Kamera-HAL sollte warten, bis mindestens ein Zwischenspeicher des Streams zurückgegeben wird, bevorrequestStreamBuffers
noch einmal.
ReturnStreamBuffers
Verwenden Sie die Methode
returnStreamBuffers
zusätzliche Puffer an das Kamera-Framework zurückzugeben. Der Kamera-HAL normal
gibt Puffer über die Methode
processCaptureResult
aber nur Erfassungsanfragen berücksichtigen, die an den
Kamera-HAL. Mit der Methode requestStreamBuffers
kann das Ereignis
Kamera-HAL-Implementierung verwenden, um mehr Zwischenspeicher aufzubewahren, als von der
Kamera-Framework. Dann sollte die Methode returnStreamBuffers
verwendet. Wenn die HAL-Implementierung nie mehr Puffer als angefordert enthält,
Die Kamera-HAL-Implementierung muss die returnStreamBuffers
nicht aufrufen
.
SignalStreamFlush
Die
signalStreamFlush
wird vom Kamera-Framework aufgerufen, damit der Kamera-HAL benachrichtigt wird, dass alle
Puffer griffbereit. Dieser wird normalerweise aufgerufen, wenn die Kamera
Anruf
configureStreams
und muss die Pipeline für die Kameraaufnahme entleeren. Ähnlich wie returnStreamBuffers
Wenn eine Kamera-HAL-Implementierung nicht mehr Puffer einhält als
angefordert wird, ist es möglich, dass die Implementierung dieser Methode leer ist.
Nachdem das Kamera-Framework aufgerufen wurde,
signalStreamFlush
,
sendet das Framework keine neuen Aufnahmeanfragen an den Kamera-HAL, bis alle
Die Puffer wurden an das Kamera-Framework zurückgegeben. Wenn alle Puffer
zurückgegeben, schlagen die Aufrufe der requestStreamBuffers
-Methode fehl und die Kamera
Framework seine Arbeit in einem sauberen Zustand fortsetzen kann. Die Kamera
ruft entweder die
configureStreams
oder
processCaptureRequest
. Wenn das Kamera-Framework die Methode configureStreams
aufruft,
HAL kann wieder Puffer anfordern, nachdem der configureStreams
-Aufruf zurückgegeben wurde
erfolgreich war. Wenn das Kamera-Framework die Methode processCaptureRequest
aufruft,
kann der Kamera-HAL während der processCaptureRequest
Puffer anfordern.
aufrufen.
Die Semantik für die signalStreamFlush
-Methode und die
flush
. Wenn die Methode flush
aufgerufen wird, kann der HAL die ausstehende Erfassung abbrechen.
Anfragen mit
ERROR_REQUEST
um die Pipeline so schnell wie möglich zu entleeren. Wann?
wenn die Methode signalStreamFlush
aufgerufen wird, muss der HAL alle ausstehenden
Anfragen normal erfassen und alle Puffer an das Kamera-Framework zurückgeben.
Ein weiterer Unterschied zwischen der Methode signalStreamFlush
und anderen Methoden ist
signalStreamFlush
ist eine einseitige HIDL-Methode. Das bedeutet, dass die Kamera
kann das Framework andere blockierende APIs aufrufen, bevor der HAL die
signalStreamFlush
Anruf. Das bedeutet, dass
die Methode signalStreamFlush
und andere Methoden (insbesondere die
configureStreams
) können in einer anderen Reihenfolge am Kamera-HAL ankommen
als die Reihenfolge, in der sie im Kamera-Framework aufgerufen wurden. Um dieses Problem zu beheben
asynchrones Problem wurde, wurde das Feld streamConfigCounter
zu
StreamConfiguration
und als Argument zu signalStreamFlush
hinzugefügt
. Die Kamera-HAL-Implementierung sollte die Methode streamConfigCounter
verwenden.
Argument, um zu bestimmen, ob ein signalStreamFlush
-Aufruf später eintrifft als
zum entsprechenden configureStreams
-Aufruf. Abbildung 3 zeigt ein Beispiel.
Abbildung 3: Wie der Kamera-HAL Signal-StreamFlush-Aufrufe erkennen und verarbeiten soll, die verspätet eingehen
Verhaltensänderungen bei der Implementierung der APIs zur Zwischenspeicherverwaltung
Wenn Sie die APIs zur Zwischenspeicherverwaltung verwenden, die folgenden möglichen Änderungen des Kameraverhaltens und Kamera-HAL-Implementierung:
Anfragen kommen schneller und häufiger am Kamera-HAL an häufig:Ohne Pufferverwaltungs-APIs fordert das Kamera-Framework an, Ausgabepuffer für jede Erfassungsanfrage, bevor eine Erfassungsanfrage an Kamera-HAL. Bei Verwendung der APIs zur Zwischenspeicherverwaltung kann das Kamera-Framework muss nicht mehr auf Puffer warten und kann daher Erfassungsanfragen senden. an die Kamera-HAL.
Ohne APIs zur Zwischenspeicherverwaltung wird das Kamera-Framework gestoppt, Senden von Erfassungsanfragen, wenn einer der Ausgabestreams der Erfassung Anfrage hat die maximale Anzahl von Puffern für den HAL erreicht, die einmal (dieser Wert wird vom Kamera-HAL im Feld
HalStream::maxBuffers
im Rückgabewert vonconfigureStreams
aufrufen). Mit den APIs zur Zwischenspeicherverwaltung ist dieses Drosselungsverhalten nicht mehr vorhanden ist und die HAL-Implementierung der Kamera keineprocessCaptureRequest
-Aufrufe, wenn der HAL zu viele Erfassungsanfragen hat in der Warteschlange.Die Anruflatenz von
requestStreamBuffers
schwankt erheblich: Es sind aus vielen Gründen kann einrequestStreamBuffers
-Anruf länger dauern als Durchschnitt. Beispiel:- In den ersten Zwischenspeichern eines neu erstellten Streams ruft kann länger dauern, da das Gerät Speicher zuweisen muss.
- Die erwartete Latenz erhöht sich proportional zur Anzahl der Puffer, die bei jedem Aufruf angefordert werden.
- Die App enthält Zwischenspeicher und wird gerade verarbeitet. Dieses können dazu führen, dass Pufferanfragen verlangsamt werden oder aufgrund eines zu wenig Puffer oder eine ausgelastete CPU.
Strategien zur Zwischenspeicherverwaltung
Die APIs zur Zwischenspeicherverwaltung ermöglichen verschiedene Arten der Zwischenspeicherverwaltung. die implementiert werden sollen. Dazu einige Beispiele:
- Abwärtskompatibel:Der HAL fordert Zwischenspeicher für eine Erfassungsanfrage an.
während des
processCaptureRequest
-Anrufs. Diese Strategie bietet keine Arbeitsspeicher sparen, kann aber als erste Implementierung des Zwischenspeichers dienen. und nur sehr wenige Codeänderungen am vorhandenen Kamera-HAL erforderlich sind. - Maximale Arbeitsspeichereinsparung:Der Kamera-HAL fordert nur Ausgabepuffer an. bevor ein Wert ausgefüllt werden muss. Mit dieser Strategie können maximale Speichereinsparungen erzielen. Der potenzielle Nachteil ist eine größere Kamera-Pipeline. Verzögerung, wenn der Abschluss von Pufferanfragen ungewöhnlich lange dauert.
- Im Cache:Der Kamera-HAL speichert einige Zwischenspeicher im Cache, sodass die Wahrscheinlichkeit geringer ist, dass er diese speichert. von einer gelegentlich langsamen Pufferanfrage betroffen sein.
Der Kamera-HAL kann für bestimmte Anwendungsfälle unterschiedliche Strategien anwenden, zum Beispiel bei Anwendungsfällen, bei denen viel Arbeitsspeicher und die abwärtskompatible Strategie für andere Anwendungsfälle.
Beispielimplementierung im HAL der externen Kamera
Der HAL für die externe Kamera wurde mit Android 9 eingeführt und befindet sich in der
Quellstruktur bei
hardware/interfaces/camera/device/3.5/
In Android 10 wurde sie aktualisiert, um
ExternalCameraDeviceSession.cpp
,
eine Implementierung der Zwischenspeicherverwaltungs-API. Dieser externe Kamera-HAL
implementiert die Strategie zur Maximierung der Einsparungen beim Arbeitsspeicher, wie unter Pufferverwaltung beschrieben.
in ein paar Hundert Zeilen
C++-Code.