HAL da câmera

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

HAL de câmera AIDL

Para dispositivos que executam o Android 13 ou versões mais recentes, o framework da câmera inclui suporte a HALs de câmera de interface AIDL. O framework 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 versões mais recentes estão disponíveis apenas pelas interfaces HAL de câmera AIDL. Para implementar esses recursos em dispositivos que estão fazendo upgrade para o Android 13 ou versões mais recentes, os fabricantes precisam migrar o processo HAL do uso de interfaces de câmera HIDL para interfaces de câmera AIDL.

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

Implementar a HAL de câmera AIDL

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

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

Para dispositivos que estão migrando para AIDL, os fabricantes talvez precisem modificar a política do SELinux do Android (sepolicy) e os arquivos RC, dependendo da estrutura do código.

Validar a HAL de câmera AIDL

Para testar sua implementação de HAL de câmera AIDL, verifique se o dispositivo passa em todos os testes do CTS e do VTS. O Android 13 apresenta o teste do VTS AIDL, VtsAidlHalCameraProvider_TargetTest.cpp.

Recursos da HAL3 da câmera

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

A versão 3 do subsistema de câmera 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 um melhor controle do usuário para foco e exposição, além de mais pós-processamento, como redução de ruído, contraste e nitidez. Além disso, essa visualização simplificada facilita o uso das várias funções da câmera pelos desenvolvedores de aplicativos.

A API modela o subsistema de câmera como um pipeline que converte solicitações de captura de frames em frames, em uma proporção de 1:1. As solicitações encapsulam todas as informações de configuração sobre a captura e o processamento de um frame. Isso inclui resolução e formato de pixel, controle manual de sensor, lente e flash, modos de operação 3A, controle de processamento RAW->YUV, geração de estatísticas e muito mais.

Em termos simples, a estrutura do aplicativo solicita um frame do subsistema da câmera, e ele retorna os resultados para um fluxo de saída. Além disso, metadados com informações como espaços de cores e sombreamento de lente são gerados para cada conjunto de resultados. Pense na versão 3 da câmera como um pipeline para o stream unidirecional da versão 1. 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 possíveis plataformas de saída é pré-configurado:

  • Cada superfície é um destino para um stream de buffers de imagem de uma resolução fixa.
  • Apenas um pequeno número de plataformas 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 enviar buffers de imagem para essa solicitação (do conjunto total configurado). Uma solicitação pode ser única (com capture()) ou repetida indefinidamente (com setRepeatingRequest()). As capturas têm prioridade sobre solicitações repetidas.

Modelo de dados da câmera

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

Visão geral da HAL1 da câmera

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
  • Captura de imagem estática

Cada modo tem 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 oferecendo suporte à HAL1 da câmera, já que muitos dispositivos ainda dependem dela. Além disso, o serviço de câmera do Android oferece suporte à implementação das duas HALs (1 e 3), o que é útil quando você quer oferecer suporte a uma câmera frontal menos eficiente com a HAL1 e uma câmera traseira mais avançada com a HAL3.

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