Videocamere USB esterne

<!-- Copyright 2018 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. Una copia della Licenza è disponibile all'indirizzo

  http://www.apache.org/licenses/LICENSE-2.0

Se non diversamente imposto dalla legge vigente o concordato per iscritto, il software rilasciato ai sensi della Licenza viene distribuito "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o implicite. Consulta la Licenza per il testo specifico che disciplina le autorizzazioni e le limitazioni previste dalla Licenza. -->

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

Grazie al supporto delle webcam, i dispositivi possono essere utilizzati in casi d'uso leggeri, come le videochat e i chioschi fotografici. Questa funzionalità non sostituisce i tipici HAL della videocamera interna sugli smartphone Android e non è progettata per supportare attività complesse e ad alta intensità di prestazioni che coinvolgono 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 fornitore di videocamere esterne che ascolta la disponibilità dei dispositivi USB ed enumera di conseguenza i dispositivi con videocamere esterne. Il processo ha autorizzazioni e una policy SE simili al processo HAL della videocamera integrata. Le app per webcam di terze parti che comunicano direttamente con i dispositivi USB richiedono le stesse autorizzazioni per la videocamera per accedere ai dispositivi UVC come qualsiasi app per la videocamera 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 EXTERNAL livello hardware.

Implementazione

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

Deve essere abilitato anche il supporto del kernel per i dispositivi UVC. 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 di videocamere esterne nella build del dispositivo corrispondente, che aggiunge le autorizzazioni SELinux necessarie, la configurazione della videocamera esterna e la dipendenza del fornitore di videocamere esterne, completa i seguenti passaggi:

  • Aggiungi il file di configurazione della videocamera esterna e la libreria 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 di videocamere esterne 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 è in esecuzione in modalità 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 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 videocamera Android tramite opzioni di personalizzazione generali o ottimizzazioni specifiche per il dispositivo.

Personalizzazioni generali

Puoi personalizzare il fornitore di videocamere esterne modificando il file external_camera_config.xml. In particolare, i client possono personalizzare i seguenti parametri:

  • Esclusione dei nodi video delle videocamere interne
  • Limite superiore di dimensioni dell'immagine e frequenza fotogrammi supportati
  • Numero di buffer in volo (compromesso tra scatti e memoria)

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

Ottimizzazioni specifiche per il dispositivo

Puoi anche migliorare il rendimento aggiungendo ottimizzazioni specifiche per il 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 buffer IMPLEMENTATION_DEFINED video
  • YUV12 per tutti gli altri buffer IMPLEMENTATION_DEFINED

Per migliorare il rendimento, 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 per videocamere esterne devono superare il CTS della videocamera. 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.