Fotocamere USB esterne

La piattaforma Android supporta l'uso di fotocamere USB plug-and-play (ovvero webcam) utilizzando l' API Android Camera2 standard e l'interfaccia HAL della fotocamera. Le webcam generalmente supportano i driver USB video class (UVC) e su Linux, il driver standard Video4Linux (V4L) viene utilizzato per controllare le fotocamere UVC.

Con il supporto per le webcam, i dispositivi possono essere utilizzati in casi d'uso leggeri come chat video e chioschi fotografici. Questa funzionalità non sostituisce i tipici HAL interni della fotocamera sui telefoni Android e non è progettata per supportare attività complesse e ad alto utilizzo di prestazioni che coinvolgono streaming ad alta risoluzione e ad alta velocità, AR e controllo manuale ISP/sensore/obiettivo.

Il processo HAL della fotocamera USB fa parte del provider della fotocamera esterna che ascolta la disponibilità del dispositivo USB ed enumera di conseguenza i dispositivi della fotocamera esterna. Il processo dispone di autorizzazioni e una policy SE simili al processo HAL della fotocamera integrata. Le app per webcam di terze parti che comunicano direttamente con i dispositivi USB richiedono le stesse autorizzazioni della fotocamera per accedere ai dispositivi UVC di qualsiasi normale app per fotocamera.

Esempi e fonti

Per ulteriori informazioni su come implementare le fotocamere USB, vedere l'implementazione di riferimento del provider di fotocamere esterne in ExternalCameraProvider . Il dispositivo fotocamera esterno e le implementazioni della sessione sono inclusi in ExternalCameraDevice e ExternalCameraDeviceSession . A partire dal livello API 28, l'API del client Java include il livello hardware EXTERNAL .

Implementazione

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

Anche il supporto del kernel per i dispositivi UVC deve essere abilitato. Puoi abilitarlo aggiungendo quanto segue ai rispettivi file defconfig del kernel.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Per abilitare il fornitore della fotocamera esterna nella rispettiva build del dispositivo, che aggiunge le autorizzazioni SELinux necessarie, la configurazione della fotocamera esterna e la dipendenza dal fornitore della fotocamera esterna, completare i seguenti passaggi:

  • Aggiungi il file di configurazione della fotocamera esterna e la libreria della fotocamera 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 provider della fotocamera 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 viene eseguito in modalità passthrough Treble, aggiornare sepolicy in modo che cameraserver possa accedere alla fotocamera 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 di 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

È possibile personalizzare il provider della fotocamera esterna modificando il file external_camera_config.xml . Nello specifico, i clienti possono personalizzare i seguenti parametri:

  • Esclusi i nodi video delle telecamere interne
  • Dimensioni dell'immagine supportate e limite superiore della frequenza fotogrammi
  • Numero di buffer in volo (compromesso tra jank e memoria)

Oltre a questi parametri, puoi aggiungere i tuoi parametri o sviluppare le tue configurazioni.

Ottimizzazioni specifiche del dispositivo

Puoi anche migliorare le prestazioni aggiungendo ottimizzazioni specifiche del dispositivo.

Copia/ridimensionamento del buffer e decodifica/codifica JPEG

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

Formato di output HAL

Le implementazioni generiche utilizzano i seguenti formati di output:

  • YUV_420_888 per i buffer 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 del dispositivo. Puoi anche supportare formati aggiuntivi in ​​un'implementazione personalizzata

Validazione

I dispositivi con supporto per fotocamera esterna devono superare il CTS della fotocamera . La webcam USB esterna deve rimanere collegata al dispositivo specifico durante l'intero test, altrimenti alcuni casi di test falliranno.