Ausgabestreams
Das Kamerasubsystem arbeitet ausschließlich mit der ANativeWindow-basierten Pipeline für alle Auflösungen und Ausgabeformate. Es können mehrere Streams gleichzeitig konfiguriert werden, um einen einzelnen Frame an viele Ziele zu senden, z. B. an die GPU, den Video Encoder, RenderScript, oder an für Apps sichtbare Puffer (RAW-Bayer-, verarbeitete YUV oder JPEG-codierte Puffer).
Zur Optimierung müssen diese Ausgabestreams im Voraus konfiguriert werden. Es kann nur eine begrenzte Anzahl gleichzeitig vorhanden sein. So können Speicherpuffer vorab zugewiesen und die Kamerahardware konfiguriert werden. Wenn Anfragen mit mehreren oder unterschiedlichen Ausgabepipelines gesendet werden, kommt es nicht zu Verzögerungen oder Latenzen bei der Bearbeitung der Anfrage.
Weitere Informationen zu den garantierten Stream-Ausgabekombinationen
, die vom unterstützten Hardware-Level abhängen, finden Sie unter
createCaptureSession().
Zuschneiden
Das Zuschneiden des vollständigen Pixel-Arrays (für digitalen Zoom und andere Anwendungsfälle, bei denen ein kleineres Sichtfeld gewünscht ist) wird über die Einstellung ANDROID_SCALER_CROP_REGION kommuniziert. Dies ist eine Einstellung pro Anfrage, die sich für jede Anfrage ändern kann, das ist entscheidend für die Implementierung eines reibungslosen digitalen Zooms.
Die Region wird als Rechteck (x, y, Breite, Höhe) definiert, wobei (x, y) die linke obere Ecke des Rechtecks beschreibt. Das Rechteck wird im Koordinatensystem des aktiven Pixel-Arrays des Sensors definiert, wobei (0,0) das linke obere Pixel des aktiven Pixel-Arrays ist. Daher können Breite und Höhe nicht größer als die in ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY angegebenen Abmessungen sein. Die zulässige Mindestbreite und ‑höhe werden von der HAL über das statische Informationsfeld ANDROID_SCALER_MAX_DIGITAL_ZOOM gemeldet, das den maximal unterstützten Zoomfaktor beschreibt. Daher sind die Mindestbreite und ‑höhe der Zuschneideregion:
{width, height} =
{ floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM),
floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
Wenn die Zuschneideregion bestimmte Anforderungen erfüllen muss (z. B. muss sie an geraden Koordinaten beginnen und ihre Breite/Höhe muss gerade sein), muss die HAL die erforderliche Rundung vornehmen und die endgültige Zuschneideregion in die Metadaten des Ausgaberesultats schreiben. Wenn die HAL die Videostabilisierung implementiert, muss sie die Zuschneideregion des Ergebnisses anpassen, um die Region zu beschreiben, die tatsächlich in der Ausgabe enthalten ist, nachdem die Videostabilisierung angewendet wurde. Im Allgemeinen muss eine App, die die Kamera verwendet, das Sichtfeld anhand der Zuschneideregion, der Abmessungen des Bildsensors und der Brennweite des Objektivs bestimmen können.
Da die Zuschneideregion für alle Streams gilt, die möglicherweise ein anderes Seitenverhältnis als die Zuschneideregion haben, kann die für jeden Stream verwendete Sensorregion kleiner als die Zuschneideregion sein. Insbesondere sollten alle Streams quadratische Pixel und ihr Seitenverhältnis beibehalten, indem die definierte Zuschneide region nur minimal weiter zugeschnitten wird. Wenn das Seitenverhältnis des Streams breiter als die Zuschneideregion ist, sollte der Stream vertikal weiter zugeschnitten werden. Wenn das Seitenverhältnis des Streams schmaler als die Zuschneideregion ist, sollte der Stream horizontal weiter zugeschnitten werden.
In allen Fällen muss der Stream-Zuschnitt in der Mitte der vollständigen Zuschneideregion liegen, und jeder Stream wird nur horizontal oder vertikal relativ zur vollständigen Zuschneideregion zugeschnitten, nie beides.
Wenn beispielsweise zwei Streams definiert sind, ein 640 × 480-Stream (Seitenverhältnis 4:3) und ein 1280 × 720-Stream (Seitenverhältnis 16:9), zeigt die folgende Abbildung die erwarteten Ausgaberegionen für jeden Stream für einige Beispiel-Zuschneideregionen auf einem hypothetischen 3-MP-Sensor (2000 × 1500 Pixel-Array).
Zuschneideregion: (500, 375, 1000, 750) (Seitenverhältnis 4:3)
Zuschnitt des 640 × 480-Streams: (500, 375, 1000, 750) (entspricht der Zuschneideregion)
Zuschnitt des 1280 × 720-Streams: (500, 469, 1000, 562)
Abbildung 1. Seitenverhältnis 4:3
Zuschneideregion: (500, 375, 1333, 750) (Seitenverhältnis 16:9)
Zuschnitt des 640 × 480-Streams: (666, 375, 1000, 750)
Zuschnitt des 1280 × 720-Streams: (500, 375, 1333, 750) (entspricht der Zuschneideregion)
Abbildung 2. Seitenverhältnis 16:9
Zuschneideregion: (500, 375, 750, 750) (Seitenverhältnis 1:1)
Zuschnitt des 640 × 480-Streams: (500, 469, 750, 562)
Zuschnitt des 1280 × 720-Streams: (500, 543, 750, 414)
Abbildung 3. Seitenverhältnis 1:1
Ein letztes Beispiel: ein 1024 × 1024-Stream mit quadratischem Seitenverhältnis anstelle des 480p
Streams:
Zuschneideregion: (500, 375, 1000, 750) (Seitenverhältnis 4:3)
Zuschnitt des 1024 × 1024-Streams: (625, 375, 750, 750)
Zuschnitt des 1280 × 720-Streams: (500, 469, 1000, 562)
Abbildung 4. Seitenverhältnis 4:3, quadratisch
Erneute Verarbeitung
Die Unterstützung für die erneute Verarbeitung von RAW-Bayer- Daten bietet zusätzliche Unterstützung für RAW-Bilddateien. Mit dieser Unterstützung kann die Kamerapipeline einen zuvor aufgenommenen RAW-Puffer und Metadaten (einen gesamten Frame, der zuvor aufgezeichnet wurde) verarbeiten, um eine neue gerenderte YUV- oder JPEG-Ausgabe zu erstellen.
Zoom
Auf Geräten mit Android 11 oder höher kann eine App den Zoom einer Kamera
(digital und optisch) über die ANDROID_CONTROL_ZOOM_RATIO Einstellung verwenden.
Das Zoomverhältnis wird als Gleitkommafaktor definiert. Anstelle von ANDROID_SCALER_CROP_REGION für Zuschneiden und Zoom kann eine App ANDROID_CONTROL_ZOOM_RATIO verwenden, um die Zoomstufe zu steuern, und ANDROID_SCALER_CROP_REGION für horizontales und vertikales Zuschneiden verwenden, um Seitenverhältnisse zu erzielen, die sich vom nativen Kamerasensor unterscheiden.
Ein System mit mehreren Kameras kann mehr als ein Objektiv mit unterschiedlichen Brennweiten enthalten. Der Nutzer kann den optischen Zoom verwenden, indem er zwischen den Objektiven wechselt.
Die Verwendung von ANDROID_CONTROL_ZOOM_RATIO hat in den folgenden Szenarien Vorteile:
- Von einem Weitwinkelobjektiv zu einem Teleobjektiv zoomen: Ein Gleitkommaverhältnis
bietet eine bessere Genauigkeit als die ganzzahligen Werte von
ANDROID_SCALER_CROP_REGION. - Von einem Weitwinkelobjektiv zu einem Ultraweitwinkelobjektiv zoomen:
ANDROID_CONTROL_ZOOM_RATIOunterstützt das Verkleinern (< 1,0f), währendANDROID_SCALER_CROP_REGIONdies nicht tut.
Zoomverhältnis: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneideregion: (0, 0, 2000, 1500) (Seitenverhältnis 4:3)
Zuschnitt des 640 × 480-Streams: (0, 0, 2000, 1500) (entspricht der Zuschneideregion)
Zuschnitt des 1280 × 720-Streams: (0, 187, 2000, 1125)
Abbildung 5. 2,0-facher Zoom, Seitenverhältnis 4:3
Zoomverhältnis: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneideregion: (0, 187, 2000, 1125) (Seitenverhältnis 16:9)
Zuschnitt des 640 × 480-Streams: (250, 187, 1500, 1125) (mit schwarzen Balken an den Seiten)
Zuschnitt des 1280 × 720-Streams: (0, 187, 2000, 1125) (entspricht der Zuschneideregion)
Abbildung 6. 2,0-facher Zoom, Seitenverhältnis 16:9
Zoomverhältnis: 0,5; 4-faches ursprüngliches Sichtfeld (von Weitwinkelobjektiv zu Ultraweitwinkelobjektiv gewechselt)
Zuschneideregion: (250, 0, 1500, 1500) (Seitenverhältnis 1:1)
Zuschnitt des 640 × 480-Streams: (250, 187, 1500, 1125) (mit schwarzen Balken oben und unten)
Zuschnitt des 1280 × 720-Streams: (250, 328, 1500, 844) (mit schwarzen Balken oben und unten)
Abbildung 7. 0,5-facher Zoom, Seitenverhältnis 1:1
Wie in den obigen Diagrammen zu sehen ist, ändert sich das Koordinatensystem der Zuschneideregion zum effektiven Sichtfeld nach dem Zoom und wird durch das Rechteck mit den folgenden Abmessungen dargestellt: (0, 0, activeArrayWith, activeArrayHeight). Das gilt auch für AE/AWB/AF-Regionen und Gesichter. Diese Änderung des Koordinatensystems gilt nicht für die RAW-Aufnahme und die zugehörigen Metadaten wie intrinsicCalibration und lensShadingMap.
Im obigen hypothetischen Beispiel und unter der Annahme, dass Ausgabestream 1 (640 × 480) der Sucherstream ist, kann ein 2,0-facher Zoom auf zwei Arten erreicht werden:
zoomRatio = 2.0,scaler.cropRegion = (0, 0, 2000, 1500)zoomRatio = 1.0(Standard),scaler.cropRegion = (500, 375, 1000, 750)
Wenn eine App android.control.aeRegions auf das linke obere Viertel des Sichtfelds des Suchers setzen soll, legen Sie android.control.aeRegions auf (0, 0, 1000, 750) und android.control.zoomRatio auf 2.0 fest. Alternativ kann die App android.control.aeRegions für android.control.zoomRatio von 1.0 auf die entsprechende Region von (500, 375, 1000, 750) setzen.