O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

APIs de gerenciamento de buffer HAL3 da câmera

Android 10 introduz opcionais câmera HAL3 APIs de gerenciamento de buffer que lhe permitem implementar a lógica de gerenciamento de buffer para alcançar diferentes compensações de memória e latência de captura em implementações câmera HAL.

A câmera HAL requer solicitações N (onde N é igual à profundidade do pipeline ) na fila em seu pipeline, mas que muitas vezes não exigir que todos os N conjuntos de buffers de saída, ao mesmo tempo.

Por exemplo, o HAL pode ter oito solicitações enfileiradas no pipeline, mas requer apenas buffers de saída para as duas solicitações nos últimos estágios do pipeline. Em dispositivos que executam o Android 9 e inferior, a estrutura da câmera aloca buffers quando a solicitação é enfileirada no HAL para que possa haver seis conjuntos de buffers no HAL que não estão em uso. No Android 10, as APIs de gerenciamento de buffer HAL3 da câmera permitem o desacoplamento dos buffers de saída para liberar os seis conjuntos de buffers. Isso pode levar a centenas de megabytes de economia de memória em dispositivos de última geração e também pode ser benéfico para dispositivos com pouca memória.

A Figura 1 mostra um diagrama da interface HAL da câmera para dispositivos que executam o Android 9 e inferior. A Figura 2 mostra a interface HAL da câmera no Android 10 com as APIs de gerenciamento de buffer HAL3 da câmera implementadas.

Gerenciamento de buffer em 9 ou inferior

Figura interface de HAL 1. Câmera no Android 9 e menor

Gerenciamento de buffer no Android 10

Figura 2. Câmara interface de HAL em Android 10 usando a API de gestão de tampão

Implementando as APIs de gerenciamento de buffer

Para implementar as APIs de gerenciamento de buffer, o HAL da câmera deve:

O HAL câmara utiliza os requestStreamBuffers e returnStreamBuffers métodos em ICameraDeviceCallback.hal a solicitação e retornar tampões. O HAL também deve implementar a signalStreamFlush método em ICameraDeviceSession.hal para sinalizar o HAL câmara para buffers de retorno.

requestStreamBuffers

Use o requestStreamBuffers método para solicitar buffers do quadro da câmera. Ao usar as APIs de gerenciamento de tampão câmera HAL3, os pedidos de captura de quadro da câmera não contêm buffers de saída, ou seja, a bufferId campo no StreamBuffer é 0 . Portanto, o HAL câmera deve usar requestStreamBuffers para solicitar buffers do quadro da câmera.

O requestStreamBuffers método permite que o chamador para solicitar vários buffers de vários fluxos de saída em uma única chamada, permitindo a menos chamadas HIDL IPC. No entanto, as chamadas demoram mais quando mais buffers são solicitados ao mesmo tempo e isso pode afetar negativamente a latência total da solicitação para o resultado. Além disso, como chamadas em requestStreamBuffers são serializados no serviço câmera, é recomendável que a câmera Hal usar um fio de alta prioridade dedicado a solicitação buffers.

Se uma solicitação de buffer falhar, o HAL da câmera deve ser capaz de tratar adequadamente os erros não fatais. A lista a seguir descreve os motivos comuns pelos quais as solicitações de buffer falham e como elas devem ser tratadas pelo HAL da câmera.

  • App desconecta do fluxo de saída: Este é um erro fatal. O HAL câmara deve enviar ERROR_REQUEST para qualquer pedido de captura visando um fluxo desconectado e estar pronto para processar os pedidos subsequentes normalmente.
  • Timeout: Isso pode ocorrer quando um aplicativo está ocupado fazendo o processamento intensivo, mantendo em alguns buffers. O HAL câmara deve enviar ERROR_REQUEST para solicitações de captura que não podem ser cumpridas devido a um erro de tempo limite e estar pronto para processar os pedidos subsequentes normalmente.
  • Quadro câmara está a preparar uma nova configuração de stream: A HAL câmera deve esperar até a próxima configureStreams chamada está completa antes de chamar requestStreamBuffers novamente.
  • O HAL câmara atingiu o seu limite de buffer (o maxBuffers campo): O HAL câmera deve esperar até que ele retorna pelo menos um tampão da corrente antes de chamar requestStreamBuffers novamente.

returnStreamBuffers

Use o returnStreamBuffers método para retornar buffers extras para o enquadramento da câmera. O HAL câmera normalmente retorna buffers para o enquadramento da câmera através do processCaptureResult método, mas isso só pode ser responsável por pedidos de captura que foram enviados para o HAL câmera. Com a requestStreamBuffers método, é possível para a implementação HAL câmara para reter mais buffers do que o que foi solicitado pela estrutura da câmara. Isto é, quando o returnStreamBuffers método deve ser usado. Se a implementação HAL não detém mais buffers do que solicitado, a implementação câmera HAL não precisa chamar o returnStreamBuffers método.

signalStreamFlush

O signalStreamFlush método é chamado pela estrutura câmera para notificar o HAL câmera para voltar todos os buffers na mão. Isso normalmente é chamado quando o quadro da câmera está prestes a chamada configureStreams e devem drenar o gasoduto de captura da câmera. Semelhante ao returnStreamBuffers método, se uma implementação câmera HAL não se sustenta mais buffers do que solicitado, é possível ter uma implementação vazia deste método.

