Kamera-HAL3-Zwischenspeicherverwaltungs-APIs

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.

Pufferverwaltung bis 9

Abbildung 1: Kamera-HAL-Schnittstelle unter Android 9 und niedriger

Zwischenspeicherverwaltung in Android 10

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:

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 Sie requestStreamBuffers 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, bevor requestStreamBuffers 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.

Verspätete Anrufe verarbeiten

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 von configureStreams aufrufen). Mit den APIs zur Zwischenspeicherverwaltung ist dieses Drosselungsverhalten nicht mehr vorhanden ist und die HAL-Implementierung der Kamera keine processCaptureRequest-Aufrufe, wenn der HAL zu viele Erfassungsanfragen hat in der Warteschlange.

  • Die Anruflatenz von requestStreamBuffers schwankt erheblich: Es sind aus vielen Gründen kann ein requestStreamBuffers-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.