La función de parámetros de sesión reduce los retrasos, ya que permite que los clientes de la cámara configuren de manera activa el subconjunto de parámetros de solicitud costosos, es decir, los parámetros de sesión, como parte de la fase de inicialización de la sesión de captura. Con esta función, tus implementaciones de HAL reciben los parámetros del cliente durante la fase de configuración de la transmisión en lugar de la primera solicitud de captura y, según sus valores, pueden preparar y compilar la canalización interna de manera más eficiente.
En Android 10, puedes mejorar el rendimiento con la función opcional de consulta de reconfiguración de sesión para tener más control sobre la lógica de reconfiguración de parámetros de sesión interna. Para obtener más información, consulta Consulta de reconfiguración de sesión.
Ejemplos y fuente
Ya se incluye una implementación de referencia del parámetro de sesión en CameraHal. Este HAL usa la API de HAL heredada. El CameraHal vinculado con Binder que implementa la API de HIDL de la cámara debe usar la entrada sessionParams de HIDL correspondiente para acceder a cualquier parámetro de sesión entrante nuevo durante la configuración de la transmisión.
Los clientes de la cámara pueden consultar las claves de todos los parámetros de sesión admitidos llamando a getAvailableSessionKeys()
y, finalmente, establecer sus valores iniciales a través de setSessionParameters()
.
Implementación
Tu implementación de CameraHal debe completar ANDROID_REQUEST_AVAILABLE_SESSION_KEYS
dentro de los metadatos estáticos de la cámara respectivos y proporcionar un subconjunto de ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS
, que contiene una lista de claves que son difíciles de aplicar por fotograma y pueden generar demoras inesperadas cuando se modifican durante la vida útil de la sesión de captura.
Entre los ejemplos típicos, se incluyen los parámetros que requieren una reconfiguración de hardware que lleva mucho tiempo o un cambio interno en la canalización de la cámara. Aún se puede ejercer control sobre los parámetros de la sesión en las solicitudes de captura, pero los clientes deben tener en cuenta y esperar demoras en su app.
El framework supervisa todas las solicitudes entrantes y, si detecta un cambio en el valor de un parámetro de sesión, vuelve a configurar la cámara de forma interna. La nueva configuración de transmisión que se pasa a CameraHal incluye los valores actualizados de los parámetros de sesión, que se usan para configurar la canalización de la cámara de manera más eficiente.
Personalización
Puedes definir etiquetas en la lista de parámetros de sesión disponibles que se completa en el lado de CameraHal. Esta función no está activa si CameraHal deja vacía la lista de parámetros de sesión disponibles.
Validación
El CTS incluye los siguientes casos nuevos para probar los parámetros de sesión:
CameraDeviceTest#testSessionConfiguration
CameraDeviceTest#testCreateSessionWithParameters
CameraDeviceTest#testSessionParametersStateLeak
NativeCameraDeviceTest#testCameraDevicePreviewWithSessionParameters
En general, después de que un parámetro determinado forma parte de la lista de claves de sesión, su valor actual se incluye como parte de los parámetros de sesión que se pasan durante la configuración de la transmisión en la capa de HAL.
Los parámetros de sesión se deben seleccionar con cuidado. Los valores no deben cambiar con frecuencia, si es que cambian, entre las configuraciones de transmisión. Los parámetros que cambian con frecuencia, como la intención de captura, no son adecuados, y agregarlos a la lista de parámetros de sesión podría provocar fallas en las CTS debido a una reconfiguración interna excesiva.
Consulta de reconfiguración de sesión
Android 10 incluye una función opcional de consulta de reconfiguración de sesión para mejorar el rendimiento, ya que las reconfiguraciones internas de transmisión que resultan de las modificaciones en los valores de los parámetros de sesión pueden reducir el rendimiento. Para abordar esta inquietud, HIDL ICameraDeviceSession
versión 3.5 y posteriores admiten el método isReconfigurationRequired
, que proporciona un control detallado sobre la lógica de reconfiguración de parámetros de sesión interna. Con este método, la reconfiguración de la transmisión puede ocurrir precisamente cuando sea necesario.
Los argumentos de isReconfigurationRequired
proporcionan la información requerida sobre cada modificación pendiente del parámetro de sesión, lo que permite varios tipos de personalizaciones específicas del dispositivo.
Esta función solo se implementa en el servicio de cámara y en la HAL de la cámara. No hay APIs públicas. Si se implementa esta función, los clientes de la cámara deberían ver mejoras en el rendimiento cuando trabajen con parámetros de sesión.
Implementación
Para admitir consultas de reconfiguración de sesión, debes implementar el método isReconfigurationRequired
para verificar si se requiere una reconfiguración completa de la transmisión para los nuevos valores de los parámetros de sesión.
Si el cliente cambia el valor de algún parámetro de sesión anunciado, el framework de la cámara llama al método isReconfigurationRequired
. Según los valores específicos, el HAL decide si se requiere una reconfiguración completa de la transmisión. Si el HAL devuelve false
, el framework de la cámara omite la reconfiguración interna. Si el HAL devuelve true
, el framework vuelve a configurar los flujos y pasa los nuevos valores de los parámetros de la sesión según corresponda.
El framework puede llamar al método isReconfigurationRequired
algún tiempo antes de que se envíe una solicitud con parámetros nuevos al HAL, y la solicitud se puede cancelar antes de que se envíe. Por lo tanto, el HAL no debe usar esta llamada de método para cambiar su comportamiento de ninguna manera.
La implementación del HAL debe cumplir con los siguientes requisitos:
- El framework debe poder llamar al método
isReconfigurationRequired
en cualquier momento después de la configuración de la sesión activa. - No debe haber ningún impacto en el rendimiento de las solicitudes de cámara pendientes. En particular, no debe haber fallas ni demoras durante la transmisión normal de la cámara.
El dispositivo y la implementación de HAL deben cumplir con los siguientes requisitos de rendimiento:
- No se deben cambiar los parámetros de configuración de hardware y software de la cámara.
- No debe haber un impacto visible para el usuario en el rendimiento de la cámara.
El método isReconfigurationRequired
toma los siguientes argumentos:
oldSessionParams
: Son los parámetros de sesión de la sesión anterior. Por lo general, son los parámetros de sesión existentes.newSessionParams
: Son los nuevos parámetros de sesión que establece el cliente.
Los códigos de estado de devolución esperados son los siguientes:
OK
: Es la consulta requerida para una reconfiguración exitosa.METHOD_NOT_SUPPORTED
: El dispositivo de cámara no admite la consulta de reconfiguración.INTERNAL_ERROR
: La consulta de reconfiguración no se puede completar debido a un error interno.
Los valores de retorno son los siguientes:
true
: Se requiere una reconfiguración de la transmisión.false
: No se requiere la reconfiguración de la transmisión.
Para ignorar una consulta de reconfiguración de sesión, el HAL devuelve METHOD_NOT_SUPPORTED
o false
. Esto genera el comportamiento predeterminado del servicio de cámara, en el que se activa la reconfiguración de la transmisión en cada cambio de parámetro de sesión.
Validación
La función de consulta de reconfiguración de sesión se puede validar con el caso de prueba de VTS en CameraHidlTest#configureStreamsWithSessionParameters
.