Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Transmisión simultánea de la cámara

Android permite que los dispositivos admitan la transmisión simultánea de dispositivos con cámara. Por ejemplo, esto permite que un dispositivo tenga las cámaras frontal y trasera funcionando al mismo tiempo. Desde Android 11, la API de Camera2 incluye los siguientes métodos a los que las aplicaciones pueden llamar para determinar si las cámaras admiten la transmisión simultánea y las configuraciones de transmisión que son compatibles.

  • getConcurrentStreamingCameraIds : Obtiene el conjunto de combinaciones de identificadores de dispositivo de cámara conectados actualmente que el apoyo Configuración de sesiones de dispositivos cámara al mismo tiempo.
  • isConcurrentSessionConfigurationSupported : Comprueba si el conjunto provisto de dispositivos de cámara y sus correspondientes configuraciones de sesión se puede configurar al mismo tiempo.

Un conjunto de combinaciones de flujo obligatorias que debe ser apoyado durante la transmisión simultánea están incluidos través de características de la cámara de un dispositivo de cámara en el SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS propiedad.

Cada dispositivo de cámara anunciada a través getConcurrentStreamingCameraIds() debe ser compatible con las siguientes configuraciones garantizados por las corrientes concurrentes.

Objetivo 1 Objetivo 2
Escribe tamaño máximo Escribe tamaño máximo Ejemplos de casos de uso
YUV s1440p Procesamiento de imágenes o videos en la aplicación
PRIV s1440p Análisis del visor en la aplicación
JPEG s1440p Sin captura de imágenes fijas en el visor
YUV / PRIV s720p JPEG s1440p Imágenes fijas estándar
YUV / PRIV s720p YUV / PRIV s1440p Procesamiento o video en la aplicación con vista previa

Los dispositivos con la MONOCHROME capacidad ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES incluye CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ) apoyar Y8 debe ser compatible con la sustitución de YUV arroyos con Y8 en todas las combinaciones flujo garantizado.

s720p refiere a 720p (1280 x 720) o la resolución máxima admitida para el formato particular devuelto por StreamConfigurationMap.getOutputSizes() . s1440p refiere a 1440p (1920 x 1440) o la resolución máxima admitida para el formato particular devuelto por StreamConfigurationMap.getOutputSizes() . Los dispositivos cuyas capacidades no incluyen ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE deben soportar al menos una sola corriente Y16, Dataspace::DEPTH con resolución SVGA, durante el funcionamiento concurrente, donde SVGA es el menor de los dos siguientes resoluciones:

  • resolución de salida máxima para el formato dado
  • 640 x 480

Implementación

Para permitir que las aplicaciones para consultar un dispositivo para determinar si sus cámaras admite la transmisión simultánea, aplicar la ICameraProvider@2.6 interfaz de HAL, que incluye los siguientes métodos:

Para una implementación de referencia de la ICameraProvider@2.6 interfaz de HAL, véase la biblioteca HAL cámara emulado en EmulatedCameraProviderHWLImpl.cpp .

Validación

Para la prueba de que la implementación de esta característica funciona como está previsto, utilice el ConcurrentCameraTest.java prueba de CTS. Además, pruebe con una aplicación que abra varias cámaras y las opere al mismo tiempo.

Problemas de asignación de recursos

Si los HAL de la cámara anuncian soporte para el funcionamiento simultáneo de dispositivos de cámara, es posible que se encuentren con problemas de asignación de recursos, especialmente en el caso de que haya suficientes recursos de procesador de señal de imagen (ISP) en el teléfono para transmitir tanto la cámara frontal como la trasera (u otras) al mismo tiempo. , pero no en toda su capacidad. En este caso, la cámara HAL debe asignar recursos de hardware limitados a cada dispositivo de cámara.

Escenario de ejemplo

El siguiente escenario demuestra este problema.

Problema

El dispositivo tiene la siguiente configuración:

  • Cámara ID 0 es una cámara lógico respaldado por una cámara de ancho y ultra-ancha, que cada toma un recurso ISP.
  • ID de la cámara 1 es una cámara que tiene un recurso ISP.

El dispositivo (teléfono) tiene dos ISP. Si la cámara ID 0 se abre una sesión y está configurado, es posible que las reservas cámara HAL dos ISP anticipando tanto ultra ancha y el uso de ancho de la cámara.

Si ese es el caso, la cámara frontal (ID 1 ) No se puede configurar cualquier corriente debido a que ambos proveedores de Internet están en uso.

Solución

Para hacer frente a este problema, el marco puede abrir ambos ID de cámara 0 y 1 antes de configurar las sesiones para proporcionar una sugerencia a la cámara HAL sobre cómo asignar los recursos (ya que ahora espera que la operación simultánea de las cámaras). Sin embargo, esto puede conducir a capacidades limitadas, por ejemplo, es posible que el zoom no pueda manejar la relación de rango de zoom completo (porque cambiar las ID físicas de la cámara puede ser problemático).

Para implementar esta solución, realizar los siguientes cambios a provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds .

  • Mandato que para el funcionamiento simultáneo de las cámaras, el marco cámara debe abrir dispositivos de cámara ( @3.2::ICameraDevice::open ) antes de configurar cualquier sesión en los dispositivos de la cámara. Esto permite a los proveedores de cámaras asignar recursos en consecuencia.

  • Para abordar el problema de no ser capaz de manejar la relación de toda la gama zoom, garantizar que las aplicaciones de la cámara, al utilizar cámaras al mismo tiempo, están garantizados para utilizar el ZOOM_RATIO ajuste de control sólo entre 1x y MAX_DIGITAL_ZOOM en lugar de la completa ZOOM_RATIO_RANGE (esto evita que la conmutación de cámaras físicas internamente, lo que potencialmente requiere más ISP).

Problema con testDualCameraPreview

Cuando realiza las actualizaciones anteriormente, se puede crear un problema con un comportamiento permitido por el MultiViewTest.java#testDualCameraPreview prueba.

La prueba testDualCameraPreview no lo hace sesiones de configure sólo después de la apertura de todas las cámaras. Sigue esta secuencia:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

Lo hace, sin embargo, tolera fallas abiertas cámara con ERROR_MAX_CAMERAS_IN_USE [1] . Las aplicaciones de terceros pueden depender de este comportamiento.

Debido a que la cámara HAL no conocerá el conjunto completo de ID de cámara que se abren para la operación simultánea antes de configurar las sesiones, podría resultarle difícil asignar recursos de hardware (suponiendo que haya competencia por ellos).

Para hacer frente a este problema, se mantiene la compatibilidad hacia atrás, además de apoyar el streaming concurrente, HAL cámara debe fallar openCamera llamadas con ERROR_MAX_CAMERAS_IN_USE si no pueden soportar la configuración flujo completo para todas las cámaras que se ejecutan simultáneamente.