Após o enquadramento da câmera chama signalStreamFlush , o quadro pára de enviar novos pedidos de captura para o HAL câmera até que todos os buffers foram devolvidos ao quadro câmera. Quando todos os buffers são devolvidos, as requestStreamBuffers chamadas de método falhar, e a estrutura da câmera pode continuar o seu trabalho em um estado limpo. O quadro da câmera, em seguida, chama tanto os configureStreams ou processCaptureRequest método. Se o quadro da câmera chama a configureStreams método, o HAL câmera pode começar a pedir buffers novamente após as configureStreams chamar retorna com êxito. Se o quadro da câmera chama a processCaptureRequest método, o HAL câmera pode começar a pedir buffers durante o processCaptureRequest chamada.

A semântica são diferentes para o signalStreamFlush método eo flush método. Quando o flush método é chamado, o HAL pode abortar pedidos de captura pendentes com ERROR_REQUEST para drenar o gasoduto, o mais rapidamente possível. Quando o signalStreamFlush método é chamado, o HAL deve terminar todos os pedidos de captura pendentes normalmente e retornar todos os buffers para o enquadramento da câmera.

Outra diferença entre o signalStreamFlush método e outros métodos é que signalStreamFlush é um método HIDL de sentido único, o que significa que o quadro câmara possam colocar em outras APIs de bloqueio antes do HAL recebe o signalStreamFlush chamada. Isto significa que o signalStreamFlush método e outros métodos (especialmente o configureStreams método) pode chegar à câmara de HAL em uma ordem diferente do que a ordem em que foram chamados no quadro câmara. Para abordar esta questão assincronia, o streamConfigCounter campo foi adicionado ao StreamConfiguration e adicionado como um argumento para o signalStreamFlush método. A implementação câmera HAL deve usar o streamConfigCounter argumento para determinar se um signalStreamFlush chamada chega mais tarde do que seus correspondentes configureStreams chamar. Consulte a Figura 3 para obter um exemplo.

Atender chamadas que chegam atrasadas

Figura 3. Como o HAL câmera deve detectar e signalStreamFlush alça chamadas que chegam tarde

Mudanças de comportamento ao implementar as APIs de gerenciamento de buffer

Ao usar as APIs de gerenciamento de buffer para implementar a lógica de gerenciamento de buffer, considere as seguintes possíveis mudanças de comportamento para a câmera e a implementação de HAL da câmera:

  • Pedidos de captura de chegar ao HAL câmera mais rápido e com mais frequência: Sem APIs de gerenciamento de buffer, os buffers de saída pedidos de enquadramento da câmera para cada pedido de captura antes de enviar um pedido de captura para o HAL câmera. Ao usar as APIs de gerenciamento de buffer, a estrutura da câmera não precisa mais esperar pelos buffers e, portanto, pode enviar solicitações de captura para o HAL da câmera antes.

    Além disso, sem APIs de gerenciamento de buffer, a estrutura da câmera para de enviar solicitações de captura se um dos streams de saída da solicitação de captura atingiu o número máximo de buffers que o HAL pode conter de uma vez (este valor é designado pelo HAL da câmera no HalStream::maxBuffers campo no valor de retorno de um configureStreams chamada). Com as APIs de gerenciamento de buffer, esse comportamento de limitação não existe mais e a implementação câmera HAL não devem aceitar processCaptureRequest chamadas quando o HAL tem muitos pedidos de captura na fila.

  • requestStreamBuffers chamar a latência varia significativamente: Há muitas razões um requestStreamBuffers chamam pode demorar mais tempo do que a média. Por exemplo:

    • Para os primeiros buffers de um fluxo recém-criado, as chamadas podem demorar mais porque o dispositivo precisa alocar memória.
    • A latência esperada aumenta em proporção ao número de buffers solicitados em cada chamada.
    • O aplicativo está retendo buffers e está processando. Isso pode fazer com que as solicitações de buffer diminuam ou atinjam o tempo limite devido à falta de buffers ou a uma CPU ocupada.

Estratégias de gerenciamento de buffer

As APIs de gerenciamento de buffer permitem que diferentes tipos de estratégias de gerenciamento de buffer sejam implementadas. Alguns exemplos são:

  • Compatível com versões anteriores: O HAL solicita buffers para um pedido de captura durante a processCaptureRequest chamada. Essa estratégia não oferece nenhuma economia de memória, mas pode servir como a primeira implementação das APIs de gerenciamento de buffer, exigindo muito poucas alterações de código no HAL de câmera existente.
  • Economia de memória maximizados: A HAL câmera solicita apenas buffers de saída imediatamente antes que um é necessário para ser preenchido. Essa estratégia permite economia de memória maximizada. A desvantagem potencial é mais falha no pipeline da câmera quando as solicitações de buffer demoram um tempo incomumente longo para terminar.
  • Em cache: A câmera HAL armazena em cache alguns buffers de modo que é menos susceptível de ser afectada por um pedido de buffer lento ocasional.

A câmera HAL pode adotar estratégias diferentes para casos de uso específicos, por exemplo, usando a estratégia de economia de memória maximizada para casos de uso que usam muita memória e usando a estratégia compatível com versões anteriores para outros casos de uso.

Implementação de amostra na câmera externa HAL

A câmara externa HAL foi introduzido no Android 9 e pode ser encontrado na árvore de origem em hardware/interfaces/camera/device/3.5/ . Em Android 10, ele foi atualizado para incluir ExternalCameraDeviceSession.cpp , uma implementação da API de gerenciamento de buffer. Este HAL câmera externa implementa o maximizada estratégia de poupança de memória mencionado em estratégias de gerenciamento de buffer em algumas centenas de linhas de código C ++.