O Android permite que os dispositivos ofereçam suporte a streaming simultâneo de dispositivos de câmera. Por exemplo, isso permite que um dispositivo tenha as câmeras frontal e traseira operando 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 o streaming simultâneo e as configurações de streaming que são compatíveis.
getConcurrentCameraIds
: retorna o conjunto de combinações de identificadores de dispositivos de câmera conectados no momento que oferecem suporte à configuração de sessões de dispositivos de câmera simultaneamente.isConcurrentSessionConfigurationSupported
: verifica se o conjunto fornecido de dispositivos de câmera e as configurações de sessão correspondentes podem ser configuradas simultaneamente.
Um conjunto de combinações de streaming obrigatórias que precisam ter suporte durante o streaming
simultâneo é incluído nas características da câmera de um dispositivo de câmera na
propriedade
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
.
Cada dispositivo de câmera anunciado por getConcurrentStreamingCameraIds()
precisa
oferecer suporte às seguintes configurações garantidas para transmissões simultâneas.
Alvo 1 | Alvo 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 | Nenhuma captura de imagem estática do visor | ||
YUV / PRIV | s720p | JPEG | s1440p | Imagem estática padrão |
YUV / PRIV | s720p | YUV / PRIV | s1440p | Vídeo no app ou processamento com visualização |
Os dispositivos com o recurso MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
inclui
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
)
com suporte a Y8 precisam substituir os fluxos YUV por Y8 em todas as combinações
de fluxo garantidas.
s720p
se refere a 720p (1280 x 720) ou à resolução máxima aceita para o
formato específico retornado por
StreamConfigurationMap.getOutputSizes()
.
s1440p
se refere a 1440p (1920 x 1440) ou à resolução máxima com suporte para
o formato específico retornado por
StreamConfigurationMap.getOutputSizes()
.
Os dispositivos que não têm os recursos
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
precisam oferecer suporte a pelo menos um único fluxo Y16, Dataspace::DEPTH
com resolução
sVGA, durante a operação simultânea, em que o sVGA é o menor das duas
resoluções a seguir:
- resolução máxima de saída para o formato fornecido
- 640 x 480
Implementação
Para permitir que os apps consultem um dispositivo para determinar se as
câmeras oferecem suporte a streaming simultâneo, implemente a interface
HAL ICameraProvider@2.6
, que inclui os seguintes métodos:
Para conferir uma implementação de referência da interface HAL ICameraProvider@2.6
, 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, teste usando um app que abra várias câmeras e as opere
simultaneamente.
Problemas de alocação de recursos
Se os HALs de câmera anunciarem suporte para operação simultânea de dispositivos de câmera, eles poderão enfrentar problemas de alocação de recursos, especialmente no caso em que há recursos suficientes de processador de sinal de imagem (ISP) no smartphone para transmitir câmeras frontal e traseira (ou outras) simultaneamente, mas não na capacidade total. Nesse caso, o HAL da câmera precisa alocar recursos limitados 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 de câmera
0
é uma câmera lógica com suporte de uma câmera ampla e ultra-ampla, cada uma delas usa um recurso de ISP. - 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
for aberto e uma sessão for
configurada, é possível que o HAL da câmera reserve duas ISPs antecipando
o uso da câmera ultralarga e larga.
Nesse caso, a câmera frontal (ID 1
) não pode configurar nenhum
fluxo 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 as sessões para fornecer uma dica à HAL da câmera sobre como
alocar recursos, porque agora ela 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 processar a proporção total do intervalo de zoom, porque a troca de IDs
de câmera física pode ser problemática.
Para implementar essa solução, faça as seguintes atualizações em
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
O mandato de que, para operação simultânea de câmeras, o framework precisa abrir dispositivos de câmera (
@3.2::ICameraDevice::open
) antes de configurar qualquer sessão nos dispositivos de câmera. Isso permite que os provedores de câmera aloquem recursos de acordo.Para resolver o problema de não conseguir processar a proporção completa do intervalo de zoom, garanta que os apps de câmera, ao usar câmeras simultaneamente, usem a configuração de controle
ZOOM_RATIO
entre apenas 1x eMAX_DIGITAL_ZOOM
em vez doZOOM_RATIO_RANGE
completo. Isso impede a troca de câmeras físicas internamente, o que pode requerer mais ISPs.
Problema com testDualCameraPreview
Quando você faz as atualizações acima, pode haver um problema com um comportamento permitido
pelo teste MultiViewTest.java#testDualCameraPreview
.
O teste testDualCameraPreview
não configura sessões apenas depois de abrir
todas as câmeras. Ele 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 conhece 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 (assumindo que haja alguma competição por eles).
Para resolver esse problema, mantendo a compatibilidade com versões anteriores, além de
oferecer suporte a streamings simultâneos, as HALs de câmera precisam falhar nas chamadas openCamera
com
ERROR_MAX_CAMERAS_IN_USE
se não oferecerem suporte à configuração de streaming completa para
todas as câmeras em execução simultaneamente.