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 tenga funcionando tanto la cámara frontal como la posterior al mismo tiempo. A partir de Android 11, la API de Camera2 incluye los siguientes métodos que las apps pueden llamar para determinar si las cámaras admiten transmisiones simultáneas 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: Comprueba si el conjunto proporcionado de dispositivos de cámara y sus correspondientes de sesiones separadas pueden establecerse 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 que se publicite a través de getConcurrentStreamingCameraIds() debe cumplir con los siguientes requisitos: admiten las siguientes configuraciones garantizadas para transmisiones simultáneas.

Objetivo 1 Objetivo 2
Tipo Tamaño máximo Tipo Tamaño máximo Casos de uso de muestra
YUV S1440p Procesamiento de imágenes o video en la app
PRIV. S1440p Análisis en el visor de la aplicación
JPEG S1440p Sin captura de imágenes fijas en el visor
YUV / PRIV S720p JPEG S1440p Imágenes estáticas estándar
YUV / PRIV S720p YUV / PRIV S1440p Video 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 a fin de determinar si que las cámaras admitan transmisiones simultáneas, implementa ICameraProvider@2.6 Interfaz de HAL, que incluye los siguientes métodos:

Para ver una implementación de referencia de la interfaz de la ICameraProvider@2.6HAL, 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 se realiza según lo previsto, usa la ConcurrentCameraTest.java Prueba de CTS Además, prueba con una app que abra varias cámaras y opere de forma simultánea.

Problemas de asignación de recursos

Si las HAL de la cámara anuncian compatibilidad con operaciones simultáneas con dispositivos de cámara, podrían tener problemas de asignación de recursos, especialmente cuando hay suficientes recursos del procesador de señales de imagen (ISP) en la teléfono para transmitir las cámaras frontal y posterior (u otras) al mismo tiempo, pero no a a su máxima capacidad. En este caso, la HAL de la cámara debe asignar límites 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 un lente gran angular y ultra gran angular y cada una toma un recurso de ISP.
  • El ID de cámara 1 es una cámara que toma un recurso del ISP.

El dispositivo (teléfono) tiene dos ISP. Si el ID de la cámara 0 está abierto y hay una sesión es posible que la HAL de la cámara reserve dos ISP que anticipen el uso de cámara ultra gran angular y ultra gran angular.

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 limitar las capacidades. Por ejemplo, es posible que el zoom capaz de manejar la relación de rango de zoom completa (porque cambiar la cámara física los IDs podrían ser problemáticos).

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

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

  • 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] Las apps de terceros pueden depender de este comportamiento.

Porque la HAL de la cámara no sabrá el conjunto completo de IDs de cámara que se están abriendo para las operaciones simultáneas antes de configurar las sesiones, podría ser difícil asignar recursos de hardware (suponiendo que hay 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.