Android 9 ha introdotto il supporto dell'API per i dispositivi con più fotocamere tramite un nuovo dispositivo fotocamera logico composto da due o più dispositivi fotocamera fisici rivolti nella stessa direzione. Il dispositivo della fotocamera logica viene exposto come un singolo CameraDevice/CaptureSession a un'app che consente l'interazione con le funzionalità multi-fotocamera integrate in HAL. Le app possono facoltativamente accedere e controllare gli stream, i metadati e i controlli sottostanti della videocamera fisica.
Figura 1. Supporto della modalità multicamera
In questo diagramma, gli ID delle diverse videocamere sono codificati a colori. L'app può trasmettere in streaming contemporaneamente i buffer non elaborati di ogni videocamera fisica. È inoltre possibile impostare controlli separati e ricevere metadati separati da diverse videocamere fisiche.
Esempi e fonti
I dispositivi multicamera devono essere pubblicizzati con la funzionalità multicamera logica.
I client della videocamera possono eseguire query sull'ID videocamera dei dispositivi fisici di cui è composta una determinata videocamera logica chiamando
getPhysicalCameraIds()
.
Gli ID restituiti nell'ambito del risultato vengono poi utilizzati per controllare singolarmente i dispositivi fisici tramite setPhysicalCameraId()
.
I risultati di queste singole richieste possono essere sottoposti a query dal risultato completo richiamando
getPhysicalCameraResults()
.
Le richieste di singole videocamere fisiche potrebbero supportare solo un sottoinsieme limitato di
parametri. Per ricevere un elenco dei parametri supportati, gli sviluppatori possono chiamare
getAvailablePhysicalCameraRequestKeys()
.
Gli stream delle videocamere fisiche sono supportati solo per le richieste di elaborazione non ripetuta e solo per i sensori monocromatici e Bayer.
Implementazione
Elenco di controllo dell'assistenza
Per aggiungere dispositivi multi-camera logici lato HAL:
- Aggiungi una funzionalità
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
per qualsiasi dispositivo di fotocamera logica supportato da due o più fotocamere fisiche esposte anche a un'app. - Compila il campo statico
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
dei metadati con un elenco di ID videocamere fisiche. - Compila i metadati statici relativi alla profondità necessari per stabilire una correlazione tra i pixel degli stream delle fotocamere fisiche:
ANDROID_LENS_POSE_ROTATION
,ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. Imposta il campo dei metadati
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
statico su:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: Per i sensori in modalità principale-principale, nessuna sincronizzazione dell'otturatore/dell'esposizione hardware.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: per i sensori in modalità principale-secondaria, sincronizzazione dell'otturatore/dell'esposizione hardware.
Compila
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
con un elenco dei parametri supportati per le singole videocamere fisiche. L'elenco può essere vuoto se il dispositivo logico non supporta le singole richieste.Se le richieste individuali sono supportate, elabora e applica la persona
physicalCameraSettings
che può arrivare come parte delle richieste di acquisizione e aggiungi la personaphysicalCameraMetadata
di conseguenza.Per le versioni del dispositivo HAL della fotocamera 3.5 (introdotta in Android 10) o successive, compila la chiave di risultato
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
utilizzando l'ID della fotocamera fisica attiva corrente che supporta la fotocamera logica.
Per i dispositivi con Android 9, le fotocamere devono supportare la sostituzione di uno stream logico YUV/RAW con stream fisici delle stesse dimensioni (non applicabile agli stream RAW) e dello stesso formato di due fotocamere fisiche. Questo non vale per i dispositivi con Android 10.
Per i dispositivi con Android 10 in cui la versione del dispositivo HAL della fotocamera è 3.5 o successiva, il dispositivo della fotocamera deve supportare isStreamCombinationSupported
per consentire alle app di verificare se è supportata una determinata combinazione di stream contenente stream fisici.
Mappa di configurazione dei flussi
Per una videocamera logica, le combinazioni di stream obbligatorie per il dispositivo della videocamera di un determinato livello hardware sono le stesse richieste in CameraDevice.createCaptureSession
.
Tutti gli stream nella mappa di configurazione degli stream devono essere stream logici.
Per un dispositivo fotocamera logico che supporta la funzionalità RAW con fotocamere secondarie fisiche di dimensioni diverse, se un'app configura uno stream RAW logico, il dispositivo fotocamera logico non deve passare a fotocamere secondarie fisiche con dimensioni del sensore diverse. In questo modo le app di acquisizione RAW esistenti non si interrompono.
Per sfruttare lo zoom ottico implementato da HAL passando da una fotocamera secondaria fisica all'altra durante l'acquisizione RAW, le app devono configurare gli stream delle fotocamere secondarie fisiche anziché uno stream RAW logico.
Combinazione di stream garantiti
Sia la videocamera logica sia le videocamere fisiche sottostanti devono garantire le combinazioni di stream obbligatorie richieste per i relativi livelli di dispositivo.
Un dispositivo videocamera logico deve funzionare come un dispositivo videocamera fisico in base al livello e alle funzionalità dell'hardware. È consigliabile che il suo insieme di funzionalità sia un superset di quello delle singole videocamere fisiche.
Sui dispositivi con Android 9, per ogni combinazione di stream garantita, la videocamera logica deve supportare:
Sostituendo un YUV_420_888 logico o lo stream RAW con due flussi fisici della stessa dimensione e dello stesso formato, ciascuno da una videocamera fisica separata, dato che dimensioni e formato sono supportati dalle fotocamere fisiche.
Aggiungendo due flussi non elaborati, uno da ciascuna videocamera fisica, se la fotocamera logica non pubblicizza la funzionalità RAW, ma le fotocamere fisiche sottostanti sì. Questo di solito si verifica quando le fotocamere fisiche hanno sensori di dimensioni diverse.
Utilizzo di stream fisici anziché uno stream logico delle stesse dimensioni e dello stesso formato. Ciò non deve rallentare la frequenza frame dell'acquisizione quando la durata minima del frame degli stream fisici e logici è la stessa.
Considerazioni sulle prestazioni e sulla potenza
Rendimento:
- La configurazione e lo streaming di stream fisici potrebbero rallentare la frequenza di acquisizione della videocamera logica a causa di vincoli delle risorse.
- L'applicazione delle impostazioni fisiche della videocamera potrebbe rallentare la frequenza di acquisizione se le videocamere sottostanti vengono impostate su frequenze fotogrammi diverse.
Alimentazione:
- L'ottimizzazione dell'alimentazione di HAL continua a funzionare per impostazione predefinita.
- La configurazione o la richiesta di stream fisici potrebbe ignorare l'ottimizzazione interna dell'alimentazione di HAL e comportare un maggiore utilizzo dell'alimentazione.
Personalizzazione
Puoi personalizzare l'implementazione del dispositivo nei seguenti modi.
- L'uscita fusa del dispositivo della videocamera logica dipende interamente dall'implementazione dell'HAL. La decisione su come vengono derivati gli stream logici uniti dalle fotocamere fisiche è trasparente per l'app e il framework della fotocamera Android.
- Facoltativamente, le richieste fisiche e i risultati possono essere supportati. Anche l'insieme di parametri disponibili in queste richieste dipende interamente dall'implementazione specifica dell'HAL.
- A partire da Android 10, l'HAL può ridurre il numero di
videocamere che possono essere aperte direttamente da un'app scegliendo di non
pubblicizzare alcuni o tutti gli ID_FISICI in
getCameraIdList
. La chiamata agetPhysicalCameraCharacteristics
deve quindi restituire le caratteristiche della videocamera fisica.
Convalida
I dispositivi con più videocamere logiche devono superare il CTS della videocamera come qualsiasi altra videocamera normale.
I casi di test che hanno come target questo tipo di dispositivo sono disponibili nel
modulo LogicalCameraDeviceTest
.
Questi tre test ITS hanno come target i sistemi multicamera per facilitare la corretta combinazione delle immagini:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
I test della scena 1 e della scena 4 vengono eseguiti con il
rig di test ITS-in-a-box. Il test test_multi_camera_match
verifica che la luminosità del centro delle immagini corrisponda quando entrambe le fotocamere sono attive. Il
test test_multi_camera_alignment
verifica che le distanze, gli orientamenti e i parametri di distorsione delle videocamere siano caricati correttamente. Se il sistema multicamera include una videocamera con un ampio FOV (> 90°), è necessaria la versione rev2 della scatola ITS.
Sensor_fusion
è un secondo banco di prova che consente movimenti ripetuti e prescritti dello smartphone e verifica la corrispondenza dei timestamp del giroscopio e del sensore di immagine e la sincronizzazione dei frame delle fotocamere multiple.
Tutte le confezioni sono disponibili tramite AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) e MYWAY Manufacturing (www.myway.tw, vendite@myway.tw). Inoltre, la cassetta ITS rev1 può essere acquistata tramite West-Mark (www.west-mark.com, dgoodman@west-mark.com).
Best practice
Per sfruttare appieno le funzionalità abilitate dalla multicamera mantenendo la compatibilità con le app, segui queste best practice quando implementi un dispositivo con più videocamere logiche:
- (Android 10 o versioni successive) Nascondere le videocamere secondarie fisiche da
getCameraIdList
. Ciò riduce il numero di videocamere che possono essere aperte direttamente dalle app, eliminando la necessità per le app di avere una logica di selezione della videocamera complessa. - (Android 11 o versioni successive) Per un dispositivo con più fotocamere logiche che supporta lo zoom ottico, implementa l'API
ANDROID_CONTROL_ZOOM_RATIO
e utilizzaANDROID_SCALER_CROP_REGION
solo per il ritaglio in base alle proporzioni.ANDROID_CONTROL_ZOOM_RATIO
consente al dispositivo di diminuire lo zoom e mantenere una maggiore precisione. In questo caso, l'HAL deve regolare il sistema di coordinate diANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
, eANDROID_STATISTICS_FACE_LANDMARKS
per trattare il campo visivo post-zoom come array attivo del sensore. Per ulteriori informazioni su comeANDROID_SCALER_CROP_REGION
funziona insieme aANDROID_CONTROL_ZOOM_RATIO
, consultacamera3_crop_reprocess#cropping
. - Per i dispositivi multicamera con fotocamere fisiche con funzionalità diverse, assicurati che il dispositivo pubblicizzi il supporto di un determinato valore o intervallo per un controllo solo se l'intero intervallo di zoom supporta il valore o l'intervallo. Ad esempio, se la fotocamera logica è composta da una fotocamera ultrawide, una grandangolare e una con teleobiettivo, procedi nel seguente modo:
- Se le dimensioni degli array attivi delle fotocamere fisiche sono diverse, il
HAL della fotocamera deve eseguire la mappatura dagli array attivi delle fotocamere fisiche all'array attivo della fotocamera logica per
ANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
eANDROID_STATISTICS_FACE_LANDMARKS
in modo che, dal punto di vista dell'app, il sistema di coordinate sia la dimensione dell'array attivo della fotocamera logica. - Se le fotocamere grandangolari e con teleobiettivo supportano la messa a fuoco automatica, ma la fotocamera ultrawide è a fuoco fisso, assicurati che la fotocamera logica promuova il supporto della messa a fuoco automatica. L'HAL deve simulare una macchina a stati di messa a fuoco automatica per la fotocamera ultrawide in modo che, quando l'app riduce lo zoom all'obiettivo ultrawide, il fatto che la fotocamera fisica sottostante sia a messa a fuoco fissa sia trasparente per l'app e le macchine a stati di messa a fuoco automatica per le modalità AF supportate funzionino come previsto.
- Se le fotocamere grandangolari e con teleobiettivo supportano 4K a 60 f/s e la fotocamera ultrawide supporta solo 4K a 30 f/s o 1080p a 60 f/s, ma non 4K a 60 f/s, assicurati che la fotocamera logica non pubblicizzi 4k a 60 f/s nelle configurazioni di stream supportate. In questo modo viene garantita l'integrità delle funzionalità logiche della fotocamera, assicurando che l'app non riscontri il problema di non raggiungere i 4K a 60 fps con un valore di
ANDROID_CONTROL_ZOOM_RATIO
inferiore a 1.
- Se le dimensioni degli array attivi delle fotocamere fisiche sono diverse, il
HAL della fotocamera deve eseguire la mappatura dagli array attivi delle fotocamere fisiche all'array attivo della fotocamera logica per
- A partire da Android 10, non è necessaria una multicamera logica per supportare combinazioni di stream che includono stream fisici.
Se l'HAL supporta una combinazione con stream fisici:
- (Android 11 o versioni successive) Per gestire meglio i casi d'uso come la profondità da stereo e il rilevamento dei movimenti, rendi il campo visivo delle uscite dello stream fisico il più ampio possibile in base alle capacità dell'hardware. Tuttavia, se uno stream fisico e uno stream logico provengono dalla stessa videocamera fisica, le limitazioni hardware potrebbero imporre che il campo visivo dello stream fisico sia uguale a quello dello stream logico.
- Per gestire la pressione sulla memoria causata da più stream fisici,
assicurati che le app utilizzino
discardFreeBuffers
per deallocare i buffer liberi (buffer rilasciati dal consumatore, ma non ancora rimossi dalla coda dal produttore) se si prevede che uno stream fisico rimanga inattivo per un determinato periodo di tempo. - Se in genere gli stream fisici di videocamere fisiche diverse non sono collegati alla stessa richiesta, assicurati che le app utilizzino
surface group
in modo da utilizzare una coda di buffer per supportare due piattaforme rivolte alle app, riducendo il consumo di memoria.