Câmeras USB externas

<!-- Copyright 2018 The Android Open Source Project

Licenciado sob a Licença Apache, Versão 2.0 (a "Licença"). O uso deste arquivo só é permitido em conformidade com a Licença. Uma cópia da Licença está disponível em

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

A menos que exigido pela legislação aplicável ou acordado por escrito, o software fornecido de acordo com a Licença é distribuído "NO ESTADO EM QUE SE ENCONTRA", SEM GARANTIAS OU CONDIÇÕES DE QUALQUER TIPO, expressas ou implícitas. Consulte a Licença para ver informações sobre permissões e limitações para o idioma específico. -->

A plataforma Android é compatível com o uso de câmeras USB plug and play (ou seja, webcams) usando a API Android Camera2 padrão e a interface HAL da câmera. As webcams geralmente são compatíveis com drivers da classe de vídeo USB (UVC). No Linux, o driver padrão Video4Linux (V4L) é usado para controlar câmeras UVC.

Com suporte para webcams, os dispositivos podem ser usados em casos de uso leves, como chat por vídeo e quiosques de fotos. Esse recurso não substitui os HALs de câmera internos típicos em smartphones Android e não foi projetado para oferecer suporte a tarefas complexas e de alto desempenho que envolvem streaming de alta resolução e alta velocidade, RA e controle manual de ISP/sensor/lente.

O processo HAL da câmera USB faz parte do provedor de câmera externa que detecta a disponibilidade de dispositivos USB e enumera os dispositivos de câmera externa de acordo com isso. O processo tem permissões e uma política SE parecida com o processo de HAL da câmera integrado. Os apps de webcam de terceiros que se comunicam diretamente com dispositivos USB exigem as mesmas permissões de câmera para acessar dispositivos UVC que qualquer app de câmera comum.

Exemplos e origens

Para mais informações sobre como implementar câmeras USB, consulte a implementação de referência do provedor de câmera externa em ExternalCameraProvider. As implementações de sessão e dispositivo de câmera externa estão incluídas em ExternalCameraDevice e ExternalCameraDeviceSession. A partir do nível 28 da API, a API cliente Java inclui o nível de hardware EXTERNAL.

Implementação

A implementação precisa ser compatível com o recurso de sistema android.hardware.usb.host.

O suporte do kernel para dispositivos UVC também precisa estar ativado. Para ativar, adicione o seguinte aos arquivos defconfig do kernel correspondente.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Para ativar o provedor de câmera externa no build do dispositivo respectivo, que adiciona as permissões necessárias do SELinux, a configuração da câmera externa e a dependência do provedor de câmera externa, siga estas etapas:

  • Adicione o arquivo de configuração e a biblioteca de câmera 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
    
  • Adicione o nome do provedor de câmera externa ao manifesto do Treble HAL do 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) Se o dispositivo for executado no modo de transferência direta do Treble, atualize sepolicy para que cameraserver possa acessar a câmera 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;
    

Confira um exemplo de external_camera_config.xml (linhas de direitos autorais omitidas).

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

Personalização

É possível melhorar a câmera do Android com opções de personalização gerais ou otimizações específicas do dispositivo.

Personalizações gerais

É possível personalizar o provedor de câmera externa modificando o arquivo external_camera_config.xml. Especificamente, os clientes podem personalizar os seguintes parâmetros:

  • Excluindo nós de vídeo de câmeras internas
  • Limite máximo de tamanho de imagem e taxa de frames compatíveis
  • Número de buffers em voo (troca de jank x memória)

Além desses parâmetros, você pode adicionar os seus ou desenvolver suas próprias configurações.

Otimizações específicas do dispositivo

Você também pode melhorar a performance adicionando otimizações específicas do dispositivo.

Cópia/escalonamento de buffer e decodificação/codificação JPEG

Implementações genéricas usam a CPU (libyuv/libjpeg), mas você pode substituir isso por otimizações específicas do dispositivo.

Formato de saída da HAL

Implementações genéricas usam os seguintes formatos de saída:

  • YUV_420_888 para buffers de vídeo IMPLEMENTATION_DEFINED
  • YUV12 para todos os outros buffers IMPLEMENTATION_DEFINED

Para melhorar a performance, substitua os formatos de saída por formatos eficientes específicos do dispositivo. Você também pode oferecer suporte a outros formatos em uma implementação personalizada.

Validação

Os dispositivos com suporte a câmeras externas precisam passar no CTS de câmera. A webcam USB externa precisa ficar conectada ao dispositivo específico durante todo o teste. Caso contrário, alguns casos de teste vão falhar.