Fluxos de saída
O subsistema de câmera opera exclusivamente no pipeline baseado em ANativeWindow para todas as resoluções e formatos de saída. Vários fluxos podem ser configurados ao mesmo tempo para enviar um único quadro para vários destinos, como GPU, codificador de vídeo, RenderScript ou buffers visíveis ao aplicativo (RAW Bayer, buffers YUV processados ou buffers codificados em JPEG).
Como otimização, esses fluxos de saída devem ser configurados antecipadamente e apenas um número limitado pode existir por vez. Isso permite a pré-alocação de buffers de memória e a configuração do hardware da câmera, para que, quando as solicitações forem enviadas com pipelines de saída múltiplos ou variados listados, não haja atrasos ou latência no atendimento da solicitação.
Para obter mais informações sobre as combinações de saída de fluxo garantidas que dependem do nível de hardware suportado, consulte createCaptureSession()
.
Recortar
O corte da matriz completa de pixels (para zoom digital e outros casos de uso onde um FOV menor é desejável) é comunicado por meio da configuração ANDROID_SCALER_CROP_REGION. Essa é uma configuração por solicitação e pode ser alterada conforme a solicitação, o que é fundamental para a implementação do zoom digital suave.
A região é definida como um retângulo (x, y, largura, altura), com (x, y) descrevendo o canto superior esquerdo do retângulo. O retângulo é definido no sistema de coordenadas da matriz de pixels ativos do sensor, sendo (0,0) o pixel superior esquerdo da matriz de pixels ativos. Portanto, a largura e a altura não podem ser maiores que as dimensões informadas no campo de informações estáticas ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. A largura e a altura mínimas permitidas são informadas pelo HAL por meio do campo de informações estáticas ANDROID_SCALER_MAX_DIGITAL_ZOOM, que descreve o fator de zoom máximo suportado. Portanto, a largura e altura mínimas da região de cultivo são:
{width, height} = { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] / ANDROID_SCALER_MAX_DIGITAL_ZOOM), floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] / ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
Se a região de cultivo precisar atender a requisitos específicos (por exemplo, precisa começar em coordenadas pares e sua largura/altura precisa ser uniforme), o HAL deverá fazer os arredondamentos necessários e escrever a região de cultivo final usada na saída metadados de resultado. Da mesma forma, se o HAL implementar estabilização de vídeo, ele deverá ajustar a região de corte resultante para descrever a região realmente incluída na saída após a estabilização de vídeo ser aplicada. Em geral, um aplicativo que utiliza uma câmera deve ser capaz de determinar o campo de visão que está recebendo com base na região de corte, nas dimensões do sensor de imagem e na distância focal da lente.
Como a região de cultivo se aplica a todos os córregos, que podem ter proporções de aspecto diferentes da região de cultivo, a região exata do sensor usada para cada córrego pode ser menor que a região de cultivo. Especificamente, cada fluxo deve manter pixels quadrados e sua proporção de aspecto cortando minimamente a região de corte definida. Se a proporção do riacho for mais larga do que a região de cultivo, o riacho deverá ser cortado posteriormente verticalmente, e se a proporção do riacho for mais estreita do que a região de cultivo, o riacho deverá ser cortado ainda mais horizontalmente.
Em todos os casos, o cultivo do córrego deve ser centralizado dentro de toda a região de cultivo, e cada córrego só é cultivado horizontalmente ou verticalmente em relação à região de cultivo completo, nunca ambos.
Por exemplo, se dois fluxos forem definidos, um fluxo de 640x480 (aspecto 4:3) e um fluxo de 1280x720 (aspecto 16:9), a seguir demonstramos as regiões de saída esperadas para cada fluxo para algumas regiões de cultivo de amostra, em um hipotético 3 Sensor MP (matriz de 2.000 x 1.500 pixels).
Região de corte: (500, 375, 1000, 750) (proporção de aspecto 4:3)
Corte de fluxo de 640 x 480: (500, 375, 1000, 750) (igual à região de corte)
Corte de fluxo de 1280 x 720: (500, 469, 1000, 562)
Região de corte: (500, 375, 1333, 750) (proporção de aspecto 16:9)
Corte de fluxo de 640 x 480: (666, 375, 1000, 750)
Corte de fluxo de 1280 x 720: (500, 375, 1333, 750) (igual à região de corte)
Região de corte: (500, 375, 750, 750) (proporção de 1:1)
Corte de fluxo de 640 x 480: (500, 469, 750, 562)
Corte de fluxo de 1280 x 720: (500, 543, 750, 414)
E um exemplo final, um fluxo de proporção quadrada de 1024x1024 em vez de um fluxo de 480p:
Região de corte: (500, 375, 1000, 750) (proporção de aspecto 4:3)
Corte de fluxo de 1024x1024: (625, 375, 750, 750)
Corte de fluxo de 1280 x 720: (500, 469, 1000, 562)
Reprocessamento
Suporte adicional para arquivos de imagem raw é fornecido pelo suporte de reprocessamento para dados RAW Bayer. Esse suporte permite que o pipeline da câmera processe um buffer RAW e metadados capturados anteriormente (um quadro inteiro que foi gravado anteriormente) para produzir uma nova saída YUV ou JPEG renderizada.
Ampliação
Para dispositivos com Android 11 ou superior, um aplicativo pode usar o zoom da câmera (digital e óptico) por meio da configuração ANDROID_CONTROL_ZOOM_RATIO
.
A taxa de zoom é definida como um fator de ponto flutuante. Em vez de usar ANDROID_SCALER_CROP_REGION
para corte e zoom, um aplicativo pode usar ANDROID_CONTROL_ZOOM_RATIO
para controlar o nível de zoom e usar ANDROID_SCALER_CROP_REGION
para corte horizontal e vertical para obter proporções diferentes do sensor nativo da câmera.
Um sistema multicâmera pode conter mais de uma lente com diferentes distâncias focais, e o usuário pode usar o zoom óptico alternando entre as lentes. Usar ANDROID_CONTROL_ZOOM_RATIO
traz benefícios nos cenários abaixo:
- Aumentando o zoom de uma lente grande angular para uma lente telefoto: uma proporção de ponto flutuante fornece melhor precisão em comparação com valores inteiros de
ANDROID_SCALER_CROP_REGION
. - Diminuindo o zoom de uma lente grande angular para uma lente ultralarga:
ANDROID_CONTROL_ZOOM_RATIO
suporta redução de zoom (<1.0f), enquantoANDROID_SCALER_CROP_REGION
não.
Proporção de zoom: 2,0; 1/4 do campo de visão original
Região de corte: (0, 0, 2000, 1500) (proporção de aspecto 4:3)
Corte de fluxo de 640x480: (0, 0, 2000, 1500) (igual à região de corte)
Corte de fluxo de 1280 x 720: (0, 187, 2000, 1125)
Proporção de zoom: 2,0; 1/4 do campo de visão original
Região de corte: (0, 187, 2000, 1125) (proporção de aspecto 16:9)
Corte de fluxo de 640 x 480: (250, 187, 1500, 1125) (pillarbox)
Corte de fluxo de 1280x720: (0, 187, 2000, 1125) (igual à região de corte)
Proporção de zoom: 0,5; 4x do campo de visão original (mudou de lente grande angular para lente ultra grande angular)
Região de corte: (250, 0, 1500, 1500) (proporção de 1:1)
Corte de fluxo de 640 x 480: (250, 187, 1500, 1125) (caixa de correio)
Corte de fluxo de 1280 x 720: (250, 328, 1500, 844) (caixa de correio)
Como pode ser visto nos gráficos acima, o sistema de coordenadas da região de corte muda para o campo de visão efetivo pós-zoom e é representado pelo retângulo com as seguintes dimensões: ( 0
, 0
, activeArrayWith
, activeArrayHeight
). O mesmo se aplica às regiões e faces AE/AWB/AF. Essa alteração no sistema de coordenadas não se aplica à captura RAW e aos metadados relacionados, como intrinsicCalibration
e lensShadingMap
.
Usando o mesmo exemplo hipotético acima e assumindo que o fluxo de saída nº 1 (640x480) é o fluxo do visor, o zoom de 2,0x pode ser obtido de duas maneiras:
-
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
-
zoomRatio = 1.0
(padrão),scaler.cropRegion = (500, 375, 1000, 750)
Para que um aplicativo defina android.control.aeRegions
como o quarto superior esquerdo do campo de visão do visor, defina android.control.aeRegions
como (0, 0, 1000, 750)
com android.control.zoomRatio
definido como 2.0
. Como alternativa, o aplicativo pode definir android.control.aeRegions
para a região equivalente a (500, 375, 1000, 750)
para android.control.zoomRatio
de 1.0
.