HAL da câmera

A camada de abstração de hardware da câmera (HAL) do Android conecta as APIs do framework de câmera de nível mais alto em android.hardware.camera2 ao driver e ao hardware da câmera. No Android 13 e versões mais recentes, o desenvolvimento da interface da HAL de câmera usa a AIDL. O Android 8.0 introduziu o Treble, trocando a API Camera HAL para uma interface estável definida pelo Linguagem de descrição da interface HAL (HIDL, na sigla em inglês). Se você já desenvolveu um módulo e um driver HAL da 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 com o Android 13 ou versões mais recentes, o framework da câmera inclui suporte a HALs de câmera 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 pela HAL de câmera de interface AIDL. Para implementar esses recursos em dispositivos que estão fazendo upgrade para o Android 13 ou versões mais recentes, os fabricantes de dispositivos precisam migrar o processo HAL 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 conferir uma implementação de referência de uma HAL de câmera AIDL, consulte hardware/google/camera/common/hal/aidl_service/.

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

Para dispositivos que migram para o AIDL, os fabricantes podem precisar 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 a implementação da HAL da câmera AIDL, verifique se o dispositivo passa em todos os testes do CTS e do VTS. O Android 13 apresenta o teste VTS do AIDL, VtsAidlHalCameraProvider_TargetTest.cpp.

Recursos da HAL3 da câmera

O objetivo do novo design da API Camera do Android é aumentar significativamente 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 maneira 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 da 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 de disparo contínuo. Isso resulta em um 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, essa visualização simplificada facilita para os desenvolvedores de aplicativos usarem as várias funções da câmera.

A API modela o subsistema da câmera como um pipeline que converte as solicitações de capturas de frames recebidas em frames, em uma base 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 do sensor, lente e flash, modos de operação 3A, controle de processamento RAW->YUV, geração de estatísticas e assim por diante.

Em termos simples, o framework do aplicativo solicita um frame do subsistema da câmera, e o subsistema da câmera retorna os resultados para um stream de saída. Além disso, metadados que contêm informações como espaços de cor e sombreamento de lentes são gerados para cada conjunto de resultados. Pense na versão 3 da câmera como um pipeline para o fluxo 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 na própria superfície de destino.

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

  • Cada superfície é um destino para um fluxo de buffers de imagem de resolução fixa.
  • Apenas um pequeno número de plataformas pode ser configurado como saídas por 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 (fora do conjunto total configurado). Uma solicitação pode ser única (com capture()) ou ser 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 câmera HAL1

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

  • Visualizar
  • Gravação de vídeo
  • Captura de fotos

Cada modo tem recursos ligeiramente diferentes e sobrepostos. Isso dificultou a implementação de novos recursos, como o modo de disparo, 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 ao HAL1 da câmera, já que muitos dispositivos ainda dependem dele. Além disso, o serviço de câmera do Android oferece suporte à implementação de ambas as HALs (1 e 3), o que é útil quando você quer oferecer suporte a uma câmera frontal menos capaz com a HAL1 e uma câmera traseira mais avançada com a HAL3.

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