Câmeras USB externas

A plataforma Android é compatível com o uso de câmeras USB plug-and-play (ou seja, webcams) usando a interface padrão API Android Camera2 e a câmera HAL interface gráfica do usuário. Geralmente, as webcams oferecem suporte Classe de vídeo USB (UVC) e no Linux, a versão padrão Video4Linux (V4L) é usado para controlar câmeras UVC.

Com suporte a 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 HALs da câmera em smartphones Android e não foi projetado para dar suporte a tarefas complexas e que exigem alto desempenho e streaming de alta velocidade, RA e controle manual de ISP/sensor/lente.

O processo HAL da câmera USB faz parte do provedor da câmera externa que detecta a disponibilidade do dispositivo USB e enumera os dispositivos de câmera externa de maneira adequada. O processo tem permissões e uma política de SE semelhante à processo HAL da câmera integrada. Apps de terceiros com webcam que se comunicam diretamente com dispositivos USB exigem as mesmas permissões de câmera para acessar a UVC e dispositivos móveis, assim como qualquer app de câmera comum.

Exemplos e origens

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

Implementação

A implementação precisa oferecer suporte à android.hardware.usb.host recurso do sistema.

O suporte ao kernel para dispositivos UVC também precisa estar ativado. Para ativar esse recurso, adicionando o seguinte aos respectivos arquivos defconfig do kernel.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Para ativar o provedor externo da câmera na versão do dispositivo correspondente, que adiciona as permissões SELinux necessárias, configuração de câmera externa e dependência do provedor de câmera externo, 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 da câmera externa ao manifesto da HAL do Treble 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 do Treble, atualize o 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;
    

Veja 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

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

Personalizações gerais

É possível personalizar o provedor externo da câmera modificando o external_camera_config.xml. Especificamente, os clientes podem personalizar parâmetros a seguir:

  • Exclusão de nós de vídeo de câmeras internas
  • Limite superior do tamanho da imagem e do frame rate compatíveis
  • Número de buffers em trânsito (instabilidade vs. compensação de memória)

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

Otimizações específicas para dispositivos

Também é possível melhorar o desempenho adicionando otimizações específicas do dispositivo.

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

Implementações genéricas usam CPU (libyuv/libjpeg), mas é possível substituí-lo por e 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 IMPLEMENTATION_DEFINED de vídeo
  • YUV12 para todos os outros buffers de IMPLEMENTATION_DEFINED

Para melhorar o desempenho, você pode substituir formatos de saída por formatos específicos formatos mais eficientes. Também é possível oferecer suporte a outros formatos em um implementação

Validação

Os dispositivos que oferecem suporte a câmeras externas precisam ser aprovados CTS da câmera. O USB externo a webcam deve permanecer conectada ao dispositivo específico durante toda a execução do teste, Caso contrário, alguns casos de teste vão falhar.