Cámaras USB externas

<!-- 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. Puedes obtener una copia de la Licencia en

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

A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye "TAL CUAL", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. See the License for the specific language governing permissions and limitations under the License. -->

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

Con la compatibilidad con cámaras web, los dispositivos se pueden usar en casos de uso ligeros, como videochats y quioscos fotográficos. Esta función no reemplaza las HALs de cámara internas típicas en teléfonos Android y no está diseñada para admitir tareas complejas y que requieren un alto rendimiento, como la transmisión de alta resolución y alta velocidad, la RA y el control manual del ISP, el sensor o el objetivo.

El proceso de HAL de la cámara USB forma parte del proveedor de cámara externa que escucha la disponibilidad de dispositivos USB y enumera los dispositivos de cámara externa según corresponda. El proceso tiene permisos y una política de SE similares al proceso de HAL de cámara integrado. Las apps 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 app de cámara normal.

Ejemplos y fuentes

Para obtener más información sobre cómo implementar cámaras USB, consulta la implementación de referencia del proveedor de cámaras externas en ExternalCameraProvider. Las implementaciones de la sesión y el dispositivo de cámara externa 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 admitir la función del sistema android.hardware.usb.host.

También se debe habilitar la compatibilidad del kernel con los dispositivos UVC. Para habilitar esta opción, agrega lo siguiente a los archivos defconfig del kernel correspondiente.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

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

  • Agrega 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-V1-external-service
    
    +PRODUCT_COPY_FILES += \
    +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
    
  • Agrega el nombre del proveedor de la cámara externa al manifiesto de HAL de 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>
    
  • (Opcional) Si el dispositivo se ejecuta en el modo de transferencia de Treble, actualiza sepolicy para que cameraserver 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í tienes un ejemplo de external_camera_config.xml (se omitieron 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

Puedes mejorar la cámara de Android con opciones de personalización generales o con optimizaciones específicas del dispositivo.

Personalizaciones generales

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

  • Excluye los nodos de video de las cámaras internas
  • Límite superior de la velocidad de fotogramas y el tamaño de imagen admitidos
  • Cantidad de búferes en vuelo (compensación entre la latencia y la memoria)

Además de estos parámetros, puedes agregar tus propios parámetros o desarrollar tus propias configuraciones.

Optimizaciones específicas para dispositivos

También puedes mejorar el rendimiento agregando optimizaciones específicas para cada dispositivo.

Copia y ajuste de escala del búfer, y codificación y decodificación de JPEG

Las implementaciones genéricas usan la CPU (libyuv/libjpeg), pero puedes reemplazarlas por optimizaciones específicas del dispositivo.

Formato de salida del HAL

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

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

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

Validación

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