Streaming simultaneo della telecamera

Android consente ai dispositivi di supportare lo streaming simultaneo di dispositivi con fotocamera. Ad esempio, ciò consente a un dispositivo di far funzionare contemporaneamente sia la fotocamera anteriore che quella posteriore. A partire da Android 11, l'API Camera2 include i seguenti metodi che le app possono chiamare per determinare se le telecamere supportano lo streaming simultaneo e le configurazioni dello streaming supportate.

  • getConcurrentCameraIds : ottiene l'insieme di combinazioni di identificatori del dispositivo fotocamera attualmente connessi che supportano la configurazione simultanea delle sessioni del dispositivo fotocamera.
  • isConcurrentSessionConfigurationSupported : controlla se il set di dispositivi fotocamera fornito e le relative configurazioni di sessione corrispondenti possono essere configurati contemporaneamente.

Una serie di combinazioni di streaming obbligatorie che devono essere supportate durante lo streaming simultaneo sono incluse tramite le caratteristiche della fotocamera di un dispositivo fotocamera nella proprietà SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS .

Ogni dispositivo fotocamera pubblicizzato tramite getConcurrentStreamingCameraIds() deve supportare le seguenti configurazioni garantite per flussi simultanei.

Obiettivo 1 Obiettivo 2
Tipo Dimensione massima Tipo Dimensione massima Casi d'uso di esempio
YUV s1440p Elaborazione di video o immagini in-app
PRIV s1440p Analisi del mirino in-app
JPEG s1440p Nessuna acquisizione di immagini fisse dal mirino
YUV / PRIV s720p JPEG s1440p Immagini fisse standard
YUV / PRIV s720p YUV / PRIV s1440p Video in-app o elaborazione con anteprima

I dispositivi con funzionalità MONOCHROME ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES include CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ) che supportano Y8 devono supportare la sostituzione dei flussi YUV con Y8 in tutte le combinazioni di flussi garantite.

s720p si riferisce a 720p (1280 x 720) o alla risoluzione massima supportata per il formato particolare restituito da StreamConfigurationMap.getOutputSizes() . s1440p si riferisce a 1440p (1920 x 1440) o alla risoluzione massima supportata per il formato particolare restituito da StreamConfigurationMap.getOutputSizes() . I dispositivi le cui funzionalità non includono ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE devono supportare almeno un singolo flusso Y16, Dataspace::DEPTH con risoluzione sVGA, durante l'operazione simultanea, dove sVGA è la più piccola delle due seguenti risoluzioni:

  • risoluzione di output massima per il formato specificato
  • 640×480

Implementazione

Per consentire alle app di interrogare un dispositivo per determinare se le sue fotocamere supportano lo streaming simultaneo, implementa l'interfaccia HAL ICameraProvider@2.6 , che include i seguenti metodi:

Per un'implementazione di riferimento dell'interfaccia HAL ICameraProvider@2.6 , vedere la libreria HAL della fotocamera emulata in EmulatedCameraProviderHWLImpl.cpp .

Validazione

Per verificare che l'implementazione di questa funzionalità funzioni come previsto, utilizzare il test CTS ConcurrentCameraTest.java . Inoltre, prova utilizzando un'app che apre più fotocamere e le utilizza contemporaneamente.

Problemi di allocazione delle risorse

Se gli HAL delle fotocamere pubblicizzano il supporto per il funzionamento simultaneo dei dispositivi delle fotocamere, potrebbero incorrere in problemi di allocazione delle risorse, soprattutto nel caso in cui siano presenti risorse ISP (Image Signal Processor) sufficienti sul telefono per eseguire lo streaming simultaneo di entrambe le fotocamere anteriore e posteriore (o altre) , ma non alla loro piena capacità. In questo caso, l'HAL della fotocamera deve allocare risorse hardware limitate a ciascun dispositivo della fotocamera.

Scenario di esempio

Lo scenario seguente illustra questo problema.

Problema

Il dispositivo ha la seguente configurazione:

  • Camera ID 0 è una fotocamera logica supportata da una fotocamera grandangolare e ultrawide, ciascuna delle quali accetta una risorsa ISP.
  • La telecamera ID 1 è una telecamera che accetta una risorsa ISP.

Il dispositivo (telefono) ha due ISP. Se viene aperto l'ID della fotocamera 0 e viene configurata una sessione, è possibile che l'HAL della fotocamera riservi due ISP anticipando l'utilizzo della fotocamera sia ultrawide che wide.

In tal caso, la fotocamera anteriore (ID 1 ) non può configurare alcun flusso perché entrambi gli ISP sono in uso.

Soluzione

Per risolvere questo problema, il framework può aprire entrambi gli ID telecamera 0 e 1 prima di configurare le sessioni per fornire un suggerimento all'HAL della telecamera su come allocare le risorse (perché ora si aspetta il funzionamento simultaneo delle telecamere). Tuttavia, ciò può portare a funzionalità limitate, ad esempio lo zoom potrebbe non essere in grado di gestire l'intero rapporto di zoom (perché il cambio degli ID fisici della fotocamera potrebbe essere problematico).

Per implementare questa soluzione, apportare i seguenti aggiornamenti a provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds .

  • Imporre che per il funzionamento simultaneo delle telecamere, il framework della fotocamera debba aprire i dispositivi della fotocamera ( @3.2::ICameraDevice::open ) prima di configurare qualsiasi sessione sui dispositivi della fotocamera. Ciò consente ai fornitori di telecamere di allocare le risorse di conseguenza.

  • Per risolvere il problema di non essere in grado di gestire l'intero rapporto di portata dello zoom, assicurati che le app della fotocamera, quando si utilizzano le fotocamere contemporaneamente, utilizzino l'impostazione di controllo ZOOM_RATIO solo tra 1x e MAX_DIGITAL_ZOOM invece del ZOOM_RATIO_RANGE completo (questo impedisce il cambio di telecamere fisiche interne, che potenzialmente richiedono più ISP).

Problema con testDualCameraPreview

Quando si apportano gli aggiornamenti di cui sopra, è possibile che si crei un problema con un comportamento consentito dal test MultiViewTest.java#testDualCameraPreview .

Il test testDualCameraPreview non configura le sessioni solo dopo aver aperto tutte le telecamere. Segue questa sequenza:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

Tuttavia, tollera gli errori di apertura della fotocamera con ERROR_MAX_CAMERAS_IN_USE [1] . Le app di terze parti potrebbero dipendere da questo comportamento.

Poiché l'HAL della telecamera non conosce il set completo di ID della telecamera aperti per operazioni simultanee prima di configurare le sessioni, potrebbe essere difficile allocare le risorse hardware (supponendo che ci sia concorrenza per loro).

Per risolvere questo problema, mantenendo la compatibilità con le versioni precedenti oltre a supportare lo streaming simultaneo, gli HAL delle telecamere dovrebbero non superare le chiamate openCamera con ERROR_MAX_CAMERAS_IN_USE se non possono supportare la configurazione del flusso completo per tutte le telecamere in esecuzione contemporaneamente.