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 HIDL da câmera. 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 de uso leves, como bate-papo por vídeo e quiosques de fotos. Esse recurso não substitui as HALs de câmera internas típicas 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 escuta a disponibilidade do dispositivo USB e enumera os dispositivos de câmera externa 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 comum.

Exemplos e fontes

Para obter mais informações sobre como implementar câmeras USB, consulte uma implementação de referência de provedor de câmera externa em ExternalCameraProviderImpl_2_4 . O dispositivo de câmera externo 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 suportar o recurso do sistema android.hardware.usb.host .

O suporte de kernel para dispositivos UVC também deve ser ativado. Você pode habilitar isso adicionando o seguinte aos respectivos arquivos de deconfig do kernel.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Para habilitar o provedor de câmera externa na respectiva compilação do dispositivo, que adiciona as permissões SELinux necessárias, configuração de câmera externa e dependência de provedor de câmera externa, conclua as etapas a seguir:

  • Adicione o arquivo de configuração de câmera externa e a biblioteca de câmera 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
    
  • Adicione o nome do provedor de câmera externa ao manifesto Treble HAL do 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) Se o dispositivo for executado no modo de passagem Treble, atualize a sepolicy para que o servidor de 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 copyright 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 do 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
  • Tamanho de imagem compatível e limite superior da taxa de quadros
  • Número de buffers em voo (jank vs troca de 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/escalonamento de buffer e decodificação/codificação JPEG

As 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 pelo 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.