A camada de abstração de hardware (HAL) da câmera do Android conecta as APIs de estrutura de câmera de nível superior em android.hardware.camera2 ao driver e ao hardware da câmera subjacente. O Android 8.0 introduziu o Treble , alternando a API CameraHal para uma interface estável definida pela HAL Interface Description Language (HIDL). Se você desenvolveu anteriormente um módulo e driver HAL de câmera para Android 7.0 e inferior, esteja ciente de mudanças significativas no pipeline da câmera.
Recursos da câmera HAL3
O objetivo do redesenho da API de câmera do Android é aumentar substancialmente a capacidade dos aplicativos de controlar o subsistema de câmera em dispositivos Android enquanto reorganiza a API para torná-la mais eficiente e sustentável. O controle adicional facilita a criação de aplicativos de câmera de alta qualidade em dispositivos Android que podem operar de forma confiável em vários produtos e ainda 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â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 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 torna mais fácil para os desenvolvedores de aplicativos usar as várias funções da câmera.
A API modela o subsistema da câmera como um pipeline que converte solicitações de entrada para capturas de quadros em quadros, 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 quadro. Isso inclui resolução e formato de pixel; sensor manual, controle de lente e flash; 3A modos de operação; 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 da câmera e o subsistema da câmera retorna os resultados para um fluxo de saída. Além disso, os metadados que contêm informações como espaços de cores e sombreamento da lente são gerados 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 Result 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 superfícies de saída é pré-configurado:
- Cada Surface é 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ída 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 (fora 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 solicitações repetidas.
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
- Ainda Capturar
Cada modo tem capacidades ligeiramente diferentes e sobrepostas. Isso dificultou a implementação de novos recursos, como o modo burst, que fica entre dois dos modos de operação.
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 do 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 mistura de versões de dispositivos de câmera (é isso que queremos dizer quando dizemos que o Android suporta a implementação de ambas as HALs).