Supporto della modalità multicamera

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

Supporto multicamera

Figura 1. Supporto multicamera

In questo diagramma, i diversi ID videocamera sono codificati a colori. L'app può trasmettere in streaming i buffer non elaborati di ogni videocamera fisica contemporaneamente. È anche possibile impostare controlli separati e ricevere metadati separati da diverse videocamere fisiche.

Esempi e fonti

I dispositivi multi-camera devono essere pubblicizzati con la funzionalità multi-camera 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 come parte del risultato vengono poi utilizzati per controllare i dispositivi fisici singolarmente tramite setPhysicalCameraId(). I risultati di queste singole richieste possono essere interrogati dal risultato completo richiamando getPhysicalCameraResults().

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

I flussi della videocamera fisica sono supportati solo per le richieste di non rielaborazione e solo per i sensori monocromatici e Bayer.

Implementazione

Elenco di controllo per l'assistenza

Per aggiungere dispositivi logici multi-camera sul lato HAL:

Per i dispositivi con Android 9, i dispositivi di ripresa devono supportare la sostituzione di uno stream YUV/RAW logico con stream fisici delle stesse dimensioni (non si applica agli stream RAW) e dello stesso formato di due videocamere fisiche. Questo non si applica ai dispositivi con Android 10.

Per i dispositivi con Android 10 in cui la versione del dispositivo HAL della fotocamera è 3.5 o superiore, il dispositivo fotocamera deve supportare isStreamCombinationSupported affinché le app possano verificare se è supportata una particolare combinazione di stream contenente stream fisici.

Mappa di configurazione dello stream

Per una videocamera logica, le combinazioni di stream obbligatorie per il dispositivo 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 smettono di funzionare.

Per sfruttare lo zoom ottico implementato da HAL passando da una sotto-fotocamera fisica all'altra durante l'acquisizione RAW, le app devono configurare gli stream delle sotto-fotocamere fisiche anziché uno stream RAW logico.

Combinazione di stream garantita

Sia la videocamera logica sia le videocamere fisiche sottostanti devono garantire le combinazioni di stream obbligatorie richieste per i livelli dei dispositivi.

Un dispositivo videocamera logica deve funzionare allo stesso modo di un dispositivo videocamera fisica in base al suo livello hardware e alle sue funzionalità. Ti consigliamo che il suo set di funzionalità sia un superset di quello delle singole videocamere fisiche.

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

  • Sostituzione di uno stream logico YUV_420_888 o raw con due stream fisici delle stesse dimensioni e dello stesso formato, ciascuno proveniente da una videocamera fisica separata, a condizione che le dimensioni e il formato siano supportati dalle videocamere fisiche.

  • Aggiunta di due stream non elaborati, uno per ogni videocamera fisica, se la videocamera logica non supporta la funzionalità RAW, ma le videocamere fisiche sottostanti sì. Ciò si verifica in genere quando le videocamere fisiche hanno sensori di dimensioni diverse.

  • Utilizzo di stream fisici al posto di uno stream logico delle stesse dimensioni e formato. Ciò non deve rallentare la frequenza fotogrammi dell'acquisizione quando la durata minima del frame dei flussi fisici e logici è la stessa.

Considerazioni su prestazioni e alimentazione

  • 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 della videocamera fisica potrebbe rallentare la velocità di acquisizione se le videocamere sottostanti vengono impostate su frequenze fotogrammi diverse.
  • Alimentazione:

    • L'ottimizzazione del consumo energetico di HAL continua a funzionare nel caso predefinito.
    • La configurazione o la richiesta di stream fisici può ignorare l'ottimizzazione interna dell'HAL e comportare un maggiore consumo energetico.

Personalizzazione

Puoi personalizzare l'implementazione del dispositivo nei seguenti modi.

  • L'output unito del dispositivo videocamera logica dipende interamente dall'implementazione HAL. La decisione su come vengono derivati gli stream logici uniti dalle videocamere fisiche è trasparente per l'app e il framework della videocamera Android.
  • Le richieste e i risultati fisici individuali possono essere supportati facoltativamente. Anche l'insieme dei parametri disponibili in queste richieste dipende interamente dall'implementazione HAL specifica.
  • 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 getPhysicalCameraCharacteristics deve quindi restituire le caratteristiche della videocamera fisica.

Convalida

I dispositivi logici multi-camera devono superare il CTS della fotocamera come qualsiasi altra fotocamera 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 multi-camera per facilitare la corretta fusione delle immagini:

I test delle scene 1 e 4 vengono eseguiti con il banco di prova ITS-in-a-box. Il test test_multi_camera_match verifica che la luminosità del centro delle immagini corrisponda quando entrambe le videocamere sono attive. Il test test_multi_camera_alignment verifica che la spaziatura, gli orientamenti e i parametri di distorsione della videocamera siano caricati correttamente. Se il sistema multicamera include una videocamera con campo visivo ampio (> 90°), è necessaria la versione 2 della scatola ITS.

Sensor_fusion è un secondo banco di prova che consente il movimento ripetuto e prescritto dello smartphone e verifica che i timestamp del giroscopio e del sensore di immagine corrispondano e che i frame delle multicamere siano 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).

Best practice

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

  • (Android 10 o versioni successive) Nascondi le videocamere secondarie fisiche da getCameraIdList. In questo modo si riduce il numero di videocamere che possono essere aperte direttamente dalle app, eliminando la necessità che le app dispongano di una complessa logica di selezione della videocamera.
  • (Android 11 o versioni successive) Per un dispositivo multi-camera logico che supporta lo zoom ottico, implementa l'API ANDROID_CONTROL_ZOOM_RATIO e utilizza ANDROID_SCALER_CROP_REGION solo per il ritaglio delle proporzioni. ANDROID_CONTROL_ZOOM_RATIO consente al dispositivo di diminuire lo zoom e mantenere una precisione migliore. 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 considerare il campo visivo post-zoom come l'array attivo del sensore. Per maggiori informazioni su come ANDROID_SCALER_CROP_REGION funziona con ANDROID_CONTROL_ZOOM_RATIO, consulta camera3_crop_reprocess#cropping.
  • Per i dispositivi con più videocamere 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, segui questi passaggi:
    • Se le dimensioni degli array attivi delle fotocamere fisiche sono diverse, l'HAL della fotocamera deve eseguire il mapping 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 grandangolare e teleobiettivo supportano la messa a fuoco automatica, ma la fotocamera ultrawide ha una 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 una 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 grandangolare e teleobiettivo supportano 4K a 60 fps e la fotocamera ultra grandangolare 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 nelle configurazioni di streaming supportate. Ciò garantisce l'integrità delle funzionalità della videocamera logica, assicurando che l'app non riscontri il problema di non raggiungere 4K a 60 fps a un valore di ANDROID_CONTROL_ZOOM_RATIO inferiore a 1.
  • A partire da Android 10, una multicamera logica non è necessaria 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à stereo e il rilevamento del movimento, rendi il campo visivo degli output del flusso fisico il più ampio possibile. Tuttavia, se uno stream fisico e uno stream logico provengono dalla stessa videocamera fisica, le limitazioni hardware potrebbero forzare il campo visivo dello stream fisico a essere uguale a quello dello stream logico.
    • Per risolvere il problema della pressione della memoria causata da più stream fisici, assicurati che le app utilizzino discardFreeBuffers per deallocare i buffer liberi (buffer rilasciati dal consumer, ma non ancora rimossi dalla coda dal produttore) se è previsto che uno stream fisico rimanga inattivo per un periodo di tempo.
    • Se i flussi fisici di diverse videocamere fisiche 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.