Streams de saída
O subsistema da câmera opera exclusivamente no pipeline baseado em ANativeWindow para todas as resoluções e formatos de saída. É possível configurar vários streams uma vez para enviar um único frame para vários destinos, como a GPU, o vídeo codificador, RenderScript: ou buffers visíveis para aplicativos (RAW Bayer, YUV processado ou buffers de codificação JPEG).
Como otimização, esses fluxos de saída precisam ser configurados com antecedência. apenas um número limitado pode existir ao mesmo tempo. Isso permite a pré-alocação de os buffers de memória e a configuração do hardware da câmera, de modo que, quando as solicitações forem enviados com vários pipelines de saída listados, não haverá ou latência no atendimento da solicitação.
Para mais informações sobre as combinações de saída de stream garantido
dependem do nível de hardware compatível, consulte
createCaptureSession()
:
Recorte
Recorte da matriz completa de pixels (para zoom digital e outros casos de uso em que uma um campo de visão menor é desejável) é comunicada pelo objeto ANDROID_SCALER_CROP_REGION do ambiente. Essa configuração é individual, e pode ser alterada a cada solicitação. o que é fundamental para implementar um zoom digital suave.
A região é definida como um retângulo (x, y, largura, altura), com (x, y) que descreve 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 maior do que as dimensões relatadas em ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY campo de informações estáticas. A largura e a altura mínimas permitidas são informadas pela HAL. pelo campo de informações estáticas ANDROID_SCALER_MAX_DIGITAL_ZOOM, que descreve o fator de zoom máximo aceito. Portanto, a largura mínima da região de corte e altura 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 colheita precisar atender a requisitos específicos (por exemplo, para começar em coordenadas uniformes e sua largura/altura precisa ser uniforme), a HAL precisa fazer o arredondamento necessário e gravar a região de corte final usada nas metadados de resultado de saída. Da mesma forma, se a HAL implementar estabilização de vídeo, precisa ajustar a região do corte resultante para descrever a região realmente incluída na saída após a aplicação da estabilização de vídeo. Em geral, uma câmera que usa aplicativo deve ser capaz de determinar o campo de visão que está recebendo com base em a região de corte, as dimensões do sensor de imagem e a distância focal da lente.
Como a região de corte se aplica a todos os fluxos, que podem ter aspectos diferentes proporções do que a região de corte, a região exata do sensor usada para cada fluxo pode ser menor que a região de corte. Especificamente, cada stream deve manter quadrados pixels e a proporção dela recortando o mínimo possível o corte definido na mesma região. Se a proporção do stream for mais larga que a região de corte, o stream deve ser cortada na vertical, e se a proporção do stream for mais estreita que a região de corte, a transmissão deve ser cortada na horizontal.
Em todos os casos, o corte de fluxo precisa estar centralizado na região correspondente. cada stream é cortado na horizontal ou vertical em relação ao tamanho na região de corte, nunca ambas.
Por exemplo, se dois fluxos forem definidos, um de 640 x 480 (aspecto 4:3) e um Stream de 1280x720 (aspecto 16:9). Confira abaixo as regiões de saída esperadas. para cada fluxo para algumas regiões de colheita, em um modelo hipotético de 3 MP (2.000 x matriz de 1500 pixels).
Região de corte: (500, 375, 1.000, 750) (proporção 4:3)
Corte da transmissão de 640 x 480: (500, 375, 1.000, 750) (igual à região de corte)
Corte da transmissão de 1.280 x 720: (500, 469, 1.000, 562)
Região de corte: (500, 375, 1333, 750) (proporção de 16:9)
Corte da transmissão de 640 x 480: (666, 375, 1.000, 750)
Corte em stream de 1.280 x 720: (500, 375, 1.333, 750) (igual à região de corte)
Região de corte: (500, 375, 750, 750) (proporção 1:1)
Corte da transmissão de 640 x 480: (500, 469, 750, 562)
Corte da transmissão de 1.280 x 720: (500, 543, 750, 414)
Por fim, um exemplo de stream com proporção quadrada de 1024 x 1024, em vez de 480p.
stream:
Região de corte: (500, 375, 1.000, 750) (proporção 4:3)
Corte de stream de 1.024 x 1.024: (625, 375, 750, 750)
Corte da transmissão de 1.280 x 720: (500, 469, 1.000, 562)
Reprocessamento
O suporte adicional para arquivos de imagem bruta é fornecido pelo suporte de reprocessamento para RAW Bayer dados. Esse suporte permite que o pipeline da câmera processe uma imagem Buffer e metadados RAW (um quadro inteiro que foi gravado anteriormente), para produz uma nova saída YUV ou JPEG renderizada.
Zoom
Para dispositivos com o Android 11 ou mais recente, um app pode usar o zoom da câmera.
(digital e óptico) pela configuração ANDROID_CONTROL_ZOOM_RATIO
.
A proporção de zoom é definida como um fator de ponto flutuante. Em vez de
usando ANDROID_SCALER_CROP_REGION
para cortar e aplicar zoom, um app pode usar
ANDROID_CONTROL_ZOOM_RATIO
para controlar o nível de zoom e use
ANDROID_SCALER_CROP_REGION
para corte horizontal e vertical de
alcançar proporções diferentes do sensor de câmera nativo.
Um sistema com várias câmeras pode conter mais de uma lente
distâncias focais, e o usuário pode usar o zoom óptico alternando entre lentes.
O uso de ANDROID_CONTROL_ZOOM_RATIO
traz benefícios nos cenários abaixo:
- Aumentar o zoom de uma lente grande angular para telefoto: uma proporção de ponto flutuante
oferece melhor precisão em comparação com valores inteiros de
ANDROID_SCALER_CROP_REGION
: - Diminuir o zoom de uma lente grande angular para ultra grande angular:
ANDROID_CONTROL_ZOOM_RATIO
oferece suporte a 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 4:3)
Corte da transmissão de 640 x 480: (0, 0, 2.000, 1.500) (igual à região de corte)
Corte da transmissão 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 16:9)
Corte da transmissão de 640 x 480: (250, 187, 1.500, 1.125) (pillarbox)
Corte em stream de 1280 x 720: (0, 187, 2000, 1125) (igual à região de corte)
Proporção de zoom: 0,5; Campo de visão original: 4x (alterado de lente grande angular para ultra grande angular)
Região de corte: (250, 0, 1500, 1500) (proporção 1:1)
Corte da transmissão de 640 x 480: (250, 187, 1500, 1125) (com efeito letterbox)
Corte da transmissão de 1.280 x 720: (250, 328, 1.500, 844) (com efeito letterbox)
Como visto nos gráficos acima, o sistema de coordenadas da região de colheita muda para o valor efetivo
campo de visão pós-zoom e é representada pelo retângulo com as seguintes dimensões:
(0
, 0
, activeArrayWith
, activeArrayHeight
).
O mesmo se aplica às regiões e aos rostos de AE/AWB/AF. Essa mudança no sistema de coordenadas não se aplica à
Captura RAW e metadados relacionados, como intrinsicCalibration
e
lensShadingMap
.
Usando o mesmo exemplo hipotético acima e supondo que o fluxo de saída no 1 (640x480) seja o stream 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 app defina android.control.aeRegions
como o canto superior esquerdo
um quarto do campo de visão do visor,
android.control.aeRegions
a (0, 0, 1000, 750)
com
O valor android.control.zoomRatio
foi definido como 2.0
. Como alternativa,
o app pode definir android.control.aeRegions
como o equivalente
região de (500, 375, 1000, 750)
para
android.control.zoomRatio
de 1.0
.