Ausgabestreams, Zuschneiden und Zoomen

Ausgabestreams

Das Kamera-Subsystem verwendet für alle Auflösungen und Ausgabeformate ausschließlich die ANativeWindow-basierte Pipeline. Mehrere Streams können gleichzeitig konfiguriert werden, um einen einzelnen Frame an viele Ziele zu senden, z. B. an die GPU, den Videoencoder, RenderScript oder an app-sichtbare Puffer (RAW Bayer, verarbeitete YUV-Puffer oder JPEG-codierte Puffer).

Zur Optimierung müssen diese Ausgabestreams im Voraus konfiguriert werden und es darf nur eine begrenzte Anzahl gleichzeitig vorhanden sein. Dies ermöglicht eine Vorabzuweisung von Arbeitsspeicherpuffern und die Konfiguration der Kamerahardware, sodass es zu keinen Verzögerungen oder Latenzen bei der Ausführung der Anfrage kommt, wenn Anfragen mit mehreren oder unterschiedlichen aufgeführten Ausgabepipelines gesendet werden.

Weitere Informationen zu den Kombinationen mit garantierter Streamausgabe, die von der unterstützten Hardwareebene abhängen, finden Sie unter createCaptureSession().

Zuschneiden

Das Zuschneiden des vollständigen Pixelarrays (für digitalen Zoom und andere Anwendungsfälle, in denen ein kleineres Sichtfeld wünschenswert ist) wird über die Einstellung ANDROID_SCALER_CROP_REGION gesendet. Diese Einstellung gilt pro Anfrage und kann sich ändern. Das ist entscheidend für die Implementierung eines flüssigen digitalen Zooms.

Die Region wird als Rechteck (x, y, width, height) definiert, wobei (x, y) die linke obere Ecke des Rechtecks beschreibt. Das Rechteck wird im Koordinatensystem des aktiven Pixel-Arrays des Sensors definiert. Dabei ist (0,0) das Pixel oben links im aktiven Pixel-Array. Daher dürfen Breite und Höhe nicht größer sein als die im statischen Info-Feld ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY angegebenen Abmessungen. Die minimal zulässige Breite und Höhe werden von der HAL über das statische Info-Feld ANDROID_SCALER_MAX_DIGITAL_ZOOM gemeldet, das den maximal unterstützten Zoomfaktor beschreibt. Die minimale Breite und Höhe des Zuschneidebereichs sind daher:

  {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 der Zuschnittsbereich bestimmte Anforderungen erfüllen muss (z. B. muss er an geraden Koordinaten beginnen und seine Breite/Höhe muss gerade sein), muss die HAL die erforderlichen Rundungen vornehmen und den endgültigen Zuschnittsbereich in die Metadaten der Ausgabeergebnisse schreiben. Wenn die HAL die Videostabilisierung implementiert, muss sie den Bereich für die resultierende Zuschneidung anpassen, um den Bereich zu beschreiben, der nach der Anwendung der Videostabilisierung tatsächlich in der Ausgabe enthalten ist. Im Allgemeinen muss eine Kamera-App in der Lage sein, das Sichtfeld basierend auf dem Zuschnittbereich, den Abmessungen des Bildsensors und der Brennweite des Objektivs zu bestimmen.

Da der Zuschnittsbereich für alle Streams gilt, die möglicherweise ein anderes Seitenverhältnis als der Zuschnittsbereich haben, ist der genaue Sensorbereich, der für jeden Stream verwendet wird, möglicherweise kleiner als der Zuschnittsbereich. Insbesondere sollten bei jedem Stream quadratische Pixel und das Seitenverhältnis beibehalten werden, indem der definierte Zuschneidebereich nur minimal weiter zugeschnitten wird. Ist das Seitenverhältnis des Streams breiter als der zu beschneiden, sollte er weiter vertikal zugeschnitten werden. Ist das Seitenverhältnis des Streams schmaler als der Zuschnitt, sollte er weiter horizontal zugeschnitten werden.

In allen Fällen muss der Stream im gesamten Anbaubereich zentriert werden. Jeder Stream wird entweder horizontal oder vertikal relativ zum gesamten Zuschnittsbereich zugeschnitten, niemals beides.

Wenn beispielsweise zwei Streams definiert sind, ein Stream mit 640 × 480 (4:3) und ein Stream mit 1280 × 720 (16:9), sehen Sie unten die erwarteten Ausgabebereiche für jeden Stream für einige Beispiel-Zuschnittsbereiche auf einem hypothetischen Sensor mit 3 MP (2.000 × 1.500 Pixel).

Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Zuschnitt für 640 × 480-Stream: (500, 375, 1.000, 750) (entspricht dem Zuschneidebereich)
Zuschnitt für 1.280 × 720-Stream: (500, 469, 1.000, 562)

Anbauregion-43-Verhältnis

Abbildung 1: Bildverhältnis 4:3

Zuschneidebereich: (500, 375, 1333, 750) (Seitenverhältnis 16:9)
Stream-Zuschnitt für 640 × 480: (666, 375, 1000, 750)
Stream-Zuschnitt für 1280 × 720: (500, 375, 1333, 750) (entspricht dem Zuschneidebereich)

Verhältnis-zu-169-Ertrag

Abbildung 2. Seitenverhältnis von 16:9

Zuschneidebereich: (500, 375, 750, 750) (Seitenverhältnis 1:1)
Zuschnitt für 640 × 480 Pixel: (500, 469, 750, 562)
Zuschnitt für 1280 × 720 Pixel: (500, 543, 750, 414)

crop-region-11-ratio

Abbildung 3 Seitenverhältnis 1:1

Und noch ein letztes Beispiel: ein Stream mit quadratischem Seitenverhältnis von 1.024 × 1.024 statt des 480p-Streams:
Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Zuschnitt für Stream mit 1.024 × 1.024: (625, 375, 750, 750)
Zuschnitt für Stream mit 1.280 × 720: (500, 469, 1.000, 562)

crop-region-43-square-ratio

Abbildung 4: Seitenverhältnis 4:3, quadratisch

Nochmalige Verarbeitung

Zusätzliche Unterstützung für Rohbilddateien wird durch die Unterstützung der Nachbearbeitung von RAW-Bayer-Daten bereitgestellt. Durch diese Unterstützung kann die Kamerapipeline einen zuvor erfassten RAW-Zwischenspeicher und Metadaten (einen ganzen Frame, der zuvor aufgezeichnet wurde) verarbeiten, um eine neue gerenderte YUV- oder JPEG-Ausgabe zu erzeugen.

Zoom

Auf Geräten mit Android 11 oder höher kann eine App den Zoom (digital und optisch) einer Kamera über die Einstellung ANDROID_CONTROL_ZOOM_RATIO verwenden.

Das Zoomverhältnis wird als Gleitkommafaktor definiert. Anstatt ANDROID_SCALER_CROP_REGION für Zuschneiden und Zoomen zu verwenden, kann eine App ANDROID_CONTROL_ZOOM_RATIO zum Steuern der Zoomstufe und ANDROID_SCALER_CROP_REGION zum horizontalen und vertikalen Zuschneiden verwenden, um ein anderes Seitenverhältnis als das des nativen Kamerasensors zu erzielen.

Ein Mehrkamerasystem kann mehr als ein Objektiv mit unterschiedlichen Brennweite enthalten und der Nutzer kann den optischen Zoom verwenden, indem er zwischen verschiedenen Objektiven wechselt. Die Verwendung von ANDROID_CONTROL_ZOOM_RATIO bietet Vorteile in den folgenden Szenarien:

  • Heranzoomen von einem Weitwinkelobjektiv auf ein Teleobjektiv: Ein Gleitkommaverhältnis bietet eine bessere Genauigkeit als Ganzzahlwerte von ANDROID_SCALER_CROP_REGION.
  • Herauszoomen von einem Weitwinkel- auf ein Ultraweitwinkelobjektiv: ANDROID_CONTROL_ZOOM_RATIO unterstützt eine Herauszoomung (< 1,0f), ANDROID_SCALER_CROP_REGION hingegen nicht.

Zur Veranschaulichung sind hier mehrere Szenarien mit unterschiedlichen Zoomfaktoren, Zuschneidebereichen und Ausgabestreams zu sehen. Dabei wird dieselbe hypothetische Kamera verwendet, die im vorherigen Abschnitt definiert wurde.

Zoomverhältnis: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 0, 2.000, 1.500) (Seitenverhältnis 4:3)
Zuschnitt für 640 × 480-Stream: (0, 0, 2.000, 1.500) (entspricht dem Zuschneidebereich)
Zuschnitt für 1280 × 720-Stream: (0, 187, 2.000, 1.125)

