Внешние USB-камеры

<!-- Авторские права 2018 Android Open Source Project

Лицензировано Apache License, Version 2.0 («Лицензия»); вы не можете использовать этот файл, кроме как в соответствии с Лицензией. Вы можете получить копию Лицензии по адресу

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

Если применимое законодательство не требует иного или не согласовано в письменной форме, программное обеспечение, распространяемое по Лицензии, распространяется на условиях «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ, как явных, так и подразумеваемых. Конкретный язык, регулирующий разрешения и ограничения по Лицензии, см. в Лицензии. -->

Платформа Android поддерживает использование подключаемых USB-камер (то есть веб-камер) с использованием стандартного API Android Camera2 и интерфейса HAL камеры. Веб-камеры обычно поддерживают драйверы USB video class (UVC) , а в Linux для управления UVC-камерами используется стандартный драйвер Video4Linux (V4L) .

Благодаря поддержке веб-камер устройства можно использовать в легких сценариях использования, таких как видеочаты и фотокиоски. Эта функция не заменяет типичные внутренние HAL-камеры на телефонах Android и не предназначена для поддержки ресурсоемких, сложных задач, включающих потоковую передачу высокого разрешения и высокой скорости, дополненную реальность и ручное управление ISP/сенсором/объективом.

Процесс HAL USB-камеры является частью внешнего поставщика камеры, который прослушивает доступность USB-устройства и соответствующим образом перечисляет внешние устройства камеры. Процесс имеет разрешения и политику SE, аналогичную встроенному процессу HAL камеры. Сторонние приложения веб-камеры, которые напрямую взаимодействуют с USB-устройствами, требуют тех же разрешений камеры для доступа к устройствам UVC, что и любое обычное приложение камеры.

Примеры и источники

Для получения дополнительной информации о том, как реализовать USB-камеры, см. справочную реализацию внешнего поставщика камеры на ExternalCameraProvider . Реализации внешнего устройства камеры и сеанса включены в ExternalCameraDevice и ExternalCameraDeviceSession . Начиная с уровня API 28, клиентский API Java включает уровень оборудования EXTERNAL .

Выполнение

Реализация должна поддерживать системную функцию android.hardware.usb.host .

Также должна быть включена поддержка ядра для устройств UVC. Вы можете включить это, добавив следующее в соответствующие файлы defconfig ядра.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Чтобы включить поставщика внешней камеры в соответствующей сборке устройства, которая добавляет необходимые разрешения SELinux, конфигурацию внешней камеры и зависимость поставщика внешней камеры, выполните следующие действия:

  • Добавьте файл конфигурации внешней камеры и библиотеку внешней камеры в 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
    
  • Добавьте имя поставщика внешней камеры в манифест Treble HAL устройства.

    <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>
    
  • (Необязательно) Если устройство работает в режиме сквозной передачи высоких частот, обновите sepolicy , чтобы cameraserver мог получить доступ к камере 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;
    

Вот пример external_camera_config.xml (строки об авторских правах опущены).

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

Настройка

Вы можете улучшить камеру Android либо с помощью общих настроек, либо с помощью оптимизаций для конкретного устройства.

Общие настройки

Вы можете настроить поставщика внешней камеры, изменив файл external_camera_config.xml . В частности, клиенты могут настроить следующие параметры:

  • Исключая видеоузлы внутренних камер
  • Поддерживаемый размер изображения и верхняя граница частоты кадров
  • Количество буферов в полете (компромисс между задержками и памятью)

В дополнение к этим параметрам вы можете добавлять свои собственные параметры или разрабатывать собственные конфигурации.

Оптимизации для конкретных устройств

Вы также можете повысить производительность, добавив оптимизации для конкретных устройств.

Копирование/масштабирование буфера и декодирование/кодирование JPEG

Общие реализации используют ЦП (libyuv/libjpeg), но вы можете заменить его оптимизациями, специфичными для конкретного устройства.

Формат вывода HAL

Общие реализации используют следующие форматы вывода:

  • YUV_420_888 для видеобуферов IMPLEMENTATION_DEFINED
  • YUV12 для всех остальных буферов IMPLEMENTATION_DEFINED

Для повышения производительности вы можете заменить выходные форматы эффективными форматами, специфичными для устройства. Вы также можете поддерживать дополнительные форматы в индивидуальной реализации

Проверка

Устройства с поддержкой внешней камеры должны пройти CTS камеры . Внешняя USB-веб-камера должна оставаться подключенной к определенному устройству в течение всего тестового запуска, в противном случае некоторые тестовые случаи не будут пройдены.