Flujos de salida
El subsistema de la cámara funciona únicamente en la canalización basada en ANativeWindow para todas las resoluciones y formatos de salida. Se pueden configurar varios flujos a la vez para enviar un solo fotograma a muchos destinos, como la GPU, el codificador de video, RenderScript o los búferes visibles para la app (búferes RAW de Bayer, búferes YUV procesados o búferes codificados en JPEG).
Como optimización, estos flujos de salida se deben configurar con anticipación y solo puede existir una cantidad limitada a la vez. Esto permite la asignación previa de búferes de memoria y la configuración del hardware de la cámara, de modo que, cuando se envíen solicitudes con varias canalizaciones de salida o con canalizaciones de salida variables, no habrá demoras ni latencia en el cumplimiento de la solicitud.
Para obtener más información sobre las combinaciones de salida de transmisión garantizadas que dependen del nivel de hardware admitido, consulta createCaptureSession()
.
Recorte
El recorte del array de píxeles completo (para el zoom digital y otros casos de uso en los que se desea un campo de visión más pequeño) se comunica a través del parámetro de configuración ANDROID_SCALER_CROP_REGION. Este es un parámetro de configuración por solicitud que puede cambiar según la solicitud, lo que es fundamental para implementar un zoom digital fluido.
La región se define como un rectángulo (x, y, ancho, alto), en el que (x, y) describe la esquina superior izquierda del rectángulo. El rectángulo se define en el sistema de coordenadas del array de píxeles activos del sensor, en el que (0,0) es el píxel superior izquierdo del array de píxeles activos. Por lo tanto, el ancho y la altura no pueden ser mayores que las dimensiones que se indican en el campo de información estática ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. El HAL informa el ancho y el alto mínimos permitidos a través del campo de información estática ANDROID_SCALER_MAX_DIGITAL_ZOOM, que describe el factor de zoom máximo admitido. Por lo tanto, el ancho y la altura mínimos de la región de recorte son los siguientes:
{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) }
Si la región de recorte debe cumplir con requisitos específicos (por ejemplo, debe comenzar en coordenadas pares y su ancho o alto debe ser par), el HAL debe realizar el redondeo necesario y escribir la región de recorte final que se usó en los metadatos del resultado de salida. Del mismo modo, si el HAL implementa la estabilización de video, debe ajustar la región de recorte del resultado para describir la región que se incluye realmente en la salida después de que se aplica la estabilización de video. En general, una app que usa la cámara debe poder determinar el campo visual que recibe en función de la región de recorte, las dimensiones del sensor de imagen y la distancia focal del lente.
Dado que la región de recorte se aplica a todas las transmisiones, que pueden tener relaciones de aspecto diferentes a la región de recorte, la región del sensor exacta que se usa para cada transmisión puede ser más pequeña que la región de recorte. Específicamente, cada transmisión debe mantener píxeles cuadrados y su relación de aspecto recortando mínimamente la región de recorte definida. Si la relación de aspecto de la transmisión es más ancha que la región de recorte, la transmisión se debe recortar más verticalmente. Si la relación de aspecto de la transmisión es más estrecha que la región de recorte, la transmisión se debe recortar más horizontalmente.
En todos los casos, el recorte de la transmisión debe centrarse dentro de la región de recorte completa, y cada transmisión solo se recorta horizontal o verticalmente en relación con la región de recorte completa, nunca ambas.
Por ejemplo, si se definen dos transmisiones, una de 640 x 480 (relación de aspecto 4:3) y otra de 1280 x 720 (relación de aspecto 16:9), a continuación, se muestran las regiones de salida esperadas para cada transmisión en algunas regiones de recorte de muestra, en un sensor hipotético de 3 MP (matriz de píxeles de 2,000 x 1,500).
Región de recorte: (500, 375, 1000, 750) (relación de aspecto de 4:3)
Recorte de transmisión de 640 × 480: (500, 375, 1000, 750) (igual a la región de recorte)
Recorte de transmisión de 1280 × 720: (500, 469, 1000, 562)

Figura 1: Proporción de 4:3
Región de recorte: (500, 375, 1333, 750) (relación de aspecto de 16:9)
Recorte de transmisión de 640 × 480: (666, 375, 1000, 750)
Recorte de transmisión de 1280 × 720: (500, 375, 1333, 750) (igual a la región de recorte)

Figura 2: Relación de aspecto de 16:9
Región de recorte: (500, 375, 750, 750) (relación de aspecto 1:1)
Recorte de transmisión de 640 x 480: (500, 469, 750, 562)
Recorte de transmisión de 1280 x 720: (500, 543, 750, 414)

