Supporto multi-camera

Android 9 ha introdotto il supporto API per dispositivi multi-camera attraverso un nuovo dispositivo fotocamera logico composto da due o più dispositivi fotocamera fisici che puntano nella stessa direzione. Il dispositivo fotocamera logico viene esposto come un singolo CameraDevice/CaptureSession a un'app che consente l'interazione con le funzionalità multi-camera integrate nell'HAL. Le app possono facoltativamente accedere e controllare i flussi, i metadati e i controlli fisici sottostanti della fotocamera.

Supporto multi-camera

Figura 1 . Supporto multi-camera

In questo diagramma, i diversi ID della telecamera sono codificati a colori. L'app può eseguire lo streaming di buffer grezzi da ciascuna telecamera fisica contemporaneamente. È anche possibile impostare controlli separati e ricevere metadati separati da diverse fotocamere fisiche.

Esempi e fonti

I dispositivi multicamera devono essere pubblicizzati con la funzionalità logica multicamera .

I client della fotocamera possono interrogare l'ID della fotocamera dei dispositivi fisici di cui è composta una particolare fotocamera logica chiamando getPhysicalCameraIds() . Gli ID restituiti come parte del risultato vengono quindi utilizzati per controllare individualmente i dispositivi fisici tramite setPhysicalCameraId() . I risultati di tali richieste individuali possono essere interrogati dal risultato completo richiamando getPhysicalCameraResults() .

Le richieste di singole telecamere fisiche possono supportare solo un sottoinsieme limitato di parametri. Per ricevere un elenco dei parametri supportati, gli sviluppatori possono chiamare getAvailablePhysicalCameraRequestKeys() .

I flussi di telecamere fisiche sono supportati solo per richieste di non rielaborazione e solo per sensori monocromatici e Bayer.

Implementazione

Lista di controllo del supporto

Per aggiungere dispositivi multicamera logici sul lato HAL:

Per i dispositivi con Android 9, i dispositivi fotocamera devono supportare la sostituzione di un flusso YUV/RAW logico con flussi fisici della stessa dimensione (non si applica ai flussi RAW) e dello stesso formato da due fotocamere fisiche. Ciò non si applica ai dispositivi con Android 10.

Per i dispositivi che eseguono Android 10 in cui la versione del dispositivo HAL della fotocamera è 3,5 o successiva, il dispositivo della fotocamera deve supportare isStreamCombinationSupported affinché le app possano interrogare se è supportata una particolare combinazione di flussi contenente flussi fisici.

Mappa di configurazione del flusso

Per una fotocamera logica, le combinazioni di flussi obbligatorie per il dispositivo fotocamera di un determinato livello hardware sono le stesse richieste in CameraDevice.createCaptureSession . Tutti i flussi nella mappa di configurazione del flusso devono essere flussi logici.

Per un dispositivo fotocamera logica che supporta funzionalità RAW con fotocamere secondarie fisiche di dimensioni diverse, se un'app configura un flusso RAW logico, il dispositivo fotocamera logica non deve passare a fotocamere secondarie fisiche con dimensioni del sensore diverse. Ciò garantisce che le app di acquisizione RAW esistenti non si interrompano.

Per sfruttare lo zoom ottico implementato da HAL passando da una fotocamera secondaria fisica durante l'acquisizione RAW, le app devono configurare flussi di fotocamera secondaria fisica anziché un flusso RAW logico.

Combinazione di streaming garantita

Sia la telecamera logica che le telecamere fisiche sottostanti devono garantire le combinazioni di flusso obbligatorie richieste per i relativi livelli di dispositivo.

Un dispositivo fotocamera logico dovrebbe funzionare allo stesso modo di un dispositivo fotocamera fisico in base al livello hardware e alle capacità. Si consiglia che il suo set di funzionalità sia un superset di quello delle singole fotocamere fisiche.

