Cámaras USB Externas

La plataforma Android admite el uso de cámaras USB plug-and-play (es decir, cámaras web) que utilizan la API estándar de Android Camera2 y la interfaz HIDL de la cámara. Las cámaras web generalmente admiten controladores de clase de video USB (UVC) y en Linux, el controlador estándar Video4Linux (V4L) se usa para controlar las cámaras UVC.

Con soporte para cámaras web, los dispositivos se pueden usar en casos de uso liviano, como chats de video y quioscos de fotos. Esta característica no reemplaza las HAL típicas de la cámara interna en los teléfonos Android y no está diseñada para admitir tareas complejas y de alto rendimiento que involucran transmisión de alta resolución y alta velocidad, AR y control manual de ISP/sensor/lente.

El proceso HAL de la cámara USB es parte del proveedor de la cámara externa que escucha la disponibilidad del dispositivo USB y enumera los dispositivos de la cámara externa en consecuencia. El proceso tiene permisos y una política de SE similar al proceso HAL de la cámara integrada. Las aplicaciones de cámara web de terceros que se comunican directamente con dispositivos USB requieren los mismos permisos de cámara para acceder a dispositivos UVC que cualquier aplicación de cámara normal.

Ejemplos y fuentes

Para obtener más información sobre cómo implementar cámaras USB, consulte la implementación de referencia de un proveedor de cámara externo en ExternalCameraProviderImpl_2_4 . El dispositivo de cámara externa y las implementaciones de sesión se incluyen en ExternalCameraDevice y ExternalCameraDeviceSession . A partir del nivel de API 28, la API del cliente de Java incluye el nivel de hardware EXTERNAL .

Implementación

La implementación debe ser compatible con la característica del sistema android.hardware.usb.host .

También se debe habilitar la compatibilidad con el kernel para dispositivos UVC. Puede habilitar esto agregando lo siguiente a los respectivos archivos deconfig del kernel.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Para habilitar el proveedor de la cámara externa en la compilación del dispositivo respectivo, que agrega los permisos necesarios de SELinux, la configuración de la cámara externa y la dependencia del proveedor de la cámara externa, complete los siguientes pasos:

  • Agregue el archivo de configuración de la cámara externa y la biblioteca de la cámara externa a device.mk .

    +PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-impl
    +PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-external-service
    
    +PRODUCT_COPY_FILES += \
    +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
    
  • Agregue el nombre del proveedor de la cámara externa al manifiesto Treble HAL del dispositivo.

    <hal format="hidl">
       <name>android.hardware.camera.provider</name>
       <transport arch="32+64">passthrough</transport>
       <impl level="generic"></impl>
       <version>2.4</version>
       <interface>
           <name>ICameraProvider</name>
           <instance>legacy/0</instance>
    +       <instance>external/0</instance>
       </interface>
    </hal>
    
  • (Opcional) Si el dispositivo se ejecuta en el modo de transferencia de agudos, actualice sepolicy de seguridad para que el cameraserver la cámara pueda acceder a la cámara 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;
    

Aquí hay un ejemplo de external_camera_config.xml (se omiten las líneas de derechos de autor).

<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>

personalización

Puede mejorar la cámara de Android mediante opciones de personalización generales u optimizaciones específicas del dispositivo.

Personalizaciones generales

Puede personalizar el proveedor de la cámara externa modificando el archivo external_camera_config.xml . Específicamente, los clientes pueden personalizar los siguientes parámetros:

  • Excluyendo nodos de video de cámaras internas
  • Tamaño de imagen admitido y límite superior de velocidad de fotogramas
  • Número de búferes en vuelo (intercambio de bloqueo frente a memoria)

Además de estos parámetros, puede agregar sus propios parámetros o desarrollar sus propias configuraciones.

Optimizaciones específicas del dispositivo

También puede mejorar el rendimiento agregando optimizaciones específicas del dispositivo.

Copia/escalado de búfer y decodificación/codificación JPEG

Las implementaciones genéricas usan CPU (libyuv/libjpeg), pero puede reemplazar esto con optimizaciones específicas del dispositivo.

Formato de salida HAL

Las implementaciones genéricas utilizan los siguientes formatos de salida:

  • YUV_420_888 para video IMPLEMENTATION_DEFINED buffers
  • YUV12 para todos los demás búferes IMPLEMENTATION_DEFINED

Para mejorar el rendimiento, puede reemplazar los formatos de salida con formatos eficientes específicos del dispositivo. También puede admitir formatos adicionales en una implementación personalizada

Validación

Los dispositivos con soporte de cámara externa deben pasar la cámara CTS . La cámara web USB externa debe permanecer conectada al dispositivo específico durante toda la ejecución de la prueba; de lo contrario, algunos casos de prueba fallarán.