Figura 3: Relación de aspecto de 1:1
Y un último ejemplo, una transmisión con una relación de aspecto cuadrada de 1,024 x 1,024 en lugar de la transmisión de 480 p:
Región de recorte: (500, 375, 1000, 750) (relación de aspecto 4:3)
Recorte de transmisión de 1,024 x 1,024: (625, 375, 750, 750)
Recorte de transmisión de 1,280 x 720: (500, 469, 1000, 562)

Figura 4: Relación de aspecto de 4:3, cuadrada
Reprocesamiento
La compatibilidad adicional con archivos de imágenes sin procesar se proporciona a través de la compatibilidad con el reprocesamiento de datos Bayer RAW. Esta compatibilidad permite que la canalización de la cámara procese un búfer RAW y metadatos capturados anteriormente (un fotograma completo que se grabó antes) para producir un nuevo resultado YUV o JPEG renderizado.
Zoom
En los dispositivos que ejecutan Android 11 o versiones posteriores, una app puede usar el zoom de la cámara (digital y óptico) a través del parámetro de configuración ANDROID_CONTROL_ZOOM_RATIO
.
La proporción de zoom se define como un factor de punto flotante. En lugar de usar ANDROID_SCALER_CROP_REGION
para el recorte y el zoom, una app puede usar ANDROID_CONTROL_ZOOM_RATIO
para controlar el nivel de zoom y ANDROID_SCALER_CROP_REGION
para el recorte horizontal y vertical, y así lograr relaciones de aspecto diferentes a las del sensor de la cámara nativa.
Un sistema de varias cámaras puede contener más de un objetivo con diferentes distancias focales, y el usuario puede usar el zoom óptico cambiando de objetivo.
Usar ANDROID_CONTROL_ZOOM_RATIO
tiene beneficios en las siguientes situaciones:
- Acercar la imagen de un lente gran angular a un teleobjetivo: Una proporción de punto flotante proporciona una mejor precisión en comparación con los valores enteros de
ANDROID_SCALER_CROP_REGION
. - Alejar el zoom de un lente gran angular a un lente ultra gran angular:
ANDROID_CONTROL_ZOOM_RATIO
admite el alejamiento del zoom (<1.0f), mientras queANDROID_SCALER_CROP_REGION
no lo admite.
Relación de zoom: 2.0; 1/4 del campo de visión original
Región de recorte: (0, 0, 2000, 1500) (relación de aspecto 4:3)
Recorte de transmisión de 640 × 480: (0, 0, 2000, 1500) (igual a la región de recorte)
Recorte de transmisión de 1280 × 720: (0, 187, 2000, 1125)

Figura 5: Zoom de 2.0, relación de aspecto de 4:3
Relación de zoom: 2.0; 1/4 del campo de visión original
Región de recorte: (0, 187, 2000, 1125) (relación de aspecto 16:9)
Recorte de transmisión de 640 x 480: (250, 187, 1500, 1125) (con barras laterales)
Recorte de transmisión de 1280 x 720: (0, 187, 2000, 1125) (igual a la región de recorte)

Figura 6: Zoom de 2.0, relación de aspecto de 16:9
Relación de zoom: 0.5; 4 veces el campo de visión original (se cambió del lente gran angular al lente ultra gran angular)
Región de recorte: (250, 0, 1500, 1500) (relación de aspecto 1:1)
Recorte de transmisión de 640 x 480: (250, 187, 1500, 1125) (formato letterbox)
Recorte de transmisión de 1280 x 720: (250, 328, 1500, 844) (formato letterbox)

Figura 7: Zoom de 0.5, relación de aspecto de 1:1
Como se observa en los gráficos anteriores, el sistema de coordenadas de la región de recorte cambia al campo de visión efectivo posterior al zoom y se representa con el rectángulo con las siguientes dimensiones: (0
, 0
, activeArrayWith
, activeArrayHeight
). Lo mismo se aplica a las regiones y los rostros de AE/AWB/AF. Este cambio en el sistema de coordenadas no se aplica a la captura RAW ni a sus metadatos relacionados, como intrinsicCalibration
y lensShadingMap
.
Con el mismo ejemplo hipotético anterior y suponiendo que la transmisión de salida núm. 1 (640 x 480) es la transmisión del visor, se puede lograr un zoom de 2.0x de una de las siguientes dos maneras:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(predeterminado),scaler.cropRegion = (500, 375, 1000, 750)
Para que una app establezca android.control.aeRegions
como el cuarto superior izquierdo del campo de visión del visor, configura android.control.aeRegions
como (0, 0, 1000, 750)
con android.control.zoomRatio
establecido en 2.0
. Como alternativa, la app puede establecer android.control.aeRegions
en la región equivalente de (500, 375, 1000, 750)
para android.control.zoomRatio
de 1.0
.