Zoomverhältnis 2-zu-43

Abbildung 5. 2,0-facher Zoom, Seitenverhältnis 4:3

Zoomfaktor: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 187, 2000, 1125) (Seitenverhältnis 16:9)
Zuschnitt für 640 × 480 Pixel-Stream: (250, 187, 1500, 1125) (Pillarbox-Format)
Zuschnitt für 1280 × 720 Pixel-Stream: (0, 187, 2000, 1125) (entspricht dem Zuschneidebereich)

zoom-ratio-2-crop-169

Abbildung 6 2,0-facher Zoom, Seitenverhältnis 16:9

Zoomverhältnis: 0,5; 4-faches Originalsichtfeld (Wechsel vom Weitwinkel- zum Ultraweitwinkelobjektiv)
Zuschneidebereich: (250, 0, 1500, 1500) (Seitenverhältnis 1:1)
Zuschnitt für 640 × 480-Stream: (250, 187, 1500, 1125) (Letterbox-Format)
Zuschnitt für 1280 × 720-Stream: (250, 328, 1500, 844) (Letterbox-Format)

images/zoom-ratio-0.5-crop-11

Abbildung 7. 0,5 Zoom, Seitenverhältnis 1:1

Wie in den obigen Grafiken zu sehen, ändert sich das Koordinatensystem des Ausschnitts in das effektive Sichtfeld nach dem Zoomen. Es wird durch das Rechteck mit den folgenden Abmessungen dargestellt: (0, 0, activeArrayWith, activeArrayHeight). Das Gleiche gilt 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.

Angenommen, der Ausgabestream 1 (640 × 480) ist der Sucherstream, 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 in einer App android.control.aeRegions auf das linke obere Viertel des Sichtfelds im Sucher festgelegt werden soll, musst du android.control.aeRegions auf (0, 0, 1000, 750) setzen und android.control.zoomRatio auf 2.0 setzen. Alternativ kann die App android.control.aeRegions auf die entsprechende Region von (500, 375, 1000, 750) für android.control.zoomRatio von 1.0 festlegen.