Stream di output
Il sottosistema della fotocamera opera esclusivamente sulla pipeline basata su ANativeWindow per tutte le risoluzioni e i formati di output. È possibile configurare più stream contemporaneamente per inviare un singolo frame a molti target, come la GPU, il codificatore video, RenderScript o i buffer visibili dall'app (RAW Bayer, buffer YUV elaborati o buffer con codifica JPEG).
Come ottimizzazione, questi flussi di output devono essere configurati in anticipo e può esisterne solo un numero limitato alla volta. Ciò consente la pre-allocazione dei buffer di memoria e la configurazione dell'hardware della videocamera, in modo che quando le richieste vengono inviate con più pipeline di output o variabili elencate, non si verifichino ritardi o latenza nel soddisfare la richiesta.
Per ulteriori informazioni sulle combinazioni di output dello stream garantite
che dipendono dal livello di hardware supportato, consulta
createCaptureSession()
.
Ritaglio
Il ritaglio dell'array di pixel completo (per lo zoom digitale e altri casi d'uso in cui è auspicabile un FOV più piccolo) viene comunicato tramite l'impostazione ANDROID_SCALER_CROP_REGION. Questa è un'impostazione a livello di richiesta e può cambiare a seconda della richiesta, il che è fondamentale per implementare lo zoom digitale fluido.
La regione è definita come un rettangolo (x, y, larghezza, altezza), con (x, y) che descrive l'angolo in alto a sinistra del rettangolo. Il rettangolo è definito nel sistema di coordinate dell'array di pixel attivi del sensore, dove (0,0) è il pixel in alto a sinistra dell'array di pixel attivi. Pertanto, la larghezza e l'altezza non possono essere superiori alle dimensioni riportate nel campo delle informazioni statiche ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. La larghezza e l'altezza minime consentite vengono registrate dall'HAL tramite il campo di informazioni statiche ANDROID_SCALER_MAX_DIGITAL_ZOOM, che descrive il fattore di zoom massimo supportato. Pertanto, la larghezza e l'altezza minime dell'area di ritaglio sono:
{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 l'area di ritaglio deve soddisfare requisiti specifici (ad esempio, deve iniziare con coordinate uniformi e la sua larghezza/altezza deve essere uniforme), l'HAL deve eseguire l'arrotondamento necessario e scrivere l'area di ritaglio finale utilizzata nei metadati dei risultati di output. Analogamente, se l'HAL implementa la stabilizzazione video, deve regolare la regione di ritaglio del risultato per descrivere la regione effettivamente inclusa nell'output dopo l'applicazione della stabilizzazione video. In generale, un'app che utilizza la fotocamera deve essere in grado di determinare il campo visivo che riceve in base alla regione di ritaglio, alle dimensioni del sensore di immagine e alla lunghezza focale dell'obiettivo.
Poiché la regione di ritaglio si applica a tutti gli stream, che possono avere proporzioni diverse rispetto alla regione di ritaglio, la regione del sensore esatta utilizzata per ogni stream potrebbe essere più piccola della regione di ritaglio. Nello specifico, ogni stream deve mantenere i pixel quadrati e le proporzioni ritagliando ulteriormente la regione di ritaglio definita. Se le proporzioni dello stream sono più larghe della regione di ritaglio, lo stream deve essere ulteriormente ritagliato verticalmente e, se le proporzioni dello stream sono più strette della regione di ritaglio, lo stream deve essere ulteriormente ritagliato orizzontalmente.
In tutti i casi, il ritaglio deve essere centrato all'interno dell'intera area di ritaglio e ogni flusso può essere ritagliato solo orizzontalmente o verticalmente rispetto all'intera area di ritaglio, mai in entrambe le aree.
Ad esempio, se sono definiti due stream, uno a 640 x 480 (formato 4:3) e uno a 1280 x 720 (formato 16:9), di seguito sono riportate le regioni di output previste per ogni stream per alcune regioni di ritaglio di esempio, su un sensore ipotetico da 3 MP (array di 2000 x 1500 pixel).
Regione ritagliata: (500, 375, 1000, 750) (proporzioni 4:3)
Ritaglia in streaming 640 x 480: (500, 375, 1000, 750) (uguale alla regione ritagliata)
1280 x 720 ritaglio dello stream: (500, 400, 2)
Regione di ritaglio: (500, 375, 1333, 750) (proporzioni 16:9)
Ritaglio dello stream a 640 x 480: (666, 375, 1000, 750)
Ritaglio dello stream a 1280 x 720: (500, 375, 1333, 750) (uguale alla regione di ritaglio)
Regione di ritaglio: (500, 375, 750, 750) (formato 1:1)
Ritaglio dello stream a 640 x 480: (500, 469, 750, 562)
Ritaglio dello stream a 1280 x 720: (500, 543, 750, 414)
Un ultimo esempio: uno stream con proporzioni quadrate di 1024 x 1024 anziché lo stream 480p:
Regione di ritaglio: (500, 375, 1000, 750) (proporzioni 4:3)
Ritaglio dello stream 1024 x 1024: (625, 375, 750, 750)
Ritaglio dello stream 1280 x 720: (500, 469, 1000, 562)
Rielaborazione
Il supporto aggiuntivo per i file immagine RAW è fornito dal supporto per il rielaborare i dati Bayer RAW. Questo supporto consente alla pipeline della fotocamera di elaborare un buffer RAW e metadati acquisiti in precedenza (un intero fotogramma registrato in precedenza), per produrre un nuovo output YUV o JPEG sottoposto a rendering.
Zoom
Per i dispositivi con Android 11 o versioni successive, un'app può utilizzare lo zoom (digitale e ottico) di una fotocamera tramite l'impostazione ANDROID_CONTROL_ZOOM_RATIO
.
Il rapporto di zoom è definito come fattore in virgola mobile. Anziché usare ANDROID_SCALER_CROP_REGION
per il ritaglio e lo zoom, un'app può usare ANDROID_CONTROL_ZOOM_RATIO
per controllare il livello di zoom e ANDROID_SCALER_CROP_REGION
per il ritaglio orizzontale e verticale per ottenere proporzioni diverse da quelle del sensore della fotocamera nativo.
Un sistema multi-fotocamera può contenere più di un obiettivo con lunghezze focali diverse e l'utente può utilizzare lo zoom ottico passando da un obiettivo all'altro.
L'utilizzo di ANDROID_CONTROL_ZOOM_RATIO
presenta vantaggi nei seguenti scenari:
- Zoom in da un obiettivo grandangolare a un teleobiettivo: un rapporto in virgola mobile offre una maggiore precisione rispetto ai valori interi di
ANDROID_SCALER_CROP_REGION
. - Lo zoom out da un obiettivo grandangolare a uno ultrawide:
ANDROID_CONTROL_ZOOM_RATIO
supporta lo zoom out (<1,0 f) mentreANDROID_SCALER_CROP_REGION
no.
Rapporto zoom: 2,0; 1/4 del campo visivo originale
Regione di ritaglio: (0, 0, 2000, 1500) (proporzioni 4:3)
Ritaglio dello stream a 640 x 480: (0, 0, 2000, 1500) (uguale alla regione di ritaglio)
Ritaglio dello stream a 1280 x 720: (0, 187, 2000, 1125)
Rapporto zoom: 2,0; 1/4 del campo visivo originale
Regione di ritaglio: (0, 187, 2000, 1125) (proporzioni 16:9)
Ritaglio dello stream a 640 x 480: (250, 187, 1500, 1125) (con riquadri laterali)
Ritaglio dello stream a 1280 x 720: (0, 187, 2000, 1125) (uguale alla regione di ritaglio)
Rapporto di zoom: 0,5; 4x del campo visivo originale (passato dall'obiettivo grandangolare all'obiettivo ultrawide)
Regione ritaglio: (250, 0, 1500, 1500) (proporzioni 1:1)
Ritaglio stream 640 x 480: (250, 187, 1500, 1500, 120% in formato Letterbox)
(250, 120, 120 in formato letterbox) (2525 in formato Letterbox)
Come mostrato dai grafici precedenti, il sistema di coordinate della regione di ritaglio passa al campo visivo effettivo dopo lo zoom ed è rappresentato dal rettangolo con le seguenti dimensioni:
(0
, 0
, activeArrayWith
, activeArrayHeight
).
Lo stesso vale per le regioni AE/AWB/AF e per i volti. Questa modifica del sistema di coordinate non si applica
all'acquisizione RAW e ai relativi metadati correlati, come intrinsicCalibration
e
lensShadingMap
.
Utilizzando lo stesso esempio ipotetico riportato sopra e supponendo che lo stream di output 1 (640 x 480) sia lo stream del mirino, lo zoom 2, 0x può essere ottenuto in due modi:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(predefinito),scaler.cropRegion = (500, 375, 1000, 750)
Per fare in modo che android.control.aeRegions
sia il quarto in alto a sinistra del campo visivo del mirino, imposta android.control.aeRegions
su (0, 0, 1000, 750)
e android.control.zoomRatio
impostato su 2.0
. In alternativa,
l'app può impostare android.control.aeRegions
sulla regione
equivalente di (500, 375, 1000, 750)
per
android.control.zoomRatio
di 1.0
.