Supporto multicamera

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.

Supporto della modalità multicamera

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:

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 a getPhysicalCameraCharacteristics 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:

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 utilizza ANDROID_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 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 funziona insieme a ANDROID_CONTROL_ZOOM_RATIO, consulta camera3_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 e ANDROID_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.
  • 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.