Supporto multicamera

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

Supporto multicamera

Figura 1 . Supporto multicamera

In questo diagramma, diversi ID telecamera sono codificati a colori. L'app può trasmettere in streaming buffer grezzi da ciascuna fotocamera 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 capacità logica multicamera .

I client della telecamera possono interrogare l'ID telecamera dei dispositivi fisici di cui è composta una particolare telecamera logica chiamando getPhysicalCameraIds() . Gli ID restituiti come parte del risultato vengono quindi utilizzati per controllare i dispositivi fisici individualmente tramite setPhysicalCameraId() . I risultati di tali richieste individuali possono essere interrogati dal risultato completo invocando 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 le richieste di non rielaborazione e solo per i sensori monocromatici e bayer.

Implementazione

Lista di controllo del supporto

Per aggiungere dispositivi logici multicamera sul lato HAL:

Per i dispositivi che eseguono Android 9, i dispositivi con fotocamera devono supportare la sostituzione di un flusso logico YUV/RAW con flussi fisici della stessa dimensione (non si applica ai flussi RAW) e lo stesso formato da due fotocamere fisiche. Questo 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 interroghino se una particolare combinazione di stream contenente flussi fisici è supportata.

Mappa di configurazione del flusso

Per una telecamera logica, le combinazioni di flussi obbligatorie per il dispositivo telecamera 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 con fotocamera logica che supporta la funzionalità RAW con fotocamere secondarie fisiche di dimensioni diverse, se un'app configura un flusso RAW logico, il dispositivo con 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 secondari fisici anziché un flusso RAW logico.

Combinazione di streaming garantita

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

Un dispositivo con fotocamera logica dovrebbe funzionare allo stesso modo di un dispositivo con fotocamera fisica 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 ogni combinazione di streaming garantita, la fotocamera logica deve supportare:

  • Sostituzione di un flusso logico YUV_420_888 o non elaborato con due flussi fisici della stessa dimensione e formato, ciascuno da una fotocamera fisica separata, dato che le dimensioni e il formato sono supportati dalle fotocamere fisiche.

  • Aggiunta di due flussi non elaborati, uno da ciascuna fotocamera fisica, se la fotocamera logica non pubblicizza la funzionalità RAW, ma lo fanno le fotocamere fisiche sottostanti. Questo 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 può rallentare la velocità di acquisizione della telecamera logica a causa di vincoli di risorse.
    • L'applicazione delle impostazioni della fotocamera fisica può rallentare la velocità di acquisizione se le fotocamere sottostanti vengono impostate su frame rate diversi.
  • Potenza:

    • L'ottimizzazione della potenza di HAL continua a funzionare nel caso predefinito.
    • La configurazione o la richiesta di flussi fisici può sovrascrivere l'ottimizzazione energetica interna di HAL e comportare un maggiore consumo di energia.

Personalizzazione

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

  • L'uscita con fusibile del dispositivo della fotocamera logica dipende interamente dall'implementazione HAL. La decisione su come i flussi logici fusi vengono derivati ​​dalle fotocamere fisiche è trasparente per l'app e il framework della fotocamera Android.
  • Le singole richieste fisiche e i risultati possono essere supportati facoltativamente. Anche l'insieme dei parametri disponibili in tali richieste dipende interamente dall'implementazione HAL specifica.
  • Da Android 10, l'HAL può ridurre il numero di telecamere che possono essere aperte direttamente da un'app scegliendo di non pubblicizzare alcuni o tutti i PHYSICAL_ID in getCameraIdList . La chiamata getPhysicalCameraCharacteristics deve quindi restituire le caratteristiche della fotocamera fisica.

Convalida

I dispositivi logici multicamera devono superare il CTS della fotocamera come qualsiasi altra fotocamera normale. I casi di test destinati a questo tipo di dispositivo sono disponibili nel modulo LogicalCameraDeviceTest .

Questi tre test ITS mirano a sistemi multi-camera per facilitare la corretta fusione delle immagini:

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

Sensor_fusion è un secondo banco di prova che consente movimenti del telefono ripetuti e prescritti e afferma che i timestamp del giroscopio e del sensore di immagine corrispondono e che i frame 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 da 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 . Ciò riduce il numero di telecamere che possono essere aperte direttamente dalle app, eliminando la necessità che le app abbiano una logica di selezione della telecamera complessa.
  • (Android 11 o versioni successive) Per un dispositivo multicamera 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 ridurre lo zoom 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 l'array del sensore attivo. Per ulteriori informazioni su come ANDROID_SCALER_CROP_REGION interagisce con ANDROID_CONTROL_ZOOM_RATIO , vedere camera3_crop_reprocess#cropping .
  • Per i dispositivi multicamera con fotocamere fisiche con capacità 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, procedere 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 dalle app prospettiva, il sistema di coordinate è la dimensione dell'array attivo della telecamera logica.
    • Se le fotocamere grandangolari e teleobiettivo supportano l'autofocus, ma la fotocamera ultrawide è a fuoco fisso, assicurati che la fotocamera logica pubblicizzi il supporto dell'autofocus. 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 sia a fuoco fisso sia trasparente per l'app e le macchine a stati di messa a fuoco automatica per le modalità AF supportate lavorare come previsto.
    • Se la fotocamera grandangolare e il teleobiettivo supportano 4K @ 60 fps e la fotocamera ultrawide supporta solo 4K @ 30 fps o 1080p @ 60 fps, ma non 4K @ 60 fps, assicurati che la fotocamera logica non pubblicizzi 4K @ 60 fps in le sue configurazioni di flusso supportate. Ciò garantisce l'integrità delle capacità logiche della fotocamera, assicurando che l'app non si imbatta 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 multicamera logica per supportare combinazioni di flussi che includono flussi fisici. Se l'HAL supporta una combinazione con flussi fisici:
    • (Android 11 o versioni successive) Per gestire al meglio casi d'uso come la profondità da stereo e il rilevamento del movimento, rendere il campo visivo delle uscite del flusso fisico più ampio che può essere ottenuto dall'hardware. Tuttavia, se un flusso fisico e un flusso logico provengono dalla stessa telecamera fisica, le limitazioni hardware potrebbero costringere il campo visivo del flusso fisico a essere lo stesso del flusso logico.
    • Per far fronte alla pressione di memoria causata da più flussi fisici, assicurati che le app utilizzino discardFreeBuffers per deallocare i buffer liberi (rilasciati dal consumatore, ma non ancora rimossi dalla coda dal produttore) se si prevede che un flusso fisico sia inattivo per un periodo di tempo.
    • Se i flussi fisici di diverse fotocamere fisiche non sono in genere collegati alla stessa richiesta, assicurati che le app utilizzino il surface group in modo che una coda del buffer venga usata per supportare due superfici rivolte alle app, riducendo il consumo di memoria.