Câmeras USB externas

A plataforma Android suporta 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 suportam drivers de classe de vídeo USB (UVC) e 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 leves, como bate-papo com vídeo e quiosques de fotos. Esse recurso não substitui HALs típicos de câmera interna em telefones Android e não foi projetado para oferecer suporte a tarefas complexas e de alto desempenho, envolvendo streaming de alta resolução e alta velocidade, AR e controle manual de ISP/sensor/lente.

O processo HAL da câmera USB faz parte do provedor de câmera externa que monitora a disponibilidade do dispositivo USB e enumera os dispositivos de câmera externos de acordo. O processo tem permissões e uma política SE semelhante ao processo HAL da câmera integrada. Aplicativos 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 aplicativo de câmera normal.

Exemplos e fontes

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

Implementação

A implementação deve oferecer suporte ao recurso do sistema android.hardware.usb.host .

O suporte do kernel para dispositivos UVC também deve estar habilitado. Você pode habilitar isso adicionando o seguinte aos respectivos arquivos defconfig do kernel.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Para habilitar o provedor de câmera externa na respectiva construção do dispositivo, 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, conclua as seguintes etapas:

  • Adicione o arquivo de configuração da câmera externa e a biblioteca da 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 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 passagem 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;
    

Aqui está 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>

Costumização

Você pode aprimorar a câmera Android por meio de opções gerais de personalização ou otimizações específicas do dispositivo.

Personalizações gerais

Você pode 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 superior de tamanho de imagem e taxa de quadros suportados
  • Número de buffers em andamento (compensação de instabilidade versus memória)

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

Otimizações específicas do dispositivo

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

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

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

Formato de saída HAL

As 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 o desempenho, você pode substituir os formatos de saída por formatos eficientes específicos do dispositivo. Você também pode oferecer suporte a formatos adicionais em uma implementação personalizada

Validação

Dispositivos com suporte para câmera externa devem passar no CTS da câmera . A webcam USB externa deve permanecer conectada ao dispositivo específico durante toda a execução do teste, caso contrário, alguns casos de teste falharão.