Câmera HAL

A camada de abstração de hardware de câmera (HAL) do Android conecta as APIs de estrutura de câmera de nível superior em android.hardware.camera2 ao driver e hardware de câmera subjacente. A partir do Android 13, o desenvolvimento da interface HAL da câmera usa AIDL . O Android 8.0 introduziu o Treble , mudando a API Camera HAL para uma interface estável definida pela linguagem de descrição de interface HAL (HIDL). Se você já desenvolveu um módulo HAL de câmera e um driver para Android 7.0 e versões anteriores, esteja ciente das mudanças significativas no pipeline da câmera.

Câmera AIDL HAL

Para dispositivos com Android 13 ou superior, a estrutura da câmera inclui suporte para HALs de câmera AIDL. A estrutura da câmera também oferece suporte a HALs de câmera HIDL. No entanto, os recursos de câmera adicionados no Android 13 ou superior estão disponíveis apenas por meio das interfaces HAL de câmera AIDL. Para implementar esses recursos em dispositivos atualizados para Android 13 ou superior, os fabricantes de dispositivos devem migrar seu processo HAL do uso de interfaces de câmera HIDL para interfaces de câmera AIDL.

Para saber mais sobre as vantagens do AIDL, consulte AIDL para HALs .

Implementar câmera AIDL HAL

Para obter uma implementação de referência de uma câmera AIDL HAL, consulte hardware/google/camera/common/hal/aidl_service/ .

As especificações HAL da câmera AIDL estão nos seguintes locais:

Para dispositivos que migram para AIDL, os fabricantes de dispositivos podem precisar modificar a política SELinux do Android (sepolicy) e os arquivos RC, dependendo da estrutura do código.

Validar HAL da câmera AIDL

Para testar a implementação HAL da sua câmera AIDL, certifique-se de que o dispositivo passe em todos os testes CTS e VTS. O Android 13 apresenta o teste AIDL VTS, VtsAidlHalCameraProvider_TargetTest.cpp .

Recursos da câmera HAL3

O objetivo do redesenho da API da câmera Android é aumentar substancialmente a capacidade dos aplicativos de controlar o subsistema da câmera em dispositivos Android, ao mesmo tempo que reorganiza a API para torná-la mais eficiente e fácil de manter. O controle adicional facilita a criação de aplicativos de câmera de alta qualidade em dispositivos Android que podem operar de maneira confiável em vários produtos e, ao mesmo tempo, usar algoritmos específicos do dispositivo sempre que possível para maximizar a qualidade e o desempenho.

A versão 3 do subsistema de câmeras estrutura os modos de operação em uma única visualização unificada, que pode ser usada para implementar qualquer um dos modos anteriores e vários outros, como o modo burst. Isso resulta em melhor controle do usuário para foco e exposição e mais pós-processamento, como redução de ruído, contraste e nitidez. Além disso, esta visualização simplificada facilita aos desenvolvedores de aplicativos o uso das diversas funções da câmera.

A API modela o subsistema de câmera como um pipeline que converte solicitações recebidas de captura de quadros em quadros, na proporção de 1:1. As solicitações encapsulam todas as informações de configuração sobre a captura e processamento de um quadro. Isto inclui resolução e formato de pixel; sensor manual, lente e controle de flash; Modos de operação 3A; Controle de processamento RAW->YUV; geração de estatísticas; e assim por diante.

Em termos simples, a estrutura do aplicativo solicita um quadro do subsistema de câmera e o subsistema de câmera retorna os resultados para um fluxo de saída. Além disso, são gerados metadados que contêm informações como espaços de cores e sombreamento de lente para cada conjunto de resultados. Você pode pensar na versão 3 da câmera como um pipeline para o fluxo unidirecional da versão 1 da câmera. Ele converte cada solicitação de captura em uma imagem capturada pelo sensor, que é processada em:

  • Um objeto de resultado com metadados sobre a captura.
  • Um a N buffers de dados de imagem, cada um em sua própria superfície de destino.

O conjunto de superfícies de saída possíveis está pré-configurado:

  • Cada superfície é um destino para um fluxo de buffers de imagem de resolução fixa.
  • Apenas um pequeno número de superfícies pode ser configurado como saídas de uma só vez (~3).

Uma solicitação contém todas as configurações de captura desejadas e a lista de superfícies de saída para as quais enviar buffers de imagem para esta solicitação (do conjunto total configurado). Uma solicitação pode ser única (com capture() ) ou pode ser repetida indefinidamente (com setRepeatingRequest() ). As capturas têm prioridade sobre as solicitações repetidas.

Modelo de dados da câmera

Figura 1. Modelo de operação central da câmera

Visão geral da câmera HAL1

A versão 1 do subsistema de câmera foi projetada como uma caixa preta com controles de alto nível e os três modos de operação a seguir:

  • Visualização
  • Gravação de vídeo
  • Ainda capturar

Cada modo possui recursos ligeiramente diferentes e sobrepostos. Isso dificultou a implementação de novos recursos, como o modo burst, que fica entre dois dos modos de operação.

Diagrama de blocos da câmera

Figura 2. Componentes da câmera

O Android 7.0 continua a oferecer suporte à câmera HAL1, pois muitos dispositivos ainda dependem dela. Além disso, o serviço de câmera Android oferece suporte à implementação de HALs (1 e 3), o que é útil quando você deseja oferecer suporte a uma câmera frontal menos capaz com câmera HAL1 e uma câmera traseira mais avançada com câmera HAL3.

Há um único módulo HAL de câmera (com seu próprio número de versão ), que lista vários dispositivos de câmera independentes, cada um com seu próprio número de versão. O módulo de câmera 2 ou mais recente é necessário para oferecer suporte a dispositivos 2 ou mais recentes, e esses módulos de câmera podem ter uma combinação de versões de dispositivos de câmera (é isso que queremos dizer quando dizemos que o Android oferece suporte à implementação de ambos os HALs).