Streaming simultâneo da câmera

O Android permite que os dispositivos ofereçam suporte ao streaming simultâneo de dispositivos de câmera. Por exemplo, isso permite que um dispositivo tenha as câmeras frontal e traseira funcionando ao mesmo tempo. A partir do Android 11, a API Camera2 inclui os seguintes métodos que os apps podem chamar para determinar se as câmeras são compatíveis com streaming simultâneo e as configurações de streaming compatíveis.

  • getConcurrentCameraIds: recebe o conjunto de combinações de identificadores de dispositivos de câmera conectados no momento que oferecem suporte à configuração simultânea de sessões de dispositivos de câmera.
  • isConcurrentSessionConfigurationSupported: verifica se o conjunto fornecido de dispositivos de câmera e as configurações de sessão correspondentes podem ser configurados simultaneamente.

Um conjunto de combinações de streaming obrigatórias que precisam ser compatíveis durante o streaming simultâneo é incluído nas características do dispositivo de câmera na propriedade SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS.

Cada dispositivo de câmera anunciado pelo getConcurrentStreamingCameraIds() precisa oferecer suporte às seguintes configurações garantidas para streams simultâneos.

Destino 1 Meta 2
Tipo Tamanho máximo Tipo Tamanho máximo Exemplos de casos de uso
YUV s1440p Processamento de vídeo ou imagem no app
PRIV s1440p Análise do visor no app
JPEG s1440p Sem captura de imagem estática do visor
YUV / PRIV s720p JPEG s1440p Imagens estáticas padrão
YUV / PRIV s720p YUV / PRIV s1440p Vídeo ou processamento no app com prévia

Os dispositivos com a capacidade MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES inclui CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) que oferecem suporte ao Y8 precisam permitir a substituição de streams YUV por Y8 em todas as combinações de streams garantidas.

s720p se refere a 720p (1280 x 720) ou à resolução máxima compatível com o formato específico retornado por StreamConfigurationMap.getOutputSizes(). s1440p se refere a 1440p (1920 x 1440) ou à resolução máxima compatível com o formato específico retornado por StreamConfigurationMap.getOutputSizes(). Os dispositivos que não incluem ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE precisam ser compatíveis com pelo menos um fluxo Y16, Dataspace::DEPTH com resolução sVGA, durante a operação simultânea. sVGA é a menor das duas resoluções a seguir:

  • resolução máxima de saída para o formato especificado
  • 640 x 480

Implementação

Para permitir que os apps consultem um dispositivo e determinem se as câmeras são compatíveis com streaming simultâneo, implemente a interface HAL ICameraProvider@2.6, que inclui os seguintes métodos:

Para uma implementação de referência da interface ICameraProvider@2.6HAL, consulte a biblioteca HAL da câmera emulada em EmulatedCameraProviderHWLImpl.cpp.

Validação

Para testar se a implementação desse recurso funciona conforme o esperado, use o teste do CTS ConcurrentCameraTest.java. Além disso, faça o teste usando um app que abra várias câmeras e as opere simultaneamente.

Problemas de alocações de recursos

Se os HALs de câmera anunciarem suporte para operação simultânea de dispositivos de câmera, eles poderão ter problemas de alocação de recursos, especialmente quando houver recursos suficientes de processador de sinal de imagem (ISP) no smartphone para transmitir as câmeras frontal e traseira (ou outras) simultaneamente, mas não na capacidade total. Nesse caso, a HAL da câmera precisa alocar recursos de hardware limitados para cada dispositivo de câmera.

Exemplo

O cenário a seguir demonstra esse problema.

Problema

O dispositivo tem a seguinte configuração:

  • O ID de câmera 0 é uma câmera lógica com suporte de uma câmera ampla e ultra-ampla, que usam um recurso de ISP cada uma.
  • O ID da câmera 1 é uma câmera que usa um recurso de ISP.

O dispositivo (smartphone) tem dois ISPs. Se o ID da câmera 0 estiver aberto e uma sessão configurada, é possível que o HAL da câmera reserve dois ISPs antecipando o uso da câmera ultralarga e da câmera ampla.

Nesse caso, a câmera frontal (ID 1) não pode configurar nenhum stream porque os dois ISPs estão em uso.

Solução

Para resolver esse problema, o framework pode abrir os IDs de câmera 0 e 1 antes de configurar sessões para dar uma dica à HAL da câmera sobre como alocar recursos (porque agora ele espera a operação simultânea de câmeras). No entanto, isso pode levar a recursos limitados. Por exemplo, o zoom pode não ser capaz de lidar com a proporção total da faixa de zoom porque a troca de IDs de câmera físicos pode ser problemática.

Para implementar essa solução, faça as seguintes atualizações em provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds.

  • Exija que, para a operação simultânea de câmeras, a estrutura abra os dispositivos de câmera (@3.2::ICameraDevice::open) antes de configurar qualquer sessão neles. Isso permite que os provedores de câmera aloquem recursos de acordo.

  • Para resolver o problema de não ser possível processar toda a proporção do intervalo de zoom, garanta que os apps de câmera, ao usar câmeras simultaneamente, usem a configuração de controle ZOOM_RATIO apenas entre 1x e MAX_DIGITAL_ZOOM em vez de ZOOM_RATIO_RANGE completo. Isso evita a troca de câmeras físicas internamente, o que pode exigir mais ISPs.

Problema com testDualCameraPreview

Quando você faz as atualizações acima, isso pode criar um problema com um comportamento permitido pelo teste MultiViewTest.java#testDualCameraPreview.

O teste testDualCameraPreview não configura sessões somente depois de abrir todas as câmeras. Ela segue esta sequência:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

No entanto, ele tolera falhas de abertura da câmera com ERROR_MAX_CAMERAS_IN_USE [1]. Apps de terceiros podem depender desse comportamento.

Como o HAL da câmera não saberá o conjunto completo de IDs de câmera que estão sendo abertos para operação simultânea antes de configurar as sessões, pode ser difícil alocar recursos de hardware (supondo que haja alguma disputa por eles).

Para resolver esse problema, além de manter a compatibilidade com versões anteriores e oferecer suporte ao streaming simultâneo, as HALs de câmera precisam falhar nas chamadas openCamera com ERROR_MAX_CAMERAS_IN_USE se não for possível oferecer suporte à configuração completa de streaming para todas as câmeras em execução simultânea.