Stream di output
Il sottosistema della fotocamera funziona 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 molte destinazioni, ad esempio la GPU, il codificatore video, RenderScript o buffer visibili alle app (buffer RAW Bayer, YUV elaborati o codificati in JPEG).
Come ottimizzazione, questi stream di output devono essere configurati in anticipo e può esistere 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 vengono inviate richieste con più pipeline di output elencate o variabili, non si verifichino ritardi o latenza nell'evasione della richiesta.
Per ulteriori informazioni sulle combinazioni di output di streaming garantite
che dipendono dal livello hardware supportato, vedi
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. Si tratta di un'impostazione per richiesta, che può variare in base alla richiesta, fondamentale per implementare uno 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 sul sistema di coordinate dell'array di pixel attivi del sensore, con (0,0) come pixel in alto a sinistra dell'array di pixel attivi. Pertanto, la larghezza e l'altezza non possono essere maggiori delle dimensioni riportate nel campo di informazioni statiche ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. La larghezza e l'altezza minime consentite vengono segnalate 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 della regione 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 la regione di ritaglio deve soddisfare requisiti specifici (ad esempio, deve iniziare con coordinate pari e la sua larghezza/altezza deve essere pari), l'HAL deve eseguire l'arrotondamento necessario e scrivere la regione di ritaglio finale utilizzata nei metadati del risultato 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 fotografico e alla lunghezza focale dell'obiettivo.
Poiché la regione di ritaglio si applica a tutti gli stream, che potrebbero 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 pixel quadrati e le proporzioni ritagliando ulteriormente la regione di ritaglio definita. Se le proporzioni dello stream sono più ampie della regione di ritaglio, lo stream deve essere ritagliato ulteriormente in verticale. Se le proporzioni dello stream sono più strette della regione di ritaglio, lo stream deve essere ritagliato ulteriormente in orizzontale.
In tutti i casi, il ritaglio dello stream deve essere centrato all'interno dell'intera regione di ritaglio e ogni stream viene ritagliato solo orizzontalmente o verticalmente rispetto all'intera regione di ritaglio, mai in entrambi i modi.
Ad esempio, se sono definiti due stream, uno da 640 x 480 (proporzioni 4:3) e uno da 1280 x 720 (proporzioni 16:9), di seguito sono mostrate 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 di ritaglio: (500, 375, 1000, 750) (proporzioni 4:3)
Ritaglio stream 640x480: (500, 375, 1000, 750) (uguale alla regione di ritaglio)
Ritaglio stream 1280x720: (500, 469, 1000, 562)

Figura 1. Proporzioni di 4:3
Regione di ritaglio: (500, 375, 1333, 750) (proporzioni 16:9)
Ritaglio stream 640 x 480: (666, 375, 1000, 750)
Ritaglio stream 1280 x 720: (500, 375, 1333, 750) (uguale alla regione di ritaglio)

Figura 2. Proporzioni 16:9
Regione di ritaglio: (500, 375, 750, 750) (proporzioni 1:1)
Ritaglio stream 640 x 480: (500, 469, 750, 562)
Ritaglio stream 1280 x 720: (500, 543, 750, 414)

Figura 3. Proporzioni 1:1
E un ultimo esempio, un flusso con proporzioni quadrate 1024 x 1024 anziché il flusso 480p:
Regione di ritaglio: (500, 375, 1000, 750) (proporzioni 4:3)
Ritaglio del flusso 1024 x 1024: (625, 375, 750, 750)
Ritaglio del flusso 1280 x 720: (500, 469, 1000, 562)

Figura 4. Proporzioni 4:3, quadrato
Rielaborazione
Il supporto aggiuntivo per i file di immagini non elaborate è fornito dal supporto del ritrattamento dei dati RAW Bayer. Questo supporto consente alla pipeline della fotocamera di elaborare un buffer RAW e metadati acquisiti in precedenza (un intero frame 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é utilizzare
ANDROID_SCALER_CROP_REGION
per il ritaglio e lo zoom, un'app può utilizzare
ANDROID_CONTROL_ZOOM_RATIO
per controllare il livello di zoom e
ANDROID_SCALER_CROP_REGION
per il ritaglio orizzontale e verticale per
ottenere formati diversi da quelli del sensore della fotocamera nativo.
Un sistema multicamera può contenere più di un obiettivo con diverse
lunghezze focali e l'utente può utilizzare lo zoom ottico passando da un obiettivo all'altro.
L'utilizzo di ANDROID_CONTROL_ZOOM_RATIO
offre vantaggi negli scenari riportati di seguito:
- Zoom da un obiettivo grandangolare a un teleobiettivo: un rapporto in virgola mobile
offre una precisione migliore rispetto ai valori interi di
ANDROID_SCALER_CROP_REGION
. - Passaggio da un obiettivo grandangolare a un obiettivo ultrawide:
ANDROID_CONTROL_ZOOM_RATIO
supporta lo zoom indietro (<1.0f), mentreANDROID_SCALER_CROP_REGION
non lo supporta.
Rapporto di zoom: 2,0; 1/4 del campo visivo originale
Regione di ritaglio: (0, 0, 2000, 1500) (proporzioni 4:3)
Ritaglio dello stream 640x480: (0, 0, 2000, 1500) (uguale alla regione di ritaglio)
Ritaglio dello stream 1280x720: (0, 187, 2000, 1125)

Figura 5. Zoom 2.0, proporzioni 4:3
Rapporto di zoom: 2.0; 1/4 del campo visivo originale
Regione di ritaglio: (0, 187, 2000, 1125) (proporzioni 16:9)
Ritaglio dello stream 640 x 480: (250, 187, 1500, 1125) (pillarbox)
Ritaglio dello stream 1280 x 720: (0, 187, 2000, 1125) (uguale alla regione di ritaglio)

Figura 6. Zoom 2x, proporzioni 16:9
Rapporto di zoom: 0,5; 4x del campo visivo originale (passaggio dall'obiettivo grandangolare all'obiettivo ultrawide)
Regione di ritaglio: (250, 0, 1500, 1500) (proporzioni 1:1)
Ritaglio dello stream 640 x 480: (250, 187, 1500, 1125) (letterbox)
Ritaglio dello stream 1280 x 720: (250, 328, 1500, 844) (letterbox)

Figura 7. Zoom 0,5, proporzioni 1:1
Come si vede dai grafici precedenti, il sistema di coordinate della regione di ritaglio cambia nel 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, come intrinsicCalibration
e
lensShadingMap
.
Utilizzando lo stesso esempio ipotetico riportato sopra e supponendo che lo stream di output n.1 (640x480) sia lo stream del mirino, è possibile ottenere uno zoom 2x in due modi:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(predefinito),scaler.cropRegion = (500, 375, 1000, 750)
Affinché un'app imposti android.control.aeRegions
in modo che sia il quarto in alto a sinistra
del campo visivo del mirino, imposta
android.control.aeRegions
su (0, 0, 1000, 750)
con
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
.