Zewnętrzne kamery USB

Platforma Android obsługuje korzystanie z kamer USB typu plug-and-play (czyli kamer internetowych) przy użyciu standardowego interfejsu API Android Camera2 i interfejsu HAL kamery. Kamery internetowe zazwyczaj obsługują sterowniki USB klasy wideo (UVC) , a w systemie Linux do sterowania kamerami UVC używany jest standardowy sterownik Video4Linux (V4L) .

Dzięki obsłudze kamer internetowych urządzeń można używać w prostych przypadkach, takich jak czaty wideo i kioski fotograficzne. Ta funkcja nie zastępuje typowych warstw HAL kamer wewnętrznych w telefonach z systemem Android i nie jest przeznaczona do obsługi wymagających dużej wydajności, złożonych zadań obejmujących przesyłanie strumieniowe w wysokiej rozdzielczości i z dużą szybkością, AR oraz ręczne sterowanie dostawcą usług internetowych/czujnikiem/obiektywem.

Proces HAL kamery USB jest częścią dostawcy kamery zewnętrznej, który nasłuchuje dostępności urządzenia USB i odpowiednio wylicza urządzenia kamery zewnętrznej. Proces ma uprawnienia i zasady SE podobne do procesu HAL wbudowanej kamery. Aplikacje kamer internetowych innych firm komunikujące się bezpośrednio z urządzeniami USB wymagają tych samych uprawnień aparatu, aby uzyskać dostęp do urządzeń UVC, jak w przypadku dowolnej zwykłej aplikacji aparatu.

Przykłady i źródła

Aby uzyskać więcej informacji na temat implementowania kamer USB, zobacz implementację referencyjną dostawcy kamer zewnętrznych w ExternalCameraProvider . Implementacje zewnętrznego urządzenia kamery i sesji są zawarte w ExternalCameraDevice i ExternalCameraDeviceSession . Począwszy od poziomu API 28, interfejs API klienta Java obejmuje poziom sprzętu EXTERNAL .

Realizacja

Implementacja musi obsługiwać funkcję systemową android.hardware.usb.host .

Musi być także włączona obsługa jądra dla urządzeń UVC. Możesz to włączyć, dodając poniższe elementy do odpowiednich plików defconfig jądra.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Aby włączyć dostawcę kamery zewnętrznej w odpowiedniej wersji urządzenia, co dodaje niezbędne uprawnienia SELinux, konfigurację kamery zewnętrznej i zależność od dostawcy kamery zewnętrznej, wykonaj następujące kroki:

  • Dodaj plik konfiguracyjny kamery zewnętrznej i bibliotekę kamery zewnętrznej do 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
    
  • Dodaj nazwę dostawcy kamery zewnętrznej do manifestu Treble HAL urządzenia.

    <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>
    
  • (Opcjonalnie) Jeśli urządzenie działa w trybie przekazywania tonów wysokich, zaktualizuj sepolicy , aby cameraserver mógł uzyskać dostęp do kamery 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;
    

Oto przykład pliku external_camera_config.xml (pominięto wiersze dotyczące praw autorskich).

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

Dostosowywanie

Możesz ulepszyć aparat Androida, korzystając z ogólnych opcji dostosowywania lub optymalizacji specyficznych dla urządzenia.

Ogólne dostosowania

Dostawcę kamery zewnętrznej można dostosować, modyfikując plik external_camera_config.xml . W szczególności klienci mogą dostosować następujące parametry:

  • Z wyłączeniem węzłów wideo kamer wewnętrznych
  • Obsługiwany rozmiar obrazu i górna granica liczby klatek na sekundę
  • Liczba buforów w trakcie lotu (kompromis między Jankiem a pamięcią)

Oprócz tych parametrów możesz dodać własne parametry lub opracować własne konfiguracje.

Optymalizacje specyficzne dla urządzenia

Możesz także poprawić wydajność, dodając optymalizacje specyficzne dla urządzenia.

Kopiowanie/skalowanie bufora i dekodowanie/kodowanie JPEG

Implementacje ogólne wykorzystują procesor (libyuv/libjpeg), ale można go zastąpić optymalizacjami specyficznymi dla urządzenia.

Format wyjściowy HAL

Implementacje ogólne wykorzystują następujące formaty wyjściowe:

  • YUV_420_888 dla buforów wideo IMPLEMENTATION_DEFINED
  • YUV12 dla wszystkich pozostałych buforów IMPLEMENTATION_DEFINED

Aby poprawić wydajność, możesz zastąpić formaty wyjściowe wydajnymi formatami specyficznymi dla urządzenia. Możesz także obsługiwać dodatkowe formaty w niestandardowej implementacji

Walidacja

Urządzenia obsługujące kamerę zewnętrzną muszą przejść CTS kamery . Zewnętrzna kamera internetowa USB musi pozostać podłączona do określonego urządzenia przez cały czas trwania testu, w przeciwnym razie niektóre przypadki testowe nie powiedzie się.