Transmisión simultánea de la cámara

Android permite que los dispositivos admitan la transmisión simultánea de dispositivos de cámara. Para Por ejemplo, esto permite que un dispositivo funcione tanto con la cámara frontal como la posterior al mismo tiempo. A partir de Android 11, la API de Camera2 incluye los siguientes métodos a las que las aplicaciones pueden llamar para determinar si las cámaras admiten transmisiones concurrentes y las configuraciones de transmisión compatibles.

  • getConcurrentCameraIds: Obtiene el conjunto de combinaciones del dispositivo de cámara conectado actualmente identificadores que admiten la configuración simultánea de sesiones en el dispositivo de la cámara.
  • isConcurrentSessionConfigurationSupported: Verifica si el conjunto proporcionado de dispositivos de cámara y sus configuraciones de sesión correspondientes se pueden configurar de forma simultánea.

Un conjunto de combinaciones de transmisión obligatorias que se deben admitir durante la transmisión simultánea de transmisión se incluyen a través de las características de la cámara del dispositivo de cámara en la SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS propiedad.

Cada dispositivo de cámara anunciado a través de getConcurrentStreamingCameraIds() debe admitir las siguientes configuraciones garantizadas para transmisiones simultáneas.

Objetivo 1 Objetivo 2
Tipo Tamaño máximo Tipo Tamaño máximo Ejemplos de casos de uso
YUV s1440p Procesamiento de imágenes o video en la app
PRIV. s1440p Análisis del visor integrado en la app
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 Video integrado en la app o procesamiento con vista previa

Dispositivos con la función MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES). incluye CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) que admite Y8 debe admitir la sustitución de transmisiones YUV por Y8 en todas las combinaciones de novedades.

s720p hace referencia a 720p (1280 x 720) o a la resolución máxima admitida para el formato particular devuelto por StreamConfigurationMap.getOutputSizes() s1440p hace referencia a 1,440p (1,920 x 1,440) o a la resolución máxima admitida para el formato particular devuelto por StreamConfigurationMap.getOutputSizes() Dispositivos cuyas capacidades no incluyen ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE debe admitir al menos una transmisión Y16 única, Dataspace::DEPTH con sVGA de resolución, durante la operación simultánea, donde sVGA es el más pequeño de los dos siguientes resoluciones:

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

Implementación

Para permitir que las apps consulten un dispositivo y determinen si sus cámaras admiten la transmisión simultánea, implementa la interfaz de HAL de ICameraProvider@2.6, que incluye los siguientes métodos:

Para obtener una implementación de referencia de la interfaz de HAL de ICameraProvider@2.6, consulta la biblioteca de HAL de la cámara emulada en EmulatedCameraProviderHWLImpl.cpp.

Validación

Para probar que la implementación de esta función funcione según lo previsto, usa la prueba de CTS de ConcurrentCameraTest.java. Además, prueba con una app que abra varias cámaras y opere de forma simultánea.

Problemas con las asignaciones de recursos

Si los HAL de la cámara anuncian compatibilidad con el funcionamiento simultáneo de los dispositivos de cámara, es posible que se produzcan problemas de asignación de recursos, en especial, si hay suficientes recursos de procesador de señal de imagen (ISP) en el teléfono para transmitir cámaras frontal y posterior (o alguna otra) de forma simultánea, pero no a su máxima capacidad. En este caso, la HAL de la cámara debe asignar limitaciones recursos de hardware para cada dispositivo de cámara.

Situación de ejemplo

En la siguiente situación, se demuestra este problema.

Problema

El dispositivo tiene la siguiente configuración:

  • El ID de cámara 0 es una cámara lógica respaldada por una cámara gran angular y ultra gran angular, que toman un recurso de ISP cada una.
  • El ID de cámara 1 es una cámara que toma un recurso del ISP.

El dispositivo (teléfono) tiene dos ISP. Si se abre el ID de la cámara 0 y se configura una sesión, es posible que el HAL de la cámara reserve dos ISP anticipando el uso de la cámara ultraancha y ancha.

Si ese es el caso, la cámara frontal (ID 1) no puede configurar ningún porque ambos ISP están en uso.

Solución

Para solucionar este problema, el framework puede abrir los IDs de cámara 0 y 1. antes de configurar las sesiones para indicarle a la HAL de la cámara cómo asignar recursos (porque ahora espera el funcionamiento simultáneo de las cámaras). Sin embargo, esto puede generar capacidades limitadas, por ejemplo, es posible que el zoom no pueda controlar la relación completa del rango de zoom (porque cambiar los IDs de la cámara física puede ser problemático).

Para implementar esta solución, realiza las siguientes actualizaciones en provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds.

  • Establece que, para el funcionamiento simultáneo de las cámaras, el framework de la cámara debe abrir los dispositivos de cámara (@3.2::ICameraDevice::open) antes de configurar cualquier sesión en ellos. Esto permite que los proveedores de cámaras asignen recursos según corresponda.

  • Para abordar el problema de no poder gestionar todo relación del rango de zoom, asegúrate de que las apps de cámara, cuando se usen cámaras al mismo tiempo, se garantiza que usen la configuración de control ZOOM_RATIO entre solo 1x y MAX_DIGITAL_ZOOM en lugar del ZOOM_RATIO_RANGE completo (esta impide el cambio interno de cámaras físicas, lo que potencialmente requiere más ISP).

Problema con testDualCameraPreview

Cuando realizas las actualizaciones anteriores, es posible que se genere un problema con un comportamiento permitido con la prueba MultiViewTest.java#testDualCameraPreview

La prueba testDualCameraPreview no configura sesiones solo después de abrirlas. todas las cámaras. Sigue esta secuencia:

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

Sin embargo, sí tolera fallas abiertas de la cámara ERROR_MAX_CAMERAS_IN_USE [1] Es posible que las apps de terceros dependan de este comportamiento.

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

Para resolver este problema, mantener la retrocompatibilidad además de admitir transmisiones simultáneas, las HAL de la cámara deberían fallar las llamadas de openCamera con ERROR_MAX_CAMERAS_IN_USE si no puede admitir la configuración de transmisión completa para que todas las cámaras funcionen simultáneamente.