Sui dispositivi con Android 9, per ciascuna combinazione di streaming garantita, la fotocamera logica deve supportare:

  • Sostituzione di un flusso logico YUV_420_888 o raw con due flussi fisici della stessa dimensione e formato, ciascuno proveniente da una telecamera fisica separata, dato che la dimensione e il formato sono supportati dalle telecamere fisiche.

  • Aggiunta di due flussi RAW, uno da ciascuna telecamera fisica, se la telecamera logica non pubblicizza la funzionalità RAW, ma le telecamere fisiche sottostanti lo fanno. Ciò di solito si verifica quando le fotocamere fisiche hanno dimensioni del sensore diverse.

  • Utilizzo di flussi fisici al posto di un flusso logico della stessa dimensione e formato. Ciò non deve rallentare il frame rate dell'acquisizione quando la durata minima del frame dei flussi fisici e logici è la stessa.

Considerazioni su prestazioni e potenza

  • Prestazione:

    • La configurazione e lo streaming di flussi fisici potrebbero rallentare la velocità di acquisizione della telecamera logica a causa dei limiti delle risorse.
    • L'applicazione delle impostazioni fisiche della fotocamera potrebbe rallentare la velocità di acquisizione se le fotocamere sottostanti vengono impostate su frame rate diversi.
  • Energia:

    • L'ottimizzazione energetica di HAL continua a funzionare nel caso predefinito.
    • La configurazione o la richiesta di flussi fisici potrebbe ignorare l'ottimizzazione energetica interna dell'HAL e comportare un maggiore consumo di energia.

Personalizzazione

Puoi personalizzare l'implementazione del tuo dispositivo nei seguenti modi.

  • L'output fuso del dispositivo logico della fotocamera dipende interamente dall'implementazione dell'HAL. La decisione su come i flussi logici fusi derivano dalle fotocamere fisiche è trasparente per l'app e il framework della fotocamera Android.
  • Richieste e risultati fisici individuali possono essere opzionalmente supportati. Anche il set di parametri disponibili in tali richieste dipende interamente dall'implementazione HAL specifica.
  • A partire da Android 10, l'HAL può ridurre il numero di fotocamere che possono essere aperte direttamente da un'app scegliendo di non pubblicizzare alcuni o tutti i PHYSICAL_ID in getCameraIdList . La chiamata a getPhysicalCameraCharacteristics deve quindi restituire le caratteristiche della fotocamera fisica.

Validazione

I dispositivi logici multi-camera devono superare il CTS della fotocamera come qualsiasi altra normale fotocamera. I casi di test destinati a questo tipo di dispositivo possono essere trovati nel modulo LogicalCameraDeviceTest .

Questi tre test ITS sono mirati ai sistemi multi-camera per facilitare la corretta fusione delle immagini:

I test di scena 1 e scena 4 vengono eseguiti con il banco di prova ITS-in-a-box . Il test test_multi_camera_match asserisce che la luminosità del centro delle immagini corrisponde quando le due fotocamere sono entrambe abilitate. Il test test_multi_camera_alignment asserisce che la spaziatura, l'orientamento e i parametri di distorsione della fotocamera sono caricati correttamente. Se il sistema multicamera include una telecamera con FoV ampio (>90o), è necessaria la versione rev2 del box ITS.

Sensor_fusion è un secondo banco di prova che consente movimenti ripetuti e prescritti del telefono e afferma che i timestamp del giroscopio e del sensore di immagine corrispondono e che i fotogrammi multi-camera sono sincronizzati.

Tutte le scatole sono disponibili tramite AcuSpec, Inc. ( www.acuspecinc.com , fred@acuspecinc.com) e MYWAY Manufacturing ( www.myway.tw , sales@myway.tw). Inoltre, la scatola ITS rev1 può essere acquistata tramite West-Mark ( www.west-mark.com , dgoodman@west-mark.com).

Migliori pratiche

