Streaming simultâneo da câmera

O Android permite que dispositivos sejam compatíveis com streaming simultâneo de dispositivos de câmera. Para Por exemplo, isso permite que um dispositivo tenha as câmeras frontal e traseira funcionando ao mesmo tempo. No Android 11, a API Camera2 inclui os seguintes métodos que os aplicativos podem chamar para determinar se as câmeras oferecem suporte a streaming simultâneo e as configurações de stream compatíveis.

  • getConcurrentCameraIds: Recebe o conjunto de combinações do dispositivo de câmera conectado no momento identificadores compatíveis com a configuração simultânea de sessões de dispositivos de câmera.
  • isConcurrentSessionConfigurationSupported: Verifica se o conjunto de dispositivos de câmera fornecido e os respectivos as configurações da sessão podem ser configuradas simultaneamente.

Um conjunto de combinações obrigatórias de transmissões ao vivo que precisam ser aceitas durante eventos simultâneos streaming são incluídas por meio das características de uma câmera de dispositivo no SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS .

Cada câmera anunciada por getConcurrentStreamingCameraIds() precisa oferecem suporte às seguintes configurações garantidas para streams simultâneos.

Meta 1 Meta 2
Tipo Tamanho máximo Tipo Tamanho máximo Exemplos de casos de uso
YUV s1440p Processamento de imagens ou vídeos no app
PRIV s1440p Análise no visor no app
JPEG s1440p Sem captura de imagem estática no visor
YUV / PRIV 720p JPEG s1440p Imagens estáticas padrão
YUV / PRIV 720p YUV / PRIV s1440p Vídeo no app ou processamento com visualização

Dispositivos com o recurso MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES) inclui CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME). o suporte a Y8 precisa oferecer suporte à substituição de streams YUV com Y8 em todas as combinações de streaming.

s720p refere-se a 720p (1.280 x 720) ou a resolução máxima suportada para formato específico retornado pelo StreamConfigurationMap.getOutputSizes(). s1440p refere-se a 1440p (1920 x 1440), ou a resolução máxima suportada para o formato específico retornado pelo StreamConfigurationMap.getOutputSizes(). Dispositivos em que os recursos não incluem ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE precisa oferecer suporte a pelo menos um único stream Y16, Dataspace::DEPTH com sVGA resolução, durante uma operação simultânea, em que sVGA é o menor dos dois seguintes resoluções:

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

Implementação

Para permitir que apps consultem um dispositivo para determinar se oferecem suporte a streaming simultâneo, implemente a ICameraProvider@2.6 HAL, que inclui os seguintes métodos:

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

Validação

Para testar se a implementação desse recurso funciona conforme o esperado, use o ConcurrentCameraTest.java teste CTS. Além disso, teste usando um app que abre várias câmeras e funciona ao mesmo tempo.

Problemas de alocação de recursos

Se as HALs da câmera anunciarem compatibilidade com operação simultânea de do Google, elas podem ter problemas de alocação de recursos, caso haja recursos suficientes do processador de sinal de imagem (ISP) na para transmitir as câmeras frontal e traseira (ou outras) simultaneamente, mas não para a capacidade total. Nesse caso, a HAL da câmera precisa alocar limitações recursos de hardware 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 da câmera 0 é uma câmera lógica com uma câmera ampla e ultra grande angular que usam um recurso de ISP.
  • O ID da câmera 1 é uma câmera que usa um recurso do ISP.

O dispositivo (smartphone) tem dois ISPs. Se o ID da câmera 0 for aberto e uma sessão for é possível que a HAL da câmera reserve dois ISPs, antecipando com câmera ultra grande angular e grande angular.

Se esse for o caso, a câmera frontal (ID 1) não pode configurar nada porque ambos os 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 as sessões para dar uma dica à HAL da câmera sobre como alocar recursos (porque agora espera operação simultânea de câmeras). No entanto, isso pode limitar recursos. Por exemplo, o zoom pode não ser conseguem lidar com a proporção de alcance de zoom total (porque alternar a câmera física IDs podem ser problemáticos).

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

  • Exigir que, para operação simultânea de câmeras, a câmera O framework precisa abrir dispositivos de câmera (@3.2::ICameraDevice::open) antes configurando sessões nos dispositivos de câmera. Isto permite que a câmera os provedores aloquem recursos adequadamente.

  • Para resolver o problema de não conseguir processar proporção do intervalo de zoom, garanta que os apps de câmera, ao usar câmeras simultaneamente, usam a configuração de controle ZOOM_RATIO entre 1x e MAX_DIGITAL_ZOOM em vez de ZOOM_RATIO_RANGE completa (essa impede a troca interna de câmeras físicas, o que pode exige mais ISPs).

.

Problema com testDualCameraPreview

Fazer as atualizações acima pode criar um problema com um comportamento permitido pelo teste MultiViewTest.java#testDualCameraPreview.

O teste testDualCameraPreview não configura sessões somente após a abertura 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.

Porque a HAL da câmera não saberá o conjunto completo de IDs da 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 concorrência entre eles).

Para resolver esse problema, manter a compatibilidade com versões anteriores oferecem suporte a streaming simultâneo, as HALs da câmera devem falhar em chamadas openCamera com ERROR_MAX_CAMERAS_IN_USE se eles não forem compatíveis com a configuração completa de stream para todas as câmeras em execução ao mesmo tempo.