Videocamere USB esterne

La piattaforma Android supporta l'uso di videocamere USB plug-and-play (ovvero webcam) che utilizzano l'API Camera2 di Android standard e l'interfaccia HAL della videocamera. Le webcam in genere supportano i driver della classe video USB (UVC) e su Linux viene utilizzato il driver standard Video4Linux (V4L) per controllare le videocamere UVC.

Grazie al supporto delle webcam, i dispositivi possono essere utilizzati in casi d'uso leggeri come le videochiamate e i chioschi fotografici. Questa funzionalità non sostituisce i tipici HAL della fotocamera interna sugli smartphone Android e non è progettata per supportare attività complesse e ad alta intensità di prestazioni che richiedono streaming ad alta risoluzione e ad alta velocità, AR e controllo manuale di ISP/sensore/obiettivo.

Il processo HAL della videocamera USB fa parte del provider della videocamera esterna che monitora la disponibilità dei dispositivi USB ed esegue l'enumerazione dei dispositivi della videocamera esterna di conseguenza. Il processo ha autorizzazioni e un criterio SE simile al processo HAL della fotocamera integrata. Le app di webcam di terze parti che comunicano direttamente con i dispositivi USB richiedono le stesse autorizzazioni di accesso alla fotocamera per accedere ai dispositivi UVC di qualsiasi app di fotocamera normale.

Esempi e fonti

Per ulteriori informazioni su come implementare le videocamere USB, consulta l'implementazione di riferimento del fornitore di videocamere esterne all'indirizzo ExternalCameraProvider. Le implementazioni del dispositivo e della sessione della videocamera esterna sono incluse in ExternalCameraDevice e ExternalCameraDeviceSession. A partire dal livello API 28, l'API client Java include il livello hardware EXTERNAL.

Implementazione

L'implementazione deve supportare la funzionalità di sistema android.hardware.usb.host.

Inoltre, è necessario attivare il supporto del kernel per i dispositivi UVC. Per attivare questa opzione, aggiungere quanto segue ai rispettivi file defconfig del kernel.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Per attivare il fornitore di videocamere esterne nella rispettiva build del dispositivo, che aggiunge le autorizzazioni SELinux necessarie, la configurazione della videocamera esterna e la dipendenza dal fornitore di videocamere esterne, completa i seguenti passaggi:

  • Aggiungi il file di configurazione della videocamera esterna e la raccolta della videocamera esterna a device.mk.

    +PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service
    
    +PRODUCT_COPY_FILES += \
    +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
    
  • Aggiungi il nome del fornitore della videocamera esterna al manifest HAL Treble del dispositivo.

    <hal format="aidl">
        <name>android.hardware.camera.provider</name>
        <version>1</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>internal/0</instance>
    +       <instance>external/0</instance>
        </interface>
    </hal>
    
  • (Facoltativo) Se il dispositivo funziona in modalità di passthrough Treble, aggiorna sepolicy in modo che cameraserver possa accedere alla videocamera UVC.

    +# for external camera
    +allow cameraserver device:dir r_dir_perms;
    +allow cameraserver video_device:dir r_dir_perms;
    +allow cameraserver video_device:chr_file rw_file_perms;
    

Ecco un esempio di external_camera_config.xml (righe del copyright omesse).

<ExternalCamera>
    <Provider>
        <ignore> <!-- Internal video devices to be ignored by external camera HAL -->
            <id>0</id> <!-- No leading/trailing spaces -->
            <id>1</id>
        </ignore>
    </Provider>
    <!-- See ExternalCameraUtils.cpp for default values of Device configurations below -->
    <Device>
        <!-- Max JPEG buffer size in bytes-->
        <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) -->
        <!-- Size of v4l2 buffer queue when streaming >= 30fps -->
        <!-- Larger value: more request can be cached pipeline (less janky)  -->
        <!-- Smaller value: use less memory -->
        <NumVideoBuffers count="4"/>
        <!-- Size of v4l2 buffer queue when streaming < 30fps -->
        <NumStillBuffers count="2"/>

        <!-- List of maximum fps for various output sizes -->
        <!-- Any image size smaller than the size listed in Limit row will report
            fps (as minimum frame duration) up to the fpsBound value. -->
        <FpsList>
            <!-- width/height must be increasing, fpsBound must be decreasing-->
            <Limit width="640" height="480" fpsBound="30.0"/>
            <Limit width="1280" height="720" fpsBound="15.0"/>
            <Limit width="1920" height="1080" fpsBound="10.0"/>
            <!-- image size larger than the last entry will not be supported-->
        </FpsList>
    </Device>
</ExternalCamera>

Personalizzazione

Puoi migliorare la fotocamera Android tramite opzioni di personalizzazione generali o ottimizzazioni specifiche del dispositivo.

Personalizzazioni generali

Puoi personalizzare il provider della videocamera esterna modificando il file external_camera_config.xml. In particolare, i clienti possono personalizzare i seguenti parametri:

  • Esclusione dei nodi video delle videocamere interne
  • Dimensioni dell'immagine e frequenza fotogrammi supportate
  • Numero di buffer in fase di elaborazione (trade-off tra jank e memoria)

Oltre a questi parametri, puoi aggiungerne altri o sviluppare le tue configurazioni.

Ottimizzazioni specifiche per il dispositivo

Puoi anche migliorare il rendimento aggiungendo ottimizzazioni specifiche per dispositivo.

Copia/ridimensionamento del buffer e decodifica/codifica JPEG

Le implementazioni generiche utilizzano la CPU (libyuv/libjpeg), ma puoi sostituirla con ottimizzazioni specifiche per il dispositivo.

Formato di output HAL

Le implementazioni generiche utilizzano i seguenti formati di output:

  • YUV_420_888 per i video IMPLEMENTATION_DEFINED
  • YUV12 per tutti gli altri buffer IMPLEMENTATION_DEFINED

Per migliorare le prestazioni, puoi sostituire i formati di output con formati efficienti specifici per il dispositivo. Puoi anche supportare formati aggiuntivi in un'implementazione personalizzata

Convalida

I dispositivi con supporto della fotocamera esterna devono superare la CTS della fotocamera. La webcam USB esterna deve rimanere collegata al dispositivo specifico durante l'intera esecuzione del test, altrimenti alcuni casi di test non andranno a buon fine.