Per sfruttare appieno le funzionalità abilitate dalla multicamera mantenendo la compatibilità dell'app, segui queste best practice quando implementi un dispositivo multicamera logico:

  • (Android 10 o versioni successive) Nascondi le telecamere secondarie fisiche da getCameraIdList . Ciò riduce il numero di fotocamere che possono essere aperte direttamente dalle app, eliminando la necessità che le app abbiano una complessa logica di selezione della fotocamera.
  • (Android 11 o versioni successive) Per un dispositivo multi-camera logico che supporta lo zoom ottico, implementare l'API ANDROID_CONTROL_ZOOM_RATIO e utilizzare ANDROID_SCALER_CROP_REGION solo per il ritaglio delle proporzioni. ANDROID_CONTROL_ZOOM_RATIO consente al dispositivo di eseguire lo zoom indietro e mantenere una migliore precisione. In questo caso, l'HAL deve regolare il sistema di coordinate di ANDROID_SCALER_CROP_REGION , ANDROID_CONTROL_AE_REGIONS , ANDROID_CONTROL_AWB_REGIONS , ANDROID_CONTROL_AF_REGIONS , ANDROID_STATISTICS_FACE_RECTANGLES e ANDROID_STATISTICS_FACE_LANDMARKS per trattare il campo visivo post-zoom come array attivo del sensore . Per ulteriori informazioni su come ANDROID_SCALER_CROP_REGION interagisce con ANDROID_CONTROL_ZOOM_RATIO , vedere camera3_crop_reprocess#cropping .
  • Per i dispositivi multi-camera con fotocamere fisiche con funzionalità diverse, assicurati che il dispositivo pubblicizzi il supporto per 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 teleobiettivo, procedi come segue:
    • Se le dimensioni dell'array attivo delle telecamere fisiche sono diverse, l'HAL della telecamera deve eseguire la mappatura dagli array attivi delle telecamere fisiche all'array attivo della telecamera logica per ANDROID_SCALER_CROP_REGION , ANDROID_CONTROL_AE_REGIONS , ANDROID_CONTROL_AWB_REGIONS , ANDROID_CONTROL_AF_REGIONS , ANDROID_STATISTICS_FACE_RECTANGLES e ANDROID_STATISTICS_FACE_LANDMARKS in modo che dall'app prospettiva, il sistema di coordinate corrisponde alla dimensione dell'array attivo della telecamera logica.
    • Se le fotocamere grandangolari e teleobiettivi supportano la messa a fuoco automatica, ma la fotocamera ultrawide ha la messa a fuoco fissa, assicurati che la fotocamera logica pubblicizzi 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 esegue lo zoom indietro sull'obiettivo ultrawide, il fatto che la fotocamera fisica sottostante abbia la messa a fuoco fissa sia trasparente per l'app e le macchine a stati di messa a fuoco automatica per le modalità AF supportate funzionare come previsto.
    • Se le fotocamere grandangolare e teleobiettivo supportano 4K a 60 fps e la fotocamera ultrawide supporta solo 4K a 30 fps o 1080p a 60 fps, ma non 4K a 60 fps, assicurati che la fotocamera logica non pubblicizzi 4K a 60 fps in le sue configurazioni di flusso supportate. Ciò garantisce l'integrità delle funzionalità logiche della fotocamera, assicurando che l'app non incorrerà nel problema di non raggiungere 4k a 60 fps con un valore ANDROID_CONTROL_ZOOM_RATIO inferiore a 1.
  • A partire da Android 10, non è necessaria una multi-camera logica per supportare combinazioni di streaming che includano flussi fisici. Se l'HAL supporta una combinazione con flussi fisici:
    • (Android 11 o versioni successive) Per gestire meglio casi d'uso come la profondità dello stereo e il rilevamento del movimento, rendere il campo visivo degli output del flusso fisico il più ampio possibile per l'hardware. Tuttavia, se un flusso fisico e un flusso logico provengono dalla stessa telecamera fisica, le limitazioni hardware potrebbero forzare il campo visivo del flusso fisico a essere lo stesso del flusso logico.
    • Per affrontare la pressione della memoria causata da più flussi fisici, assicurati che le app discardFreeBuffers per deallocare i buffer liberi (buffer rilasciati dal consumatore, ma non ancora rimossi dalla coda dal produttore) se si prevede che un flusso fisico rimanga inattivo per un periodo di tempo.
    • Se i flussi fisici provenienti da fotocamere fisiche diverse non sono in genere collegati alla stessa richiesta, assicurati che le app utilizzino surface group in modo che una coda di buffer venga utilizzata per supportare due superfici rivolte alle app, riducendo il consumo